Iterable接口
- 定义了迭代集合的迭代方法
Collection接口
- 定义了集合添加的通用方法
List接口
- 元素被添加到集合中以后,取出的时候是按照放入顺序。
- List可以重复。
- 存在下标,可以直接依靠下标取值
ArrayList类
- 底层是一个Object数组。
- 初始容量为10
- 当数组容量不够是自动扩容为以前的1.5倍
- 数组最大容量为Integer.MAX_VALUE-8
- 线程不安全
可变数组的大小,对尾部成员的增加和删除支持较好。使用 ArrayList 创建的集合,允许对集合中的元素进行快速的随机访问(检索集合中特定索引位置的元素),向 ArrayList 中插入与删除元素的速度相对较慢
Vector类
- 底层是一个Object数组。
- 初始容量为10
- 当数组容量不够是自动扩容为以前的1倍
- 数组最大容量为Integer.MAX_VALUE-8
- 线程安全
LinkedList类
采用链表结构保存对象,便于向集合中插入或者删除元素。
检索集合中特定索引位置的元素,速度则相对较慢。
链表不需要连续的空间, 大小不确定
Set接口
- 插入无序
- 元素不能重复
- 底层均为Map集合实现
TreeSet类
- 同时实现了 Set 接口和 SortedSet 接口
- 默认升序排序。
HashSet 类
- 不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
- HashSet 不是同步的,如果多个线程同时访问或修改一个 HashSet,则必须通过代码来保证其同步。
- 集合元素值可以是 null。
- 底层基于HashMap
LinkedHashSet类
底层基于LinkedHashMap实现,通过LinkedHashMap中的方法实现了顺序存值
Map类
- 键值对的形式存放数据
- 定义了通用的方法
- 不可重复
HashMap类
- 底层实现:数组+链表或者红黑树
- 在1.8以后,当链表的节点数量大于或者等于8的时候且数组的容量大于64的时候,就会将链表转换为红黑树
- 初始容量为16:hash算法,保证哈希值平均分布,只有当为16的时候才可以最大程度的保证平均分布
- 线程不安全的
- 扩容2倍
//计算大于等于当前数值的 最小 二的整数次方 的整数 的方法
static final int tableSizeFor(int var0) {
//减一是为了防止出现二的整数幂时,没有把自身包含进范围
int var1 = var0 - 1;
var1 |= var1 >>> 1;
var1 |= var1 >>> 2;
var1 |= var1 >>> 4;
var1 |= var1 >>> 8;
var1 |= var1 >>> 16;
return var1 < 0 ? 1 : (var1 >= 1073741824 ? 1073741824 : var1 + 1);
//得到的结果是1,2,4,8.。。。
//对应就是2的整数幂:2^0,2^1,2^2,2^3……
}
例如:Map map = new HashMap(1000);
- 通过tableSizeFor计算出来初始容量为1024,
- 默认加载因子为0.75,
- 所以扩容阈值为 1024 * 0.75 = 768
- 所以存入第 769 个元素时进行扩容
LinkedHashMap类
- 可以顺序的输出用户所输入的数据
TreeMap类
- 底层实现:红黑树
- 继承了NavigableMap接口,NavigableMap接口继承了SortedMap接口,可支持一系列导航方法即导航操作
- 实现了Cloneable接口,可被克隆
- 自然排序
- 线程不安全的
- TreeMap不涉及扩容操作, 因为它使用树结构进行存储.
HashTable类
- 线程安全
- 底层实现:哈希表+链表
- 初始化,大小为11
- 扩容时,将容量变为原来的2倍加1