package com.javase.map.hashmap;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 关于HashMap:
* 1.HashMap集合的底层是哈希表/散列表的数据结构。
* 2.哈希表是数组和单向链表的结合体,充分发挥了它们各自的优点。
* 3.HashMap集合底层源代码:
* public class HashMap{
* Node<K,V>[] table;//说明底层是一个一维数组
* //静态内部类HashMap.Node
* static class Node<K,V>{
* final int hash;//哈希值:是key的hashCode()方法执行的结果
* final K key;//存储到Map集合中的那个key。
* V value;//存储到Map集合中的那个value
* Node<K,V> next;//下一个节点的内存地址。
* }
* }
* 哈希表/散列表:就是一维数组,在这个一维数组中每一个元素都是一个单向链表(数组和链表的结合体)
* 4.最主要需要掌握的是:
* map.put(k,v);
* v = map.get(k);
* 以上两个方法的实现原理,是必须掌握的。(哈希表的数据结构和put和get执行原理见下图)
* 5.HashMap集合的key部分特点:
* 无序不可重复
* 为什么无序?因为元素不一定放到哪个单向链表上。
* 不可重复是如何保证的? equals()方法保证HashMap集合的key不可重复。如果key重复了,value会覆盖。
*
* 放到HashSet集合中的元素实际上是放到了HashMap集合的key部分了,
* 所有HashSet和HashMap集合中的元素都需要重写hashCode()和equals()方法
* 6.假设将所有的hashCode()方法返回值固定为某个值,哈希表会变成单向链表,这种情况我们称为:散列分布不均匀。
* 假设将所有的hashCode()方法返回值都设定为不一样的值,哈希表会变成一维数组,就没有了链表的概念。也叫散列分布不均匀。
*
* 若要散列分布均匀需要你重写hashCode()方法时有一定的技巧。
*
* 7.重点:HashSet集合中的元素和放到HashMap集合中key部分的元素需要同时重写hashCode()和equals()方法.
* 8.HashMap集合的默认初始化容量是16,默认加载因子是0.75.
* 意思是:当HashMap集合底层数组的容量达到75%的时候数组开始扩容。新容量是原容量的2倍。
*
* 需要记住:HashMap集合的初始化容量必须是2的倍数,这是官方推荐的,为了达到散列分布均匀,提高集合的存取效率。
*
* 有一个名词叫"哈希碰撞"意思是说:两个不相同的哈希值转换成的数组下标有可能相同。这种情况叫“哈希碰撞”
*
* 9.最终结论:放到HashSet与HashMap集合中的元素必须同时重写hashCode()与equals()方法。这两个方法不需要自己写,只需要利用
* IDEA工具自动同时生成即可。(无论你是否掌握哈希表是数据结构和原理,这一点必须记住)
*/
public class HashMapText {
public static void main(String[] args) {
// 测试HashMap集合中key部分元素的特点(无序不可重复)
// 创建集合
// 集合中key部分元素采用Integer类型,Integer类型中hashCode()和equals()方法都已经重写了。
Map<Integer,String> map = new HashMap();
// 向集合中添加元素
map.put(11,"张三");
map.put(55,"李四");
map.put(77,"王五");
map.put(66,"赵柳");
map.put(66,"小明");
// 查看集合中元素的个数
System.out.println(map.size());//4。key重复,value覆盖。因为有6666是重复的,所以对应的value被覆盖了
// 遍历集合
// 将Map集合转变成Set集合
Set<Map.Entry<Integer,String>> set = map.entrySet();
// 使用增强for来遍历集合
for (Map.Entry<Integer,String> node : set) {
System.out.println(node.getKey() + "=" + node.getValue());
}
}
}
/*
输出结果:
66=小明 取出顺序和存入顺序不同,叫无序;存放了两个"66",最后只保存了最后一个"66",前面的被后面的覆盖了这叫不可重复。
55=李四
11=张三
77=王五
*/
?????????????????????????????????????????哈希表的数据结构和put和get执行原理
|