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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史政法 中级黑马   /  2013-5-25 12:06  /  1270 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public boolean equals(Object obj) {
  2.         return (this == obj);
  3.     }
复制代码
这个判断的是两边的什么?已经验证判断的不是类的HashCode


HashCode和内存地址值是一回事吗?

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

5 个回复

倒序浏览
this肯定是指的当前对象啊!!!

class Demo{
        public static void main(String[] args)
        {
                Test1 t=new Test1("zhangsan");
                System.out.println(t.equals("zhangsan"));
                System.out.print(t.equals("lisi"));
        }
       
}
class Test1
{
        String s;
        Test1(String s)
        {
                this.s =s;
        }
        public boolean equals(Object obj)
        {
            return (this.s == obj);
        }
}

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
你这头像那里搞的   这不是毕老师的照片吗?侵犯肖像权了,我也想用可以用吗?
回复 使用道具 举报
判断的是地址值
哈希值应该是根据地址值,然后由一定的算法计算出的
回复 使用道具 举报
本帖最后由 student 于 2013-5-25 15:28 编辑

我先解答第2个问题,再解答第1个问题。

我们知道,Set集合中不能存放相同元素,为了保证元素唯一性,就发明了HashCode(哈希值)。这种方式
将集合分成若干个存储区域,每一个对象可以计算出一个哈希值,可以将哈希值分组,每组分别对应某个存
储区域,根据一个对象的哈希值就可以确定该对象存储在哪个区域,如下图所示

HashSet就是采用哈希算法,实现元素存储的集合,它内部使用对某个数值n进行取余的方式对哈希码进行
分组和划分对象存储区域。Object类中定义了一个hashCode()方法来返回每个Java对象的哈希值,当从HashSet
集合中查找某个对象时,Java系统首先调用对象的hashCode方法获取对象的哈希码,根据该哈希码找到相应的
存储区域,然后取出该存储区域的每个元素与该对象进行equals方法比较,这样不用遍历集合中的所有元素就可
以快速进行比较。


所以,我觉得hashCode代表某一块内存地址,但是不一定代表某一块内存地址,因为我们可以覆盖hashCode方法,

自定义自己的哈希值,如下面的例子,在Person类中覆盖了hashCode方法:
  1. import java.util.HashSet;
  2. import java.util.Iterator;

  3. class Person {
  4.         private String name;
  5.         private int age;

  6.         public Person(String name, int age) {
  7.                 this.name = name;
  8.                 this.age = age;
  9.         }

  10.         public String getName() {
  11.                 return name;
  12.         }

  13.         public int getAge() {
  14.                 return age;
  15.         }

  16.         public int hashCode() {
  17.                 // 自定义的哈希值为:姓名的哈希值加上年龄
  18.                 return name.hashCode() + age;
  19.         }

  20.         // 复写Object类的方法
  21.         public boolean equals(Object obj) {
  22.                 // 如果传入的参数不是Person对象
  23.                 if (!(obj instanceof Person))
  24.                         return false;
  25.                 Person p = (Person) obj;
  26.                 //名字相同,并且年龄相同则认为是相同元素
  27.                 return (this.name.equals(p.name)) && (this.age == p.age);
  28.         }
  29. }

  30. public class HashSetDemo {
  31.         public static void main(String[] args) {

  32.                 HashSet<Object> hs = new HashSet<Object>();
  33.                 hs.add(new Person("a1", 11));
  34.                 hs.add(new Person("a2", 12));
  35.                 hs.add(new Person("a2", 12));
  36.                 hs.add(new Person("a4", 14));
  37.                 //遍历输出集合元素
  38.                 Iterator<Object> it = hs.iterator();
  39.                 while (it.hasNext()) {
  40.                         Person p = (Person) it.next();
  41.                         System.out.println(p.getName() + "  " + p.getAge());
  42.                 }
  43.         }
  44. }
复制代码

向Set集合中添加元素时,首先调用hashCode方法获取元素的哈希值,当该元素哈希值和集合中某个元素的哈希值相同时,
才调用equals方法。
  return (this == obj)中,this表示当前对象,也就是新添加到Set集合中的对象就是this,而其他的已经添加到集合中的对象就是obj。当前对象和
集合中的对象进行比较,确定该对象是否已经存在,如果存在则阻止新对象插入到集合中,添加失败,这就保证的元素的唯一性。

1.png (8.51 KB, 下载次数: 0)

1.png

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
哈希 是一种算法。
是由计算机底层实现的,

在哈希表结构中存储元素时。

比如 HashSet 。 该集合中不允许重复的元素,所以 add方法会返回一个boolean类型的值。

表示元素的添加是否成功。这里就用到了hashcode方法和equals方法:

|----哈希表确定元素是否相同
                                                        1、 判断的是两个元素的哈希值是否相同
                                                                如果相同,再判断两个对象的内容是否相同
                                                        2. 判断哈希值相同,其实判断的是对象的hashCode方法。判断内容相同用的是equals方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马