A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© LuckyQS 中级黑马   /  2014-1-9 16:02  /  1460 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.Collection;
import java.util.HashSet;

public class ReflectTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
               
                Collection collections = new HashSet();
                ReflectPoint pt1 = new ReflectPoint(3,3);
                ReflectPoint pt2 = new ReflectPoint(5,5);
                ReflectPoint pt3 = new ReflectPoint(3,3);
               
                collections.add(pt1);
                collections.add(pt2);
                collections.add(pt3);
                collections.add(pt1);
                               
                System.out.println(collections.size());
        }

}

public class ReflectPoint {
        public int x;
        public int y;
       
        @Override
        public int hashCode() {
                final int prime = 31;
                int result = 1;
                result = prime * result + x;
                result = prime * result + y;
                return result;
        }

        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                final ReflectPoint other = (ReflectPoint) obj;
                if (x != other.x)
                        return false;
                if (y != other.y)
                        return false;
                return true;
        }

        public ReflectPoint(int x, int y) {
                super();
                this.x = x;
                this.y = y;
        }       
}

当我没有重写hashCode方法,集合长度为3
当我重写了hashCode方法,集合长度为2
我想请大家帮我总结一下hashCode方法的用途

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

5 个回复

倒序浏览
要了解hashcode()先要了解hashset集合的特点,hashset特点,元素不重复,有序的,
hashset的add()方法会判断要添加的元素是否与集合中已有元素重复,其原则是先判断hashcode()返回值是否相等,若不等,才调用equals()方法精确判断,类似于对一个类的不同对象进行分区,分段,方便于集合的查找,添加等操作。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
补充一点,hashcode()相当于指纹的作用,如果没有重写这个方法,相当于是对象的地址。每个地址都不同,所以结果是3.
重写了之后,能判断出第一和第三个是相同的,根据hashset的不能添加重复,元素所有结果是2.

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。
hashCode 的常规协定是:
在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
HashSet集合判断存入元素的唯一性依据的是hashcode和equals两种方法,二者缺一不可。
该两种方法运用有先后,首先用hashcode方法判断,如果相同,就再用equals方法判断。
如果不复写hashcode方法,则会用默认的hashcode方法。
而默认的其内容是靠内存地址值来判断的,你加入两次pt1,用默认的判断,就认为他们俩不一样。
因为每new一次,分配的内存地址值都不一样。
所以才有了——>没复写长度3,复写长度2

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
2、如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马