Map接口
概述: map以键和值的形式存储数据,也叫哈希表、散列表,Map<K,V> K - 此映射所维护的键的类型,V - 映射值的类型。其中的键不能重复,值可以重复。
特点:
1、可以根据键取得对应的值。
2、键不允许重复,如果重复值会被覆盖。
3、存放的都是无序的数据。
4、 初始容量是16,默认加载因子是0.75(即长度达到16时就会扩容12)。
HashMap
HashMap底层是一个Entry数组(jdk1.8开始是Node<k,v>[] table数组),当存放数据时会根据hash算法计算数据的存放位置。算法:hash(key)%n,n就是数组的长度。
当计算的位置没有数据时,就直接存放,当计算的位置有数据时也就是发生hash冲突/hash碰撞时,采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入,如下图。
当链表的长度大于等于8时,链表的的形式就会转换为红黑树的形式;当红黑树长度达到6时,红黑树又转换为链表的形式。
键为啥不允许重复?
看下图源码。
HashMap在存放数据时会先验证hash值是否相同,然后在判断key是否相同,如果hash值一样且内容相同,则k就是和原来的一样。(HashSet底层就是使用HashMap,用HashMap的key来存放数据以保证它的值不会重复,HashSet在存放对象时,如果想值是相同的,则需要重写key[ 即对象 ]的hashCode()方法和equals()方法。)。
HashMap的两种遍历方式
//第一种,读者自己加类型
Iterator it = map.keySet().iterator();
while(it.hasNext()) {
System.out.println( map.get(it.next()) );
}
//第二种
Iterator<Entry<k,v>> it2 = map.entrySet().iterator();
while (it2.hasNext()) {
Entry i = it2.next();
System.out.println(i.getKey() + ":" + i.getValue());
}
或者
for(Map.Entry<k,v> i : map.entrySet()){
System.out.println(i.getKey() + ":" + i.getValue());
}
有错误的地方欢迎告知!!!!!!