MapList等集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MapList等集合相关的知识,希望对你有一定的参考价值。

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

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

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实现。


以上是关于MapList等集合的主要内容,如果未能解决你的问题,请参考以下文章

集合-HashMap

Redis基本操作

Java中的容器(集合)

如何在转换集合到映射期间计算集合中的相同单词

List集合基础增强底层源码分析

ListSet与Map集合