关于hasCode,和equal的问题,求各位大神帮忙

豪哥super叼 2018-03-24 10:29:17
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Person {
private String name;
private long ID;
public Person(String name,long ID) {
this.name=name;
this.ID=ID;
}
public long getID() {
return ID;
}
public void setID(long ID) {
this.ID=ID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
public int hasCode() {
final int PRIME=31;
int result=1;
result=PRIME*result+(int)(ID^(ID>>>32));
result=PRIME*result+((name==null)?0:name.hashCode());
return result;
}
public boolean equals(Object obj) {
if(this==obj)
return true;

if(obj==null)
return false;

if(getClass()!=obj.getClass())
return false;

final Person other=(Person)obj;
if(ID!=other.ID)
return false;

if(name==null) {
if(other.name!=null)
return false;
}
else if(!name.equals(other.name))
return false;

return true;
}
public static void main(String[] args) {
Set<Person>hashSet=new HashSet<Person>();
hashSet.add(new Person("马先生",220181));
hashSet.add(new Person("李先生",220186));
hashSet.add(new Person("王小姐",220193));
Iterator<Person>it=hashSet.iterator();
while(it.hasNext()) {
Person person=it.next();
System.out.println(person.getName()+""+person.getID());
}
}


}


我一直搞不懂,equal和hasCode方法是如何运行的 , 例如equal this=obj,这个this到底指的是什么,obj他指定的又是什么?
...全文
903 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
robertGk 2018-04-17
  • 打赏
  • 举报
回复
this指当前对象,obj是指与自己比较的对象
通大小强 2018-04-07
  • 打赏
  • 举报
回复
1.要清楚对象和类之间的关系,程序运行的时候,类创建了对象,对象中封装了成员(数据和方法),对象调用自己的方法方式是对象.方法,对象在自己的成员方法中调用自己的成员变量用this,this表示对象自己; 2.因为在编写类文件的时候,对象没有确定,使用this表示对象自己;
Ai_SH 2018-04-03
  • 打赏
  • 举报
回复
我觉得你需要吧内存的分区理解一下, 栈,堆,静态区,code区, 堆实际上有分为新.旧.常驻三个区; this都讲的那么清楚了,你只能自己悟了. equals 原本 就是 ==; 不过在String类里面重写了,String 类型的保存方式就是我说的内存的问题了.
  • 打赏
  • 举报
回复
this:谁调用的就是谁(指对象) obj:从你代码来看就是传过去的参数,一般也是这样
virtuouswolf_8 2018-03-26
  • 打赏
  • 举报
回复
我也初学,讲一下自己的理解。 equals()方法是Object类的方法,他的源码就是直接用==对两个对象进行比较,一个对象是调用这个方法的对象本身,即this(关键字用法,建议自己了解),还有一个是传进来的对象参数即obj。 原理是这样,== 在进行比较的时候比较的是两个对象中的地址,而地址是指向堆内存中实例化的对象。 意思就是这两个对象是否指向同一个实例化区域,这个你应该懂,但是我们使用相等的本意不是为了判断是否指向同一个区域,而是判断两个对象中存储的指定比较内容是否相同。显然使用object的equals()方法是不行的,所以要覆盖里面的内容,指定自己的相等标准,根据具体情况来自己编写(举例:如果你认为两个人的年龄相同他们就是同一个人,Object的方法就不可以使用)。 大致是这么个思路,可能我讲的比较绕,实在不懂可以自己查阅源码进行比较就能理解,另一个方法可以按照同样思路查阅理解。
oyljerry 2018-03-25
  • 打赏
  • 举报
回复
this指自己,obj指要跟自己比较的对象
豪哥super叼 2018-03-24
  • 打赏
  • 举报
回复
还是感觉蒙蒙的,有没有实例来解释一下呗。。。
  • 打赏
  • 举报
回复
equal是obj的方法,但是String类里面重写的equal方法,当equals没有重写的时候相当于==,也就是equal this = obj;this是当前调用对象,object是参数,相当于是this.equal(obj); hashcode是一中算法,为了增加查找效率,hashcode地址相同,对象不一定相同,但是对象相同hashcode肯定相同

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧