Class | 初始大小 | 加载因子 | 扩容倍数 | 底层实现 | 是否线程安全 | 同步方式 | |
---|---|---|---|---|---|---|---|
ArrayList | 10 | 1 | 1.5倍+1 | Object数组 | 线程不安全 | ||
Vector | 10 | 1 | 2倍 | Object数组 | 线程安全 | synchronized | |
HashSet | 16 | 0.75f | 2倍 | HashMap | 线程不安全 | ||
HashMap | 16 | 0.75f | 2倍 | Map.Entry | 线程不安全 | ||
Hashtable | 11 | 0.75f | 2倍+1 | Hashtable.Entry数组 | 线程安全 | synchronized |
HashSet与TreeSet的比较
1.TreeSet 是二叉树实现的,Treeset中的数据是自动排好序的,不允许放入null值 。
2.HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束 。
3.HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例。
ArrayList与Vector的比较
1、Vector的方法都是同步的,是线程安全的,而ArrayList的方法不是,由于线程的同步必然要影响性能。因此,ArrayList的性能比Vector好。
2、当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样。ArrayList就有利于节约内存空间。
3、大多数情况不使用Vector,因为性能不好,但是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性。
4、Vector可以设置增长因子,而ArrayList不可以。
Arraylist与LinkedList的比较
1、ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
2、因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。
3、LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。
4、因为LinkedList要移动指针,所以查询操作性能比较低
HashMap和ConcurrentHashMap的区别
1、HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。
2、ConcurrentHashMap采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段segment,然后再在这个片段上面进行插入,而且这里还需要获取segment锁。
3、ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。
HashMap与LinkedHashMap的区别
- 相比于HashMap,linkedHashMap结构中还维护着一个双向链表,用于记录顺序。所以可以做到跟存入顺序一样取出元素。
- hashMap键只能允许为一条为空,value可以允许为多条为空,键唯一,但值可以多个。linkedHashMap键和值都不可以为空。