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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山水游客 中级黑马   /  2012-7-25 12:31  /  1491 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Hashcode是比较区域的对象,equals是比较值的。。
先比较那一个呢,是不是对象不相同,值都不用比较了?

7 个回复

倒序浏览
      在一般的比较情况下,不需要了解hashcode的用法,但当用到hashmap,hashset等集合类时要注意hashcode。
     一般的比较情况:可以用==(地址比较)和equals(值比较)比较
     hashmap,hashset等集合类的比较情况下:
             此类集合内部运作时,首先比较hashCode,如果hashCode不同就不会再通过equals比较,
               如果hashCode相同,接着就通过equals比较。
           集合中用到时,基本都是用来排序的。

希望对你有帮助...............

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Hash一般是无重复元素。需要先走HashCode然后在走equals。一般hashSet或HashMap都是将HashCode值相同的对象存储在同一值位置下。如果HashCode不同,将直接被认定为是不同的。相同之后才会在走equals,再进行内容的区分。看是否是重复的元素。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Hash一般是无重复元素。需要先走HashCode然后在走equals。一般hashSet或HashMap都是将HashCode值相同的对象存储在同一值位置下。如果HashCode不同,将直接被认定为是不同的。相同之后才会在走equals,再进行内容的区分。看是否是重复的元素。
回复 使用道具 举报
1、equals方法用于比较对象的内容是否相等(覆盖以后)。
2、hashcode方法只有在集合中用到。
3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。
4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
回复 使用道具 举报
1 哈希算法的原理:
     将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组  对应某个存区
    域,根据一个对象的哈希码就可以确定该对象存储在哪个区域。
2 HashSet 集合的工作原理
     就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象
  的存储区域,HashSet集合在比较的时候先算出对象的哈希值,找到相应的存储区,当然哈希码不同就不用再
  比较了,若相同,然后再取出该区域的每个元素和对象用equals方法进行比较,
3  什么时候覆盖HashCode方法?
   在哈希集合中为了让两个相同的对象也放在相同的区域,那么如果两个对象equals 相等,那么应该让他们
  的HashCode也相等,以便达到逻辑上一致,
回复 使用道具 举报
1.equals方法是Object类提供的一个实例方法,该方法判断两个对象相等的标准和使用==运算符相同,即当两个引用变量指向同一个对象时返回true。
2.String类重写了Object的equals方法,当两个字符串包含的字符序列相同时,使用equals比较返回true。
3.当向HashSet集合存入元素时,集合调用该对象的HashCode方法获取hashcode值,根据hashcode值决定该元素在集合中的存储位置。
4.HashSet集合判断元素相等的标准,两个对象通过equals方法比较相等,并且HashCode()的返回值相等。
5.当两个元素通过equals方法比较为true,HashCode()的返回值不相等时,元素会被存储在不同的位置;
当两个元素通过equals方法比较为false,但HashCode()的返回值相等时,集合会试图将元素保存在同一个位置,这会导致HashSet访问集合元素的性能下降。
回复 使用道具 举报
在Java中,equals()和hashCode()两个函数配合使用的.hashCode()所返回的是整型值,是用来分类对象在一些特定的收集对象中的位置,比如HashMap, Hashtable, HashSet等.在应用中,我们比较两个对象是否“相等”,过程主要是这样的:先比较两个对象的哈希码(当然是由对象的hashCode()方法得到) 是否相等,如果哈希码不相等则我们就认为两个对象“不相等(注意这不是我们一般意义上的不相等,说白了就是不重复)”;而如果哈希码相等,则还要用 equals()方法进行进一步判断:如果equals()比较的结果为true,则认为两个对象“相等(这是彻底相等了)”,如果equals()方法比较的结果为false,则认为两个对象“不相等(即认为不重复)”。这个过程在HashSet里插入数据时表现的淋漓尽致。
Object下equals的源代码:
  public boolean equals(Object obj) {
return (this == obj);
    }
也就是说在不重写equals()的情况下它比较的是对象是否相等比不是比较值是不是相等,所以如果我们不重写的话,如下面这样
Object a=new Object();
Object b=new Object();
a和b都是Object的引用也就是说a.valuse=b.valuse,但是如果不重写equals()的时候a!=b->a.valuse!=b.valuse。所以我们把它重写,让他不是比较对象是否相等而是比较值是不是相等。



  同样,fanal 与 == 限定的都只是引用,非值



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