已有101人关注
java入门经典一书中hashcode的相关问(第9章第9.9实例)
发表在Java图书答疑 2015-07-22
是否精华
版块置顶:
《Java入门经典》 第9章 第9.9实例
代码如下:
public class Person {
private String name;
private long id_card;

public Person(String name,long id_card){
this.name =name;
this.id_card=id_card;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public long getId_card(){
return id_card;
}
public void setId_card(long idCard){
id_card=idCard;
}
/*
public int hashCode(){  //实现hashCode()方法
final int PRIME=31;
int result=1;
result=PRIME*result+(int)(id_card^(id_card>>>32));
result=PRIME*result+((name==null)?0:name.hashCode());
return result;
}
*/
public boolean equals(Object obj){//实现equals()方法
if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final Person other = (Person) obj;
        if (id_card != other.id_card)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
}
}

public class Test {
public static void main(String[] args){
Set<Person> hashSet=new HashSet<Person>();  //定义Set集合对象
hashSet.add(new Person("马先生",220181));//向集合中添加对象
hashSet.add(new Person("李先生",220186));
hashSet.add(new Person("王小姐",220193));
  //  hashSet.add(new Person("李先生",220186));
Iterator<Person> it=hashSet.iterator();//获取集合迭代器
while(it.hasNext()){//循环遍历集合
Person person=it.next();//获取集合对象
System.out.println(person.getName()+""+person.getId_card()); //将对象信息输出
}
}
}

问题如下:
(1)result=PRIME*result+(int)(id_card^(id_card>>>32)); 
     result=PRIME*result+((name==null)?0:name.hashCode());
     这两句话实现的原理我不懂(我知道是改写hashCode()方法来实现给对象赋一个特定的ID),我想问的是这条式子中name.hashCode()是用来干嘛的(这边是调用系统中的hashCode()吗?为什么?方法体内不能调用该方法?)还有执行的步骤(执行完了得到的答案是什么?建议书中或者有所提示,毕竟学习入门的人水平不怎么高,这些还是挺难看懂的)
     最好把这两条式子也帮我分析一下,这两条式子怎么确定所给出的id值不一样?
(2)在equals()方法中,首先传入的obj是指哪个值?this==obj中this指代的是?getClass()方法的作用?final Person other = (Person) obj;定义一个Person类型的other变量算是构造类型吗?
     最好把实现原理能解释一遍。谢。
 
   本人菜鸟,请求相关指导老师能够详细解释一下,万分感谢。
分享到:
精彩评论 1
菜鸟级精英
学分:0 LV1
TA的每日心情
开心
2020-03-23 21:05:48
2015-07-22
沙发
(1)hashCode()是Object类提供所有子类的一个方法,返回改对象的哈希码值。例子中的判断条件是“id和名字都不相同”,满足这样的条件才能认定两个人是完全不同的人。因为id是long值,所以可以直接参与数学计算,但name是String值,不可以直接做计算,索引就引入了name的哈希值来做计算。这两行代码可以调换,这个方法就是通过复杂计算返回一个独一无二的hash值,PRIME的值也可以随便改。
(2)
public boolean equals(Object obj){//实现equals()方法
if (this == obj)//首先判断传进来的这个对象,是不是我Person类对象自己
return true;//是就返回true
if (obj == null)//判断传进来的这个对象是不是空的
return false;
if (getClass() != obj.getClass())//判断传进来的这个对象和我本身是否属于同一个类型
return false;
final Person other = (Person) obj;//如果传进来的对象是既不是我本身,又不是空对象,又是Person类的子类,就将这个对象强制转换成一个不可改变的Person类对象。
if (id_card != other.id_card)//如果id_card值不同
return false;
if (name == null) {//如果我的名字是空的
if (other.name != null)//但传入的对象名字不是空的
return false;
} else if (!name.equals(other.name))//如果我两名字都不是空的,但名字却不一样
return false;
return true; //如果以上所有条件都被跳过了,最后就返回true
}
}
首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照