集合框架整理及之间的区别
List接口
List | @since JDK1.0,List是一个有序的、可以重复、可以为null 的集合(有时候我们也叫它“序列”)。 |
ArrayList | @since 1.2,是基于数组实现的,是一个动态数组,查询效率高,增删效率低,线程不安全。 |
LinkedList | @since 1.2,底层用双向链表实现的存储。查询效率低,增删效率高,线程不安全。 |
Vector | @since JDK1.0,和ArrayList类的用法几乎一模一样。线程安全,效率低。(被ArrayList代替) |
Map 接口
Map | @since 1.2,以“键(key)-值(value) 对”的方式进行存储。“(key)键”不能重复(去重)。 |
HashMap | @since 1.2,采用哈希算法实现,是Map接口最常用的实现类。允许key-value为空,输出自动排列,“(key)键”不能重复,如果发生重复,新键值对会替换旧的键值对(去重)。HashMap线程不安全,查找、删除、修改效率高。 |
LinkedHashMap | @since 1.4,是 HashMap 集合的子集合,底层采用哈希表+链表结构。允许key-value为空,输出有序排列,key不能重复,,如果发生重复,新键值对会替换旧的键值对(去重)。 |
Hashtable | @since JDK1.0,继承于Dictionary类并实现。不允许key-value为空,输出自动排列(降序),“(key)键”不能重复,如果发生重复,新键值对会替换旧的键值对(去重)。Hashtable线程安全,查询速度快、Hashtable和HashMap用法几乎一模一样,底层都是采用哈希表接口,在很多情况下可以互用。 |
TreeMap | @since 1.2,红黑二叉树的典型实现。不允许key(键)为空,输出自动排列 |
- 使用TreeMap要点:
1、由于是二叉树,需要对元素做内部排序。所以要么实现Comparable接口,要么实现Comparator接口,否则会抛出java.lang.ClassCastException异常。
2、TreeMap的key不能为null,否则抛出java.lang.NullPointerException异常
Set 接口
HashSet | @since 1.2,是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。允许为空,输出有序排列,去重。 |
LinkedHashSet | @since 1.4,输出有序排列,不允许重复(去重),允许为空 |
TreeSet | @since 1.2,底层实际是用TreeMap实现的。不允许为空,输出自动排列、不允许重复(去重)。 |
- 使用TreeSet要点:
1、 由于是二叉树,需要对元素做内部排序。所以要么实现Comparable接口,要么实现Comparator接口,否则会抛出java.lang.ClassCastException异常。
2、 TreeSet中不能放入null元素,否则抛出java.lang.NullPointerException异常。
- 集合中的 key 不能重复,通过重写 hashCode() 与 equals()方法来保证键的唯一。
ArrayList和LinkedList区别
ArrayList | LinkedList |
---|---|
本质是一个数组,适合查找 | 本质是一个链表,适合插入,添加,删除 |
构造方法有一个int类型的参数,表示数组的长度 | 构造方法没有int类型的参数 |
遍历元素效率高,删除首部和中间元素效率低 | 删除首部和中间元素效率高,遍历元素效率低 |
ArrayList和LinkedList区别:(引入)https://www.cnblogs.com/yonyong/p/9323588.html
ArrayList和Vector区别
ArrayList | Vector |
---|---|
非线程安全的,性能好 | 方法都是同步的(Synchronized),线程安全的,性能差 |
初始容量为10,扩容机制,原始容量的1.5倍 | 初始容量为10,扩容机制,原始容量的2倍 |
第一次add方法被调用的时候指定容量 | 创建对象指定容量 |
@Since JDK1.2 | @Since JDK1.0 |
ArrayList和Vector区别:(引入)https://www.cnblogs.com/guweiwei/p/6632341.html
HashTable和HashMap区别
HashMap | HashTable |
---|---|
非线程安全 | 方法都是同步的(Synchronized),线程安全,速度慢 |
加载因子为0.75,默认容量16 | 加载因子为0.75,默认容量11 |
扩容增量:原容量的 1 倍 | 扩容增量:2*原数组长度+1 |
允许 key-value 为null | 不允许 key-value 为null |
@Since JDK1.2 | @Since JDK1.0 |
一般情况下,HashMap能够比Hashtable工作的更好、更快,主要得益于它的散列算法,以及没有同步。应用程序一般在更高的层面上实 现了保护机制,而不是依赖于这些底层数据结构的同步,因此,HashMap能够在大多应用中满足需要。推荐使用HashMap,如果需要同步,可以使用同 步工具类将其转换成支持同步的HashMap。
HashMap实现同步:Collections.synchronizedMap()
HashMap默认容量为何是16:16是2^4,可以提高查询效率,另外,32=16<<1。
length 的值为 2 的整数次幂,h & (length - 1)相当于对 length 取模。这样提高了效率也使得数据分布更加均匀。
为什么会更加均匀?
length的值为偶数,length - 1 为奇数,则二进制位的最后以为为1,这样保证了 h & (length - 1) 的二进制数最后一位可能为1,也可能为0。如果为length为奇数,那么就会浪费一半的空间。