hashMap类图
 {
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);
}
构造一个具有指定初始容量和默认加载因子 (0.75) 的空HashMap 。
参数:
initialCapacity - 初始容量。
抛出:
IllegalArgumentException – 如果初始容量为负。
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
构造一个与指定Map具有相同映射的新HashMap,HashMap是使用默认加载因子 (0.75) 和足以容纳指定Map中的映射的初始容量创建的。
参数:m - 其映射将放置在此的map
抛出:
NullPointerException – 如果指定的地图为空
public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
4.无参构造
构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空HashMap
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
官网对hashmap的解释:
- 这个类不保证顺序,也不保证随着时间的推移,顺序保持不变。(官网提示,原因待查)
- 该集合基本操作(get,put)时间性能与容量大小成正比,如果对集合迭代性能要求很高,则不要将初始容量设置太高,这个很重要。
- 两个影响其性能的参数:初始容量和负载因子。在设置其初始容量时,应考虑映射中的预期条目数及其负载因子,以尽量减少重新哈希操作的次数。
- 如果多个线程同时访问一个哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。如果未使用外部同步,则官方建议创建时使用Collections.synchronizedMap方法“包装”map(Map m = Collections.synchronizedMap(new HashMap(…));)。除了通过迭代器自己的remove方法之外,迭代器将抛出ConcurrentModificationException,但是该不保证绝对的异常抛出有效。
- 遍历的三种方式依据该三种方法
hashMap的数据结构,在bins数量小的时候他是hash表,当他壮大的时候就会变成树。
返回给定目标容量的 2 次方
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
hash :该方法主要是将Object转换成一个整型。 indexFor :该方法主要是将hash生成的整型转换成链表数组中的下标。
//h是hash值,length是容量
//返回值就是hash表的下标
static int indexFor(int h, int length) {
return h & (length-1);//相当于取模
}