不要小瞧了Map接口,实现一个Map对象并不简单!
这篇文章我们不谈别的,就讲讲Map接口,以及Map集合的一个重要的概念,Map的元素的散列。
实现Map接口
如果我们想自己定义一个Map需要做什么呢?
第一步:首先这个类继承AbstractMap<K,V>
第二步:重写 put()方法和get()方法,来定义我们自己的放入元素和获取元素的逻辑
第三步:实现entrySet()抽象方法,AbstractMap
类的entrySet()方法是首先方法,需要子类来进行实现,而这个方法返回的类型是Map.Entry类型的set对象集合,深入Map接口的源码我们知道Map.Entry也是一个接口,每个实现Map接口的方法都需要实现Map.Entry接口来定义Map中元素的数据结构,比如HashMap中的Node就是实现Map.Entry接口的内部类,定义基本的节点。那么定义完Map.Entry接口的实现类之后,entrySet()方法中把Map.Entry接口的实现类放入Set集合中就可以了。
散列
散列的目的就是让元素更快的被找到。我们可以用数组来存储的元素,但元素的存储的依据并不是根据map的键信息的,因为数据有有一定的容量,而键没有。因此元素的存储是通过散列码来实现的,根据散列码确定元素放入数组哪个位置中,散列码的产生是通过散列函数来实现,hashCode()方法就是一个重要的散列函数。
在Map类的集合中,哈希码是一个重要的概念,也是散列码,它是通过hashCode()方法得到的。对于同一个对象,hashCode()方法返回的值是一致的,因此我们看两个对象是否为同一对象的时候,通过是通过哈希码来进行比较。
String类型的哈希码与String的内容有关,当两个String类型的内容相同的时候,String对象会指向同一个内存区域,它们的哈希码也就是一致的,这是和其他对象不同的地方。通过看String的hashCode()方法的源码我们就能证明这一点
String的hashCode()方法:
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
方法中hash值与value有关,而value是存放字符串的数组,因此哈希值的生成只与String的内容相关。
总结
这篇文章我们主要讲了要实现Map接口,我们需要做哪些工作,以及对于Map的散列,我们也进行了介绍,包括String的hashCode 的特点,那就是内容相同,哈希值就会相同。
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话: