大家知道,在集合中判断集合中的两个元素是否相同,依赖的是hashcode()和equals()两个方法。

> 一个简单的实验

public class Teacher {

    private Integer id = null;

    public Teacher(Integer id) {
super();
this.id = id;
} @Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Teacher [id=").append(id).append("]");
return builder.toString();
} /*
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Teacher other = (Teacher) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
*/ }
import java.util.ArrayList;
import java.util.Collection; public class Call { public static void main(String[] args) {
Collection<Teacher> c = new HashSet<Teacher>();
for (int i = 0; i < 5; i++) {
c.add(new Teacher(i));
} System.out.println("Collection -> " + c); Teacher t1 = new Teacher(1);
System.out.println("Teacher -> " + t1); System.out.println(c.contains(t1));
} }

执行后,你可以看到:

Collection -> [Teacher [id=0], Teacher [id=1], Teacher [id=2], Teacher [id=3], Teacher [id=4]]
Teacher -> Teacher [id=1]
false

很明显,集合认为id为1的对象是不存在集合中的。
因为,集合依靠hashcode()和equals()判断元素是否相等,而Object的hashcode()返回对象的地址计算散列码,Object的equals()是比较对象的地址。所以,在两个对象(虽然对象的内容相同)的情况下,集合认为他们是不同的。

这时候,需要覆盖这两个方法(你可以把上述代码这两个方法的注释解开),然后看执行结果。

当然,对于一些集合对其元素进行线性对比的,则只重写equals()也是也行的,比如ArrayList。(当然,为了程序的可维护性,最好还是hashcode()和equals()都重写,你怎知道以后是否有人修改成别的集合实现类型呢?)

【Java】hashcode()和equals()的更多相关文章

  1. Java hashCode() 和 equals()的若干问题

    原文:http://www.cnblogs.com/skywang12345/p/3324958.html 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() ...

  2. Java hashCode() 和 equals()的若干问题解答

    本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equa ...

  3. Java hashCode 和 equals()

    1 Object中定义的hashCode() public int hashCode() Returns a hash code value for the object. This method i ...

  4. Java hashCode() 和 equals()的若干问题解答<转载自skywang12345>

    第1部分 equals() 的作用equals()的作用是用来判断两个对象是否相等.equals()定义在JDK的Object类中.通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否 ...

  5. JAVA - hashcode与equals作用、关系

      Hashcode的作用 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set.前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复.      ...

  6. 高强度学习训练第十二天总结:Java hashCode和equals的关系

    今天要收拾东西.草草的总结下.. 1.如果两个对象相等,则hashcode一定也是相同的 2.两个对象相等,对两个对象分别调用equals方法都返回true 3.两个对象有相同的hashcode值,它 ...

  7. Java hashCode与equals学习

    1.关于Object类的equals方法的特点 a) 自反性: x.equals(x) 应该返回true b) 对称性: x.equals(y)为true,那么y.equals(x) 也为true c ...

  8. java hashCode()与equals()的作用

    1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有 例如内存中有这样的位置 0  1  2  3  4  5  6  7 而我有个类,这个类有个字段叫ID,我要把这个 ...

  9. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  10. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

随机推荐

  1. 。。。Hibernate中mappedBy属性。。。

    今天在学习Hibernate中,感觉这个mappedBy这个注解属性有点小难度.不过理解之后,还是阔以的! 首先,mappedBy这个注解只能够用在@OntToOne,@OneToMany,@many ...

  2. android 添加背景音乐

    MediaPlayer mediaPlayer=MediaPlayer.create(MainActivity.this,R.raw.qiji); mediaPlayer.start();

  3. WPF中实现

    计算类的封装 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespa ...

  4. opengl& 颜色

    颜色 简介 颜色的显示模式分为两种: RGBA显示模式 颜色索引显示模式(使用颜色映射表,映射表提供了索引,可以混合基本的红,绿,蓝色值). RGBA模式可以选择的颜色数量多于颜色索引模式.一般而言, ...

  5. 4. 星际争霸之php设计模式--工厂方法模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  6. 为VirtualBox里的Linux系统安装增强功能

    先说下为什么要安装增强功能, 很重要的原因是分辨率,没有安装增强功能的虚拟机里的系统往往不能全屏的,屏幕显示的内容没有充满整个屏幕. 还有主机和客户机之间共享文件夹也需要客户机的系统安装了增强功能. ...

  7. Sql Server 2012 的新分页方法分析(offset and fetch) - 转载

    最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的 其中 offset ...

  8. 【转】Delphi利用系统环境变量获取常用系统目录

    Delphi code //譬如 %WINDIR% 是表示系统目录的系统变量, 可以这样获取: var s: string; begin s := GetEnvironmentVariable('WI ...

  9. 强制类型转换(const_cast)

    [1] const_cast的作用 一.常量指针被转化成非常量指针,并且仍然指向原来的对象: 二.常量引用被转换成非常量引用,并且仍然指向原来的对象: 三.常量对象被转换成非常量对象. [2] 实例代 ...

  10. Index Condition Pushdown Optimization

    Index Condition Pushdown (ICP) is an optimization for the case where MySQL retrieves rows from a tab ...