Java容器
目录
常用容器:
Collection、Collections区别
- java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
- Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
List、Set、Map区别
比较 | List | Set | Map |
---|---|---|---|
继承接口 | Collection | Collection | |
实现类 | ArrayList、LinkedList、Vector | HashSet、LinkedHashSet、TreeSet | HashMap、HashTable、TreeMap |
元素 | 可重复 | 不可重复 | 键不可重复 |
顺序 | 有序 | 无序(实际上由hashcode决定)(LinkedHashSet是有序的) | 无序(LinkedHashMap是有序的) |
线程安全 | Vector线程安全 | HashTable线程安全 |
HashMap与HashTable
区别
- HashTable是同步的。HashMap是非同步的,效率上比HashTable高。
- HashMap允许空键空值,HashTable不允许
HashMap详解
结点:
- 每个node结点存储:定位数据索引位置的
hash值
、key
、value
、指向下一个结点的Node<key,value> next
数据结构:
- HashMap的底层是哈希表,HashMap是“链表散列”的数据结构,即数组和链表的结合体。jdk1.8以后,又加入了红黑树的数据结构。其中,数组部分称为“哈希桶”。
- 向HashMap中插入数据时,首先计算数据的 key 的hashcode,得到一个值,将该值右移十六位得到高十六位哈希值,再将其与原来低十六位值进行异或运算,得到一个新值。将新值与(table.length-1)进行与运算,得到待插入值的下标。然后查看HashMap该下标处,如果还没有值则直接插入新值,如果已经有值了就连接形成链表。
- 当链表中元素的个数达到8个,转化为红黑树形式进行存储,此时查询的时间复杂度由O(n)变为O(logn);当红黑树中元素下降为6时,又转化成链表。
重要参数:
- 负载因子 LoadFactor,默认值0.75
- 容纳键值对临界值 threshold = 数组长度*负载因子
- 默认容量,为16
- 最大容量
HashTable详解
- HashTable 底层由 HashMap 实现
- HashSet的值存放于HashMap的key上,此时HashMap的值统一为PRESENT
ArrayList、Vector区别
- Vector是同步的。ArrayList是非同步的,快于Vector。
- ArrayList更加通用
Array、ArrayList区别
- array 是本地的程序设计组件或者数据结构,ArrayList是一个来自Java集合类的类。实际上,ArrayList 的内部是由一个array实现的。
- Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
- Array是固定大小的,而ArrayList大小是可变的。
- Array没有提供ArrayList那么多功能,比如addAll、removeAll 和 iterator 等。
Queue中 poll() 和 remove() 的区别
poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,remove() 失败的时候会抛出异常。
线程安全的集合
- Vector:几乎在每个方法上都加了synchronized同步锁,效率较低,已经不建议使用
- HashTable:几乎在每个方法上都加了synchronized同步锁,效率较低,已经不建议使用
- Stack
- Enumeration:枚举,是迭代器的早期版本