对hashcode和equals的深度理解
---》一个例子
public class Student
{
private int id;
private String name;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public static void main(String[] args)
{
Student s1 = new Student();
s1.setId(1);
Student s2 = new Student();
s2.setId(1);
System.out.println(s1.equals(s2)); //false
}
}
---》未重写hashcode和equals方法情况
System.out.println(s1.equals(s2)); //false
打印了false,因为是生成了两个对象,调用Object的equals方法,默认直接比对两个对象的地址是否一样。
---》只重写equals方法情况(eclipse生成)
现在有个业务逻辑认为id相同,就认为是同一个学生,故加入了equals方法,如下:
@Override
public boolean equals(Object obj)
{
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
Student other = (Student) obj;
if (id != other.id) return false;
return true;
}
System.out.println(s1.equals(s2)); //true
现在又有个需求,把生成的学生放入set中
Set<Student> set = new HashSet<Student>();
set.add(s1);
set.add(s2);
System.out.println(set.size());//2
System.out.println(s1.hashCode() == s2.hashCode());//false
既然s1和s2 id相同,equals已经相等了,结果却是2,要知道set是不能放入重复对象的,重写hashcode再试一下。
---》重写hashcode方法情况(eclipse生成)
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
System.out.println(set.size());//1
System.out.println(s1.hashCode() == s2.hashCode());//true
---》结论
* 业务逻辑重新定义对象是同一对象时,两个方法必须同时重写。
* 在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址值;
* equals相等 则hashcode()相等,hashcode()相等,equals不一定相等;
* 没有写equals方法,调用时会调用Object的equals方法,默认就是直接比对两个对象的地址是否一样,即this == obj。
* 用到HashMap或者HashSet时,将其内容作为"是否重复"的标准(而不是按内存地址比较),则需要自己重写这两个方法。
* HashMap或者HashSet时比对过程:首先根据hash值定位到某个区域上,然后再在区域内进行equals判断,效率高。
* 将对象的属性值参与了hashCode的运算中,在进行删除的时候,就不能对其属性值进行修改,否则会出现严重内存泄露问题,所以尽量保证使用对象的同一个属性来生成hashCode()和equals()两个方法。
参考:
http://blog.csdn.net/whuslei/article/details/6686612
http://blog.csdn.net/jiangwei0910410003/article/details/22739953
http://blog.csdn.net/steveguoshao/article/details/12576849
http://stackoverflow.com/questions/3613102/why-use-a-prime-number-in-hashcode
分享到:
相关推荐
【面试】中提到的几个关键知识点集中在对象比较、equals()和hashCode()方法的使用以及它们之间的关系上。这些概念在Java编程中至关重要,特别是在处理...在面试中,这些知识点展示了候选人对Java核心概念的理解深度。
在Java编程语言中,相等性是理解和使用对象时至关重要的概念。本篇文章将深入剖析“==”运算符和equals()方法的区别与联系,帮助你在Java的笔试和面试中更好地应对相关问题。 首先,“==”运算符在Java中用于比较...
equals() 方法和 hashCode() 方法是 Java 中两个非常重要的方法,它们的作用是分别比较两个对象的值和哈希值。图 2 展示了这两个方法的区别: * 如果两个对象相等(equal),那么他们一定有相同的哈希值。 * 如果两...
本讲将深度剖析Java中的"==运算符"和"equals()方法",这两个是判断对象之间相等性的主要手段。 一、"=="运算符 "=="运算符在Java中用于比较基本类型的值是否相等,例如int、char、boolean等。对于引用类型的变量,...
通过深入理解和熟练掌握上述知识点,你将能够在Java的笔试和面试中表现出色。在准备过程中,不仅要理解理论,还要动手实践,通过编写代码来加深理解。同时,关注最新的Java技术和框架,这将使你在求职市场上更具竞争...
5. **hashCode()和equals()方法的重要性**:在HashMap中,hashCode()方法用于确定键值对的索引,而equals()方法用于比较两个键是否相等。如果两个不同的对象通过hashCode()方法得到的哈希值相同,且equals()方法返回...
掌握这些基础概念对于理解和解答面试中的Java问题至关重要。在面试准备中,除了这些核心知识点,还需要了解异常处理、多线程、IO流、集合框架、设计模式等方面的内容,以全面提高自己的Java技能。
数据结构与算法是计算机科学的基础,对于任何IT行业的专业...在面试中,对这些基本数据结构和算法的理解和熟练应用,能够体现候选人的编程基础和问题解决能力。熟悉这些知识点并能灵活运用,将极大地提高面试的成功率。
在Java编程语言中,面试题通常涵盖了许多核心概念和技术,以评估候选人的理解和技能。以下是一些关于Java面试题及答案的关键知识点: 1. **JDK与JRE的区别** JDK(Java Development Kit)是Java开发工具包,它包括...
- **线程池**:ExecutorService的理解和使用。 6. **IO流** - **字节流与字符流**:InputStream/OutputStream处理二进制数据,Reader/Writer处理文本。 - **缓冲流**:提高读写效率。 - **对象序列化**:如何将...
Java基础,如equals和hashCode的正确使用,泛型和枚举的理解,以及异常处理,也是面试的重点。对于equals和hashCode,面试者需要理解它们在对象比较中的作用,以及如何重写这两个方法以满足自定义需求。泛型提供了...
- 常见的设计模式:单例、工厂、观察者、装饰器、适配器等模式的理解和应用。 这些知识点构成了Java开发者应具备的基础知识体系。在实际的面试中,面试官可能会结合具体项目经验和技术深度来考察候选人的能力。...
面试是求职过程中至关重要的环节,对于Java和.NET程序员来说,了解并掌握...这些知识点涵盖了Java和.NET程序员面试中常见的技术和非技术问题,深入理解和掌握这些内容将有助于面试者在面试中展现出专业水平和综合素质。
Java是一种广泛使用的编程语言,尤其在企业级应用和服务器端开发中占据主导地位。对于初学者来说,了解Java的核心概念和特性是至关重要的。...在实际开发中,理解和运用这些概念将有助于编写高效、可靠的Java代码。
因此,为了确保HashSet的正确性,当存储自定义对象时,必须重写hashCode()和equals()方法。 6. SortedSet接口和TreeSet实现类提供了排序功能。TreeSet内部使用红黑树数据结构,保证了元素的自然排序或者根据提供的...
在面对开放式问题时,比如“请自我介绍一下”或“讲述一个你解决过的复杂问题”,仅仅简单回答几句话并不足以展现你的专业素养和对行业的热爱。面试官会通过这些问题来评估你的工作激情、团队合作能力和工作经验。...
Java面试题集是每个Java开发者在...以上是Java面试中可能涉及的一些关键知识点,深入理解和掌握这些内容将有助于在面试中展现出扎实的Java基础和专业能力。不断实践和总结,才能在竞争激烈的Java开发者市场中脱颖而出。