首先介绍一下Collection接口和Map接口的继承体系:
- Collection接口:
2. Map接口:
①Set 和 Map 的关系
Map集合的所有Key具有set的特征。
若将Map的key-value对视作整体,则Map也可视作set
Map本质上是一个关联数组:key数组 + value数组,将一一对应的key和value绑定在一起就形成了Map
②HashSet 和 HashMap
HashSet:系统使用Hash算法决定元素的存储位置
HashMap: 系统将value当成key的附属物,根据Hash算法决定key的存储位置
当程序执行put方法时,系统将调用键名的hashCode方法得到其hashCode值,之后系统将根据该hashCode值决定该元素的存储位置。
创建HashMap时可传入初始capacity 和 load factor, initial capacity默认为16,load factor默认为0.75。HashMap中:
1. size变量保存了map中包含的key-value对的数量
2. threshold变量包含了HashMap能容纳的key-value对的极限,等于HashMap的容量乘以负载因子(load factor)
3. 当size++ >= threshold,HashMap会自动调用resize方法扩充HashMap的容量。每扩充一次HashMap的容量就增大一倍
4. 当创建一个HashMap时,系统会自动创建一个table数组来保存HashMap中的entry
// HashMap构造器:
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
Java集合实际上是多个引用变量所组成的集合,这些引用变量指向实际的Java对象
ArayList底层是基于数组实现的。每次创建ArrayList时传入的int参数是它所封装的数组长度。若创建时未传入参数,那么ArrayList的初始长度为0,底层封装的数组长度为10。