Java集合类位于Java.util包中,是一个用来存放对象的容器。
可以发现上述所有的集合类,除Map之外,都实现了Iterator接口。
Iterator可用来遍历集合类,提供有hasNext(), next(), remove()三个方法;
其子接口ListIterator在此基础上增加了add(), previous(), hasPrevious()三个方法。
List(对付顺序的好帮手): 存储的元素是顺序的,可重复的;
Set(注重独一无二的性质): 存储的元素是无序的,不可重复的;
Map(用key来搜索的专家): 使用键值对(key-value)存储,key是无序的,不可重复的;value是无序的,可重复的。
1)底层数据结构
ArrayList底层使用的是Object数组;
LinkedList底层使用的是双向链表(JDK1.6之前是循环链表,1.7之后取消了循环链表)。
2)插入和删除是否受元素位置的影响
ArrayList会;
LinkedList不会。
3)内存占用空间
ArrayList空间浪费主要体现在List结尾会预留一定的容量空间;
LinkedList空间浪费体现在每个节点需要存后继和前驱。
4)是否支持快速随机访问
随机访问是指通过元素的序号快速获取元素对象(对应于get(int index)方法)
ArrayList支持;LinkedList不支持。
ArrayList是List的主要实现类,底层使用Object数组实现,是线程不安全的;
Vector是List的古老实现类,底层也使用Object数组实现,是线程安全的。
1)线程是否安全
HashMap线程不安全,想要线程安全的话使用ConcurrentHashMap;
HashTable线程安全,内部所有的方法基本都经过synchronized修饰。
2)效率高
HashMap效率高;
HashTable基本被淘汰,不要在代码中使用它。
3)null值
HashMap允许key和value为null值,key为null只能有一个,value为null可以有多个;
HashTable不允许有null值,否则会报异常。
4)初始容量和每次扩充容量大小的不同
HashMap初始容量为16 ,扩容变为原来的2倍 ,创建时如果给定容量初始值,容量会成为设置容量的2的幂次方; -- HashMap总是使用2的幂作为哈希表的大小
HashTable初始容量为11 ,扩容每次扩为2n+1,创建时如果给定容量初始值,给定为几就是几。
5)底层数据结构
Jdk1.8后HashMap扩容机制发生了较大变化,当链表长度大于阈值8(默认)时 ,先判断数组长度如果小于64先对数组进行扩容而不转换成红黑树,之后如果链表长度大于8则将链表转成红黑树;
HashTable没有这样的机制。
https://www.cnblogs.com/lixiansheng/p/11348050.html