HashMap的3大要素:hash函数、数组、单向链表;
HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。
嵌套的Entry实例,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next。
capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。
loadFactor:负载因子,默认为 0.75。
//JDK8中HashMap的散列值算法
int hash(Object key){
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
// 其中 key.hashCode()调用的是key键值类型自带的哈希函数,返回int型散列值。
}
由于HashMap的存储主要依赖于hash值的计算,因此选用Integer、String这些类作为键会提高HashMap的效率。
根据散列值h可以确定该对象的保存位置(用来访问数组下标)h&(length-1)等价于h%length(但是&比%具有更高的效率),其中length为底层数组的长度,总是为2的n次方。
HashMap默认初始数组长度为16,负载因子初始0.75。
//Integer的hashcode()即为其值本身;
//String的hashcode()计算值为:{即s[0]*31^(n-1)+s[1]*31^(n-2)+..........+s[n-1]其中n为字符串长度
String str = "aszz";
char s[] = str.toCharArray();
int h = 0;
if(s.length>0){
for (int i = 0; i < s.length; i++) {
h = h * 31 + s[i];
}
}
return h;
}
Set<Map.Entry<K,V>> entrySet()条目集合
Map.Entry<K,V>是Map<K,V>的嵌套内部接口,表示集合的以<K,V>映射形式的元素条目
Set<k> keySet() 键集合
//对于Map<String,String> map=new HashMap<String,String>();的几种遍历方式:
//1.for each Map.entrySet
for(Map.Entry<String,String> entry:map.entrySet()){
entry.getKey();
entry.getValue();
}
//2.直接调用Map.entrySet的集合迭代器
Iterator<Map.Entry<String,String>> iterator=map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,String> entry=iterator.next();
entry.getKey();
entry.getValue();
}
//3.for each Map.keySet()在调用get()获取
for(String key :map.keySet()){
map.get(key );//通过key获取value
}
collection集合框架下两个接口List和Set。都具有:
判断功能
boolean contains(Object obj):判断集合中是否包含指定的元素
boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(只有包含指定集合中所有的元素才叫包含)
boolean isEmpty():判断集合是否为空(指集合的数据元素为空)
获取功能
Iterator iterator():迭代器,集合专有的遍历方式
把集合转换为数组
Object[] toArray():把集合转成数组,可以实现集合的遍历