首页上一页 1 下一页尾页 1 条记录 1/1页
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变量算是构造类型吗?
最好把实现原理能解释一遍。谢。
本人菜鸟,请求相关指导老师能够详细解释一下,万分感谢。
代码如下:
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变量算是构造类型吗?
最好把实现原理能解释一遍。谢。
本人菜鸟,请求相关指导老师能够详细解释一下,万分感谢。