集合框架整理

Posted lyang-a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合框架整理相关的知识,希望对你有一定的参考价值。

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为奇数,那么就会浪费一半的空间。

以上是关于集合框架整理的主要内容,如果未能解决你的问题,请参考以下文章

集合框架整理

Java集合框架基础知识整理

java集合框架

Java集合框架

Java集合框架

Java集合框架中的元素