学习笔记-JAVA-考点10-什么情况下需要重写equals和hashcode()两个方法?

一、什么情况下需要重写equals和hashcode()两个方法?

1、加入到hashset中的自定义类的对象,为确保他们不重复,需要对他们的类重写equals()和hashcode()的方法。

如果不重写equals,相同内容不同引用的对象会被当做不同的对象被加入到hashset中。

重写equals()的示例代码:

public boolean equals(Object obj){//这里不可以写成自定义类型自定义类型引用,这样集
<span style="white-space:pre">				</span>  //合框架的底层不会调用这个重载的方法。
<span style="white-space:pre">	</span>if(!(obj instanceof Person)){
<span style="white-space:pre">		</span>return false;
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>Personp =(Person)obj;

<span style="white-space:pre">	</span>//用来查看equals方法是否被调用
<span style="white-space:pre">	</span>sop(this.name +".......equals......."+ p.name);
<span style="white-space:pre">	</span>//认为名字相同并且年龄一样大的两个对象是一个
<span style="white-space:pre">	</span>return this.name.equals(p.name) && this.age == p.age;
}

测试结果:

【结论】循环迭代结果:a2::12被打印了两次,说明重复的元素new Person("a2", 12)被添加到集合中去。没有保证HashSet的唯一性。

同时equals没有被调用,说明仅仅重写equals方法没起到作用

二、不是重写equals就够啦吗,为什么这里还要重写hashcode()?

答:hashset在存储对象时,先判断两个对象的hash值是否一样,只有在hashcode()相等的前提下equals()也相等,才认为两个对象时同一个。

重写hashcode的示例代码:


public int hashCode(){

sop(this.name +"......hashCode");

return this.name.hashCode() + 29*age;

}

三、ArrayList的机制又是怎样的?

[1]. HashSet判断、删除和添加元素等操作依据的是被操作元素所在的类的hashCode()和equals( )这两个方法。

[2]. ArrayList做同等的操作,依据的仅仅是equals( )方法

参考:http://blog.csdn.net/benjaminzhang666/article/details/9468487#

时间: 2024-08-25 09:41:18

学习笔记-JAVA-考点10-什么情况下需要重写equals和hashcode()两个方法?的相关文章

C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:如果不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这种类作用域的层次嵌套使我们能够直接访问基类的成员,就好像这些成员是派生类成员一样: Bulk_item bulk; cout << bulk.book() << endl; 名字book的使用将这样确定[先派生->后基类]: 1)bulk是Bulk_item类对象,在Bulk_item类中查找,找不到名

HTTPS的证书未经权威机构认证的情况下,访问HTTPS站点的两种方法

注意一下文章中提到的jsse在jdk1.4以后已经集成了,不必纠结. 摘 要 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问.但是,如果该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从而不能访问HTTPS站点.本文在简要介绍JSSE的基础上提出了两种解决该问题的方法. 引言 过去的十几年,网络上已经积累了大量的Web应用.如今,无论是整合原有的Web应用系统,还是进行新的Web开发,都要求通过编程来访问某些Web页面.传统的方法是使

Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用

以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类Manager ,验证在类继承过程中equals().hashcode().toString()方法的使用.package equals;public class EqualsTest{    public static void main(String[] args){        Employ

Maven学习笔记之——坐标和依赖(下)

Maven学习笔记之--坐标和依赖(下) 1.    最佳实践 归纳Maven依赖使用的常用技巧.方便用来避免和处理很多常见问题. 1.1.     排除依赖 传递性依赖会给项目隐式地引入很多依赖,这极大地简化了项目依赖的管理.但是有些时候这种特性也会带来问题.例如,当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目.这时候需要排除掉该SNAPSH

java学习笔记——Java中HashMap和TreeMap的区别深入理解

本文转载自Java中HashMap和TreeMap的区别深入理解 首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 

Java记录 -57- Object的equals、hashcode和toString方法

Object的hashCode方法是最基础的,equals和toString方法都间接的使用了hashCode方法. 一般情况下,我们在重写一个类的equals方法时,都会连带重写hashCode方法.IDE工具eclipse给我们提供了快捷的重写equals和hashCode的方法,而不是其中一个,更说明了这个两个方法一般都会一块进行重写. Object的equals方法: public boolean equals(Object obj) {     return (this == obj)

在linux环境下编译运行OpenCV程序的两种方法

原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之后,我下面就介绍Command Line和CMake两种方式. 首先我先粘上我测试的代码吧,文件名为Test.c 1 #include <highgui.h> 2 3 int main(int argc,char ** argv) { 4 5 IplImage* img = cvLoadImage

嵌入式开发学习笔记 ( java - c/c++ :从入门到入门 )

发现放到Blog之后排版全乱套了.. 已经把PDF上传到资源页了  http://download.csdn.net/detail/lyy289065406/8934637 那边排版好看一点...看官们随意吧 >...< · 目 录 导 航 1. 引言 1.1. 编写目的 1.2. 阅读范围 1.3. 声明 1.4. 缩写词/名词解释 1.5. 参考资料 2. 嵌入式开发学习笔记 2.1. 开发环境/测试环境 2.2. 开坑:提要 2.3. 入坑:JNI 2.3.1. navicate 接口定

深入理解Java虚拟机- 学习笔记 - Java内存模型与线程

除了在硬件上增加告诉缓存之外,为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果一致,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因此,如果存在一个计算任务依赖另外一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证.与处理器的乱序优化执行类似,Java虚拟机的即时编译器中也有类似的指令重排序(Instruction