详情参考:https://www.cnblogs.com/skywang12345/p/3323085.html#4269559
集合 | 底层数据结构 | 是否线程安全 | 其它 |
---|---|---|---|
ArrayList | Object数组 | 不安全 | 每次扩容1.5倍 |
LinkedList | 双向链表 | 不安全 | 随机访问的方式为,根据index和链表长度的一半来判断,是从前开始访问,还是从后开始访问。但是随机访问的时间复杂度还是O(n) |
Vevtor | Object数组 | 安全 | 每次扩容2倍,线程安全的实现方式为在每一个方法增加synchronized关键字,其余和ArrayList基本上没有区别。 |
Stack栈 | Object数组 | Stack继承了Vector类,所以底层实现也是数组。同时stack自身有push,peek,pop等方法。其中push没有加synchronized关键字,其余都加了。所以并不是完全的线程安全。 | |
hashMap | Map.Entry数组加链表 | 不安全 | 大小总为2的指数幂,当链表长度>=8且数组长度>=64的时候,对应数组节点的链表会转为红黑树。集合不会再new对象的时候初始化,而是再第一次put的时候初始化。 |
hashtable | Map.Entry数组加链表 | 线程安全 | 相对于hashMap来说相当于在所有的方法上加了synchronize关键字。 |
treeMap | Map.entry的红黑树 | 线程不安全 | 因为是有序的Map,所以在遍历以及查询的时候都会有相应的顺序或者倒序的方法。 |
hashSet | hashMap | 不安全 | hashset的值,都是存储在hashmap的key中,hashMap的值为new Object(); |
treeSet | treemap | 不安全 | treeset的值,都是存储在treemap的key中,treemap的值存储的是new Object(); |
hashMap和hashtable的不同
-
HashMap 继承于AbstractMap,Hashtable 继承于Dictionary.
-
Hashtable线程安全,hashMap线程不安全。
-
HashMap的key、value都可以为null。Hashtable的key、value都不可以为null。
-
HashMap只支持Iterator(迭代器)遍历。而Hashtable支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历。
-
HashMap只支持Iterator(迭代器)遍历。而Hashtable支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历。
-
HashMap添加元素时,是使用自定义的哈希算法。Hashtable没有自定义哈希算法,而直接采用的key的hashCode()。
Vector和ArrayList的不同
-
ArrayList 是线程不安全的,Vector是线程安全的
-
ArrayList 支持序列化,Vector不支持。
-
ArrayList每次扩容1.5倍,Vector每次扩容2倍。