HashMap存放的时候如何判断key是否重复?
如果key是同一个对象,有相同的hashcode和且equals方法相等,那么认为key重复。
看代码了解hashmap
public class Client {
public static void main(String []args) {
HashMap map = new HashMap(10);
A a1 = new A(1,"ss");
A a2 = new A(1,"ss");
map.put(a1, "aaa");
map.put(a2, "bbb");
System.out.println(map.size());
}
}
class A {
int i;String s;
public A(int i, String s) {
this.i = i;
this.s = s;
}
}
返回结果:2
加了hashCode方法
public class Client {
public static void main(String []args) {
HashMap map = new HashMap(10);
A a1 = new A(1,"ss");
A a2 = new A(1,"ss");
map.put(a1, "aaa");
map.put(a2, "bbb");
System.out.println(map.size());
}
}
class A {
int i;
String s;
public A(int i, String s) {
this.i = i;
this.s = s;
}
public int hashCode() {
return i;
}
}
返回结果: 2
加上equals方法
public class Client {
public static void main(String []args) {
HashMap map = new HashMap(10);
A a1 = new A(1,"ss");
A a2 = new A(1,"ss");
map.put(a1, "aaa");
map.put(a2, "bbb");
System.out.println(map.size());
}
}
class A {
int i;String s;
public A(int i, String s) {
this.i = i;
this.s = s;
}
public int hashCode() {
return i;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final A other = (A) obj;
if (i != other.i)
return false;
if (s == null) {
if (other.s != null)
return false;
} else if (!s.equals(other.s))
return false;
return true;
}
}
返回结果: 1
说明当我们将一个类作为HashMap的key时,必须同时覆盖hashCode和equals方法。否则hashmap的处理结果可能不是我们预料的。至于为什么要这么做呢,我们看看hashmap的put方法就明白了
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
hashmap内部定义了一个Entry的数组,Entry是一个键值对,并有next成员变量指向它的下一个Entry
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
当我们想hashmap中put一组值的时候,hashmap根据key(也就是我们实现了hashcode和equals方法的类)的hashcode方法返回的值计算出数组的索引,然后根据索引取出表中的Entry,并遍历,判断Entry中的key是否equals当前要插入的key,如果返回true则覆盖以前的value。
如果2个不同类的对象,有相同的hashcode,并且equals返回true,那么hashmap也会认为他们相同。例子如下
public class Client {
public static void main(String []args) {
HashMap map = new HashMap(10);
A a1 = new A(1,"ss");
B a2 = new B(1,"ss");
map.put(a1, "aaa");
map.put(a2, "bbb");
System.out.println(map.size());
}
}
class A {
int i;
String s;
public A(int i, String s) {
this.i = i;
this.s = s;
}
public int hashCode() {
return i;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final A other = (A) obj;
if (i != other.i)
return false;
if (s == null) {
if (other.s != null)
return false;
} else if (!s.equals(other.s))
return false;
return true;
}
}
class B {
int i;
String s;
public B(int i, String s) {
this.i = i;
this.s = s;
}
public int hashCode() {
return i;
}
public boolean equals(Object obj) {
A a = (A)obj;
if(this.i == a.i)
return true;
return false;
}
}
返回结果: 1
分享到:
相关推荐
《马士兵老师HashMap学习笔记详解》 HashMap是Java编程语言中常用的一种数据结构,它提供了键值对(key-value pair)的存储功能,是基于哈希表实现的。马士兵老师的HashMap学习笔记深入剖析了这一核心组件的工作...
通过hash函数计算的结果与capacity-1进行且运算,得到buckets的index,若buckets[index]为空,则直接赋值,若不为空,首先查看首
在Java编程语言中,集合框架是开发者日常工作中不可或缺的一部分,HashMap作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...
Java集合专题总结:HashMap和HashTable源码学习和面试总结 本文总结了Java集合专题中的HashMap和HashTable,涵盖了它们的源码学习和面试总结。HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素...
本套学习资料全面涵盖了HashMap的深入解析,旨在帮助求职者掌握大厂面试中的核心知识点。 HashMap是基于哈希表实现的,其底层原理主要依赖于数组和链表。它提供了O(1)的平均时间复杂度进行插入、删除和查找操作。...
"学习笔记:三数组实现的HashMap"这篇博客文章可能讨论了一种非标准但有趣的HashMap实现,使用了三个数组来代替标准的哈希表结构。这里我们将深入探讨这种三数组实现HashMap的原理和可能的优势。 1. **基本概念**:...
通过分析源码,开发者可以深入理解哈希表的工作原理,学习如何在易语言中实现高效的数据结构,这对于提升程序性能和优化内存管理至关重要。同时,这也为自定义数据结构或实现其他哈希表相关的功能提供了基础。
易语言HashMap类是一种在易语言编程环境中实现的高效数据结构,它主要用于存储键值对(key-value pairs),提供快速的数据存取。...通过深入学习和实践,开发者可以更好地利用HashMap类解决实际编程问题。
hashmap的C++实现,对于学习C++方面的很有用
这个文档“ HashMap详解(通俗易懂)”很好的阐述了hashmap的底层数据结构示意,希望对学习java的人有帮助
这是一套PPT,讲述的内容是Java的JDK中内置的几种常用的集合框架工具类的知识,重点讲解HashMap,因为不让上传视频,就先传个PPT试试;
在学习过程中,可以重点关注哈希函数的设计、链表的插入与查找以及扩容的实现,这些都是HashMap性能的关键因素。同时,它也可以作为进一步研究和优化哈希表的基础,例如探索更高效的哈希算法或者优化扩容策略。
黑马程序员HashMap的笔记,面试必问,笔记很好,内容言简意赅,看完收获很多,希望能帮助大家的学习
在Java编程语言中,`HashMap`是`...在学习和使用`HashMap`时,不仅要掌握其基本用法,还要了解其内部工作原理,包括哈希函数、哈希冲突的解决策略(开放寻址法或链地址法),以及如何调整容量和负载因子以优化性能。
标题中的“asp hashmap,arraylist实现”指的是在ASP(Active Server Pages)编程中使用HashMap和ArrayList这两种数据结构的具体应用。...学习和理解这些内容对于提升ASP.NET开发中的数据管理和效率至关重要。
无论是在学习Java基础还是进行实际开发,掌握`HashMap`的迭代方法都是非常重要的技能。通过`entrySet()`、`keySet()`或`values()`,我们可以根据需求选择合适的迭代方式,从而高效地遍历和处理`HashMap`中的数据。
HashMap是Java编程语言中最常用的集合类之一,它提供了一种基于键值对(key-value pair)的数据存储方式,具有高效查找、插入和删除操作。...对于学习者来说,阅读源码并结合实践是掌握HashMap的最好方式。
在`Javase_product_HashMap`这个压缩包中,可能包含了实现以上操作的Java源代码示例,供学习者参考和实践。通过这个例子,初学者可以更好地理解HashMap的基本操作以及在实际问题中的应用。同时,了解并掌握HashMap的...
在这个压缩包文件"hashmap.zip"中,包含了关于HashMap的案例、资料、讲义等资源,是深入学习HashMap的好材料。 首先,我们需要了解HashMap的基本概念。HashMap是一个散列容器,内部通过数组加链表的方式实现。每个...
此外,我们还将学习如何使用`Scanner`类从键盘接收用户输入。 #### 二、实验需求分析 根据题目要求,我们需要完成以下任务: 1. 创建一个包含五本书信息的数据结构。 2. 每本书的信息包括书名(名称)、单价以及...