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执行原理