java集合总结(基于jdk1.6)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_33625560/article/details/80654998

Map

Hashmap
底层由数组和单向链表实现,put的时候计算key的hashcode,找到数组的对应位置,然后通过单向链表entry来维护。内部类entry中通过next维护单向链表。
tip1:初始化hashmap的时候,根据需求初始化数组大小initialCapacity(默认16),loadFactor(默认0.75),即map可以put initialCapacity*loadFactor个不同的key,然后超过这个值就会执行resize 方法扩容从initialCapacity 到initialCapacity*2。

tip2:hashMap的遍历有 values、keyset、entryset三种形式,底层都是继承了hashIterator实现的遍历,局别再与keyset只是对entrySet中key的集合,而values是对entrySet中value的集合,所谓keySet会比entrySet多遍历一次map是因为获取到key之后还有在get一次。

TreeMap
有序map,底层由红合数算法实现

WeekHashMap
弱引用的map,map里的entry可能会被gc回收掉,不能控制,适用于缓存的场景

HashTable
和hashmap类似,但是方法中多了synchronized,不能有null的key,若需要线程安全推荐使用ConcurrentHashMap。

LinkedHashMap
和hashmap类似但是entry中多了before和after来维护插入的顺序(也可以是get的顺序),在使用遍历的时候可以选择是按照插入的顺序还是按照使用(get)的顺序来遍历。

ConcurrentHashMap
和HashMap类似,中间加了segment数组(可以理解为每一个seqment都是一个hashmap),本质上不会像hashtable这样无脑synchronized,而是使用分段所的方式(通过hashcode来区分不同类型的key,只对同类型的key进行同步),提升性能,理论上支持的并发数=segment数组的大小。

List

ArrayList
底层通过数组实现的,所以查找数据时很快,因为数组长度是固定的(默认是10),所以add,remove的时候需要对数组进行copy,具体使用System.arraycopy(…);
tip:add时数组长度会变成(原length*3)/2+1,也就是扩容了原来的一半,而删除时底层数组长度不变,只是把删除的元素放到数组的最后一位;list size– 具体代码 elementData[–size]=null;

LinkedList
底层由双向链表实现的,初始化另一个空的header Entry通过维护next和previous来维护链表,add remove很快 get set比arrayList慢(set的方法也涉及到get)

Vertor
带同步的ArrayList

Set

HashSet 底层通过hashmap的key来保存数据

TreeSet –> TreeMap

LinkedHashSet –>LinkedHashMap

tip:之前没太使用过set,听到的都是set是无序的,但是因为底层都是通过map来维护的所以应该是
hashmap/hashset 无序

LinkedHashMap/LinkedHashSet 插入顺序、获取顺序

treeSet/treeMap 有序

猜你喜欢

转载自blog.csdn.net/sinat_33625560/article/details/80654998