HashMap的理解(从Map讲起)
Map
1.没有重复的 key(一方面,key用set保存,所以key必须是唯一,无序的;另一方面,map的取值基本上是通过key来获取value,如果有两个相同的key,计算机将不知道到底获取哪个对应值;这时候有可能会问,那为什么我编程时候可以用put()方法传入两个key值相同的键值对?那是因为源码中,传入key值相同的键值对,将作为覆盖处理)
2.每个 key 只能对应一个 value, 多个 key 可以对应一个 value(这就是映射的概念,最经典的例子就是射箭,一排射手,一排箭靶,一个射手只能射中一个箭靶,而每个箭靶可能被不同射手射中。这里每个射手只有一根箭,不存在三箭齐发还都中靶这种骚操作。将射手和射中的靶子连线,这根线加射手加靶子就是一个映射)
3.key,value 都可以是任何引用类型(包括 null)的数据(只能是引用类型)
4.Map 取代了古老的 Dictionary 抽象类(知道就行,可以忽略)
HashMap
- 底层实现是 链表数组,JDK 8 后又加了 红黑树 实现了 Map 全部的方法 key 用 Set 存放,所以想做到 key
2.不允许重复,key 对应的类(一般是String)需要重写 hashCode 和 equals 方法 - 允许空键和空值(但空键只有一个,且放在第一位,知道就行)
- List item元素是无序的,而且顺序会不定时改变(每次扩容后,都会重新哈希,也就是key通过哈希函数计算后会得出与之前不同的哈希值,这就导致哈希表里的元素是没有顺序,会随时变化的,这是因为哈希函数与桶数组容量有关,每次结点到了临界值后,就会自动扩容,扩容后桶数组容量都会乘二,而key不变,那么哈希值一定会变)
4 插入、获取的时间复杂度基本是 O(1)(前提是有适当的哈希函数,让元素分布在均匀的位置) 遍历整个 Map
5 需要的时间与数组的长度成正比(因此初始化时 HashMap 的容量不宜太大) 两个关键因子:初始容量、加载因子HashMap不是同步,HashTable是同步的,但HashTable已经弃用,如果需要线程安全,可以用synchronizedMap,例如 Map m = Collections.synchronizedMap(new HashMap(…)); 方法
本文深入探讨HashMap的特性与底层实现,包括其如何确保key的唯一性,允许空键空值的限制,以及通过链表数组和红黑树实现高效的数据存储与检索。了解HashMap与HashTable的区别,掌握正确的使用方法。
1069

被折叠的 条评论
为什么被折叠?



