java – Hashcode()Vs Equals()
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Hashcode()Vs Equals(),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5034字,纯文字阅读大概需要8分钟。
内容图文
![java – Hashcode()Vs Equals()](/upload/InfoBanner/zyjiaocheng/763/d86a29e2579e42d0a19a79382ff0cf21.jpg)
我有两个以下的课程..
class Emp //implements Comparable
{
String name,job;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
int salary;
public Emp(String n,String j,int sal)
{
name=n;
job=j;
salary=sal;
}
public void display()
{
System.out.println(name+"\t"+job+"\t"+salary);
}
public boolean equals(Object o)
{
Emp p=(Emp)o;
return this.name.equals(p.name)&&this.job.equals(p.job) &&this.salary==p.salary;
}
/* public int hashCode()
{
return name.hashCode()+job.hashCode()+salary;
}
*/
/* public int compareTo(Object o)
{
Emp e=(Emp)o;
return this.name.compareTo(e.name);
//return this.job.compareTo(e.job);
// return this.salary-e.salary;
}*/
}
另一个是……
import java.util.*;
class EmpHsDemo
{
public static void main(String arg[])
{
HashSet set=new HashSet();
set.add(new Emp("Ram","Trainer",34000));
set.add(new Emp("Ram","Trainer",34000));
set.add(new Emp("Ravi","Administrator",44000));
set.add(new Emp("Sachin","Programmer",24000));
set.add(new Emp("Priyanka","Manager",54000));
set.add(new Emp("Anupam","Programmer",34000));
set.add(new Emp("Sachin","Team Leader",54000));
System.out.println("There are "+set.size()+" elements in the set.");
System.out.println("Content of set are : ");
Iterator itr=set.iterator();
while(itr.hasNext())
{
Emp e=(Emp)itr.next();
System.out.print(e.hashCode()+"\t");
e.display();
}
System.out.println("**********************************");
Emp e1=new Emp("Ravi","Administrator",44000);
System.out.println("Removing following Emp from the set...");
System.out.print(e1.hashCode()+"\t");
e1.display();
set.remove(e1);
System.out.println("No. of elements after removal "+set.size());
/* Emp e2=new Emp("Anupam","Programmer",34000);
System.out.println("Searching following Emp in the set...");
System.out.print(e2.hashCode()+"\t");
e2.display();
System.out.println("Results of searching is : "+set.contains(e2));*/
}
}
现在我做了一项研究
- If I comment hashcode() method and not comment equals () method that is it will use it allows the duplicate as Ram is shown twice along with memory address I get the following result..
There are 7 elements in the set.
Content of set are :
374283533 Priyanka Manager 54000
1660364311 Ram Trainer 34000
1340465859 Ravi Administrator 44000
2106235183 Sachin Programmer 24000
2031692173 Ram Trainer 34000
603737068 Anupam Programmer 34000
148669801 Sachin Team Leader 54000
**********************************
Removing following Emp from the set...
1807500377 Ravi Administrator 44000
No. of elements after removal 7
2 . If I uncomment hashcode() method and equals () method , I get this result
There are 6 elements in the set.
Content of set are :
1546622676 Sachin Team Leader 54000
-302767206 Anupam Programmer 34000
149315535 Ravi Administrator 44000
199998062 Sachin Programmer 24000
1407883922 Priyanka Manager 54000
597555555 Ram Trainer 34000
**********************************
Removing following Emp from the set...
149315535 Ravi Administrator 44000
No. of elements after removal 5
3 . If I comment equals() method only and not hashcode() then I get the following result
There are 7 elements in the set.
Content of set are :
1546622676 Sachin Team Leader 54000
-302767206 Anupam Programmer 34000
149315535 Ravi Administrator 44000
199998062 Sachin Programmer 24000
1407883922 Priyanka Manager 54000
597555555 Ram Trainer 34000
597555555 Ram Trainer 34000
**********************************
Removing following Emp from the set...
149315535 Ravi Administrator 44000
No. of elements after removal 7
请告知三种方法背后的共鸣……!
解决方法:
HashSet有许多桶.它使用hashCode()来确定元素属于哪个存储桶,然后在该存储桶内,使用equals()来查找该存储桶中是否存在该元素.
这些方法的默认实现是hashCode()使用系统身份哈希码,这可能是它的内存位置,但是独特之处在于系统将尝试使用所有“合理实际”尝试使两个对象没有相同的系统identity hashcode和equals比较两个对象的内存位置. (请注意,系统身份哈希码不能保证产生唯一的哈希值;相反,它会尝试真正地,真的地,非常难以为您提供独特的哈希值.请参阅Java Bug 6321873以进一步阅读此事.)
因此,掌握了这些知识,可以通过各种方法的逻辑应用来预测不同的方法,无论它们是实现还是使用默认实现.
在你的第一种情况下,Ram出现在两个不同的桶中,因此两个Ram对象永远不会相互比较.它们使用以下行进行比较(至少在Sun实现中)
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
这是迭代桶中的每个对象.它们的哈希值不相等,所以它永远不会检查确定对象本身是否等于所提供的对象.
在你的第二个案例中,它可以按照你的预期运作,并指出一个有两个不同职位和薪水的人将被视为不同的人.
在你的第三种情况下,Ram两次进入同一个桶.但是因为使用了默认的equals方法,并且这两个对象是不同的对象,所以它会再次添加.
同样值得重申的是,duffymo的回答完全忽略了你的问题;在99.9%的情况下,我会说这是错误的,我们应该先了解你的问题范围.这是极少数情况下忽略您的问题的正确电话之一.您永远不应该只覆盖hashcode和equals中的一个.你应该总是不做或两者兼而有之,不要只做一件.
内容总结
以上是互联网集市为您收集整理的java – Hashcode()Vs Equals()全部内容,希望文章能够帮你解决java – Hashcode()Vs Equals()所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。