Map、List等集合

编程思想是相通的,只是实现方式有所不同。

       数据库中,我们常常用索引来找到具体某个值,当然会经常用联合索引。而在开发中,常常会有种情况下载

Map中放对应对象,而每个对象又包含集合,比如Map<Integer, School> schoolId2SchoolMap,每个School中又包含多个班级Map<Integer, Grade> gradeId2GradeMap。

 

需求:取某个学校的某个班级的详细信息?

以前:1)获取学校对象;2)获取班级信息

 

为何不多新建一个Map<GradeKey, Grade>呢,其中GradeKey类成员变量为schoolId和gradeId,重写hashCode()和equal()即可。eclipse有快捷键。

现在:1)直接从Map<GradeKey, Grade>获得。

 

再来看看Map、List、Set等集合的实现:

一、Map,以hashMap为例下载

1)初始化为长度16的数组,数组每个元素为一个链表对象。

2)当新建链表元素个数超过threshold,数组长度就扩展2倍。

3)当put时候,用if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 来判断是否(Object) key相等。

int threshold = (int)Math.min(capacity(16) * loadFactor(0.75f), MAXIMUM_CAPACITY(1 << 30) + 1);

 

二、List,以ArrayList为例下载

1)初始化为长度10的数组,数组每个元素为一个Object。

2)当新添加对象的坐标index大于数据长度,就扩展增加当前数组1/2的长度。

3)当add时候,已有对象的size++,超过数组长度就扩展,当调用set(int index, E element)方法时,传值大于新添加对象的坐标时会报错。

 

三、Set,以hashSet为例,

1)其实用一个HashMap成员变量来实现,所以特性和hashMap基本一致。

而其他Set实现类等也是如此,比如TreeSet用TreeMap实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值