谢玉龄吧 关注:1贴子:67
  • 1回复贴,共1

集合类的实现原理

只看楼主收藏回复

一、ArrayList
ArrayList可以看做实现List接口的数组,它的容量是自增长的,机制是重新申请一个新的数组,然后把旧的copy到新的数组里,因此ArrayList增长的代价非常高昂。
ArrayList是一个非同步的数组列表,如果多个线程同时操作同一个ArrayList,其中一个进行修改,可能会引起安全性问题,所以最好在ArrayList的外部代码加锁。
对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作
ArrayList可以存储null。
二、LinkedList
LinkedList是非同步实现List接口的双向链表,可以存入null。
底层是链表节点,每个节点都是一个Entry,Entry包含previous,element,next。
三、HashMap
HashMap是非同步实现Map接口的实现类,允许存入null值null键,但不保证映射的顺序。
HashMap底层是数组,每个数组项是一个链表,是一个散列结构。

HashMap进行数组扩容需要重新计算扩容后每个元素在数组中的位置,很耗性能。
使HashMap能同步,可以使用这句Map m = Collections.synchronizedMap(new HashMap());
四、HashTable
HashTable 是同步的不允许存储null值的HashMap。


1楼2018-03-13 16:09回复
    五、ConcurrentHashMap
    待了解,看起来很复杂....
    六、HashSet
    HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。
    对于HashSet中保存的对象,注意正确重写其equals和hashCode方法,以保证放入的对象的唯一性。
    七、LinkedHashMap
    LinkedHashMap继承于HashMap,底层使用双向链表和哈希表保存元素,可以使用null值null键的非同步实现。
    基本操作与HashMap一样,但是改entry对象不但保存了自己,还保存了before和after的引用,构成双向链表。
    八、LinkedHashSet
    LinkedHashSet继承于HashSet,基于LinkedHashMap实现,底层使用LinkedHashMap保存元素,是一个非同步的双向链表结构。
    九:Linked与List的存取顺序相同,HashMap与HashSet的存取顺序不一定相同。


    2楼2018-03-13 16:09
    回复