天天看点

容器(集合框架)

Collection 集合层次的根接口

List: 有序集合接口,允许值为空。

ArrayList:数组队列,相当于动态数组。查询效率较高,随机插入删除效率低

LinkedList:底层通过双向链表实现,每个节点维护三个成员变量(item,next,prev)

随机访问效率低,但时插入和删除的效率较高

Vector:矢量队列,也是由数组实现,且线程安全。

Stack : 栈,继承Vector ,先进后出

Set :无序集合接口,不允许值为空

HashSet:底层结构时Hash表,通过hashcode和equals来判断两个对象是否相同。

可以根据自己的需要重写元素的这两个方法来实现对象是否相同的判断

TreeSet:底层时二叉树的数据结构,可以将元素按照自然顺序排序。

可以根据自己的需要实现Comoaraable接口,也可以通过自定义比较器传给Treeset,按照自己的规则来排序。

Queue:队列

Dequeue: 双端队列

Map :Map是集合框架的一部分, 但Map不是集合

HashMap实现原理: 初始容量16 阈值0.75,2倍扩充 ,允许null存在

底层是一个entryset数组 。put元素时,通过key的hashcode和哈希算法来计算,找到哈希桶的位置来进行插入。如果哈希桶满了,就要re哈希将桶的大小调整为当前的2倍。线程不安全。

put -已存在:直接覆盖。碰撞: 当产生冲突时,以链表的形式存在哈希桶里,新来的元素默认插入到链表的头部。链表达到一定长度就会转换为红黑树

get - 若有冲突,通过key的equals去查找对应的entry

LinkedHashMap : JDK1.4出现,继承自HashMap,内部维护了一个双向循环链表,维护插入顺序,线程不安全。

HashTable:hashTable实现了synchronized一次锁住整个表,不允许null作为键值。

CocurrentHashMap : JDK1.5新增线程安全的Map集合,用来替代HashTable,

使用了分段锁来保证线程安全,一次只锁一个桶。默认16个桶,对数据进行操作时只锁住当前桶,实现了16个写线程同时执行。

继续阅读