java 关于hashcode和equals的测试

package thinkingInJava;

import java.util.HashMap;

/*
 * 测试在向以hashcode为基础的集合(HashSet , HashMap , HashTable )中操作对象时,
 * 该对象的equals方法和hashcode方法的影响
 *
 */
class MapItem2 {
    private String title ;
    public MapItem2(String title ){
        this.title = title ;
    }
    public void setTitle(String title ){
        this.title = title ;
    }
    @Override
    public int hashCode() {
        return title.hashCode() ;
    }
}
public class TestEqualsAndHashcode {

    public static void main(String[] args) {
        // 向HashMap中添加对象
        /*
         * 1. 计算对象的hashcode
         * 2. 根据计算的hashcode将对象存储进对应的数组中
         * 3. 如果两个对象计算的hashcode相同,
         *    再通过equals方法判断两个对象是不是相等。
         *    如果equals方法返回true,这将已有对象覆盖掉。
         *    否则执行下一步操作
         * 4. 则将这两个对象存储在以该hashcode对应数组元素为头的链表上
         *
         */
        HashMap hm = new HashMap() ;
        MapItem2 mi = new MapItem2("") ;
        //System.out.println("HashMap object hashcode : " + mi.hashCode());
        hm.put(hm, "xx") ;

        // 使用HashMap的get方法从HashMap中获取值
        /*
         * 1. 根据传递进来的对象计算其hash值,找到相应数组位置。
         * 2. 通过equals方法判断数组位置上的值是否与该值相等。
         * 3. 相等返回值,否则返回null。
         */
        /*
         * 测试: 使用对象的title属性的hashcode作为hashcode的返回值,
         * 然后将对象put到Map中,然后将title改变,再从Map中取值
         */
        HashMap hm2 = new HashMap() ;
        MapItem2 mi2 = new MapItem2("xxx") ;
        hm2.put(mi2 , "xxx") ;
        mi2.setTitle("yyyy") ;// 重新设置title值后就无法再获取xxx值了,因为在get时计算的hash值变了
        System.out.println(hm2.get(mi2)) ;
    }
}
时间: 2024-10-11 18:06:27

java 关于hashcode和equals的测试的相关文章

面试点:Java 中 hashCode() 和 equals() 的关系

Java 中 hashCode() 和 equals() 的关系是面试中的常考点,如果没有深入思考过两者设计的初衷,这个问题将很难回答.除了应付面试,理解二者的关系更有助于我们写出高质量且准确的代码. 一.基础:hashCode() 和 equals() 简介 在学习 hashCode() 和 equals() 之间的关系之前, 我们有必要先单独地了解他俩的特点. equals() equals() 方法用于比较两个对象是否相等,它与 == 相等比较符有着本质的不同. 在万物皆对象的 Java

java中hashcode和equals的区别和联系

HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.HashMap中相同键的呢?当存储了“相同的东西”之后Java运行时环境又将如何来维护呢? 在研究这个问题之前,首先说明一下JDK对equals(Object obj)和hashcode()这两个方法的定义和规范: 在Java中任何一个对象都具备equals(Object obj)和hashcode()

Java 中 hashCode 和 equals 方法 小结

转载:http://www.oschina.net/question/82993_75533 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法. hashcode主要是set集合使用,是用于判断对象是否”可能“相等的快捷办法,以解决大集合的问题.举例来说,如果一个一万个元素的集合加入一个元素,如果是一个新元素,那么必须要equal一万次才能加入.所以采用hashcode,hashcode的思路是如果equal,则ha

Java中hashcode,equals和==

hashcode方法返回该对象的哈希码值. hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先通过hashCode()找到相应的位置,然后再根据equals()方法判断这个位置上的对象与当前要插入的对象是不是同一个.若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象. 所以,Java对于eqauls方法和hashCode方法是这样规定的: 1.如果两个对象相同,那么

java中hashcode()和equals()的详解

今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashcode()这两个方法都是从object类中继承过来的. equals()方法在object类中定义如下: public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同).但是我们必需清

java 中hashcode和equals 总结

一.概述            在Java中hashCode的实现总是伴随着equals,他们是紧密配合的,你要是自己设计了其中一个,就要设计另外一个.当然在多数情况下,这两个方法是不用我们考虑的,直接使用默认方法就可以帮助我们解决很多问题.但是在有些情况,我们必须要自己动手来实现它,才能确保程序更好的运作. 1.1 规则 粗略总结一下在JavaDoc中所规定hashcode方法的合约:      Objects that are equal must have the same hash co

[JAVA 基础] hashcode() & equals()

平时使用map时都是用JAVA原生的类型,所以很少关注到hashcode()和equals()的方法的内部实现.近期实现一个小工具,涉及到自己写的类的查找比对,又再次重温了相关的知识. 上简单示例代码,比对自己覆写和不覆写的差异 不覆写hashcode()和equals(): 1 import java.util.HashMap; 2 import java.util.Map; 3 4 public class HashCode_Equals { 5 6 public int a; 7 publ

【Java】hashcode()和equals()

大家知道,在集合中判断集合中的两个元素是否相同,依赖的是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(); b

java中hashcode()和equals()的详解 (转)

(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashcode()这两个方法都是从object类中继承过来的. equals()方法在object类中定义如下:   public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同).但是我们必需清楚,当String .Math.还有Integer.Double....等这些封装类在使用equ