为了账号安全,请及时绑定邮箱和手机立即绑定

如果是lisi覆盖zhangsan,或者输出zhangsan忽略lisi。那调用的equals?

如果是lisi覆盖zhangsan,或者输出zhangsan忽略lisi。那调用的equals?

智慧大石 2022-05-01 14:10:21
我想问下HashSet类中的Set.add方法,如果add相同的两个对象,是不是通过equals方法对比后,只在堆内存中生成一个对象?到底是覆盖第一个还是忽略后面的那个呢?我做了个实验,第一步:设定一个Student类,并且重写了该类中的equals方法,返回值的boolean类型为true(因为我要查明是覆盖还是忽略,所以让他不管相同还是不相同都返回true)。第二部:生成HashSet类并向上转型为Set,之后生成两个不同对象并且使用Set.add()添加。具体代码如下import java.util.Set;import java.util.HashSet;import java.util.Iterator;class Student{ String name ; int age; public Student() { } public Student(String name, int age) { this.name = name ; this.age = age ; } public boolean equals(Object o) { System.out.println("equals"); return true; } public static void main(String args []) { Set set = new HashSet(); Student s1 = new Student("zhangsan",20); Student s2 = new Student("lisi",21); System.out.println(s1.equals(s2)); set.add(s1); set.add(s2); Iterator it = set.iterator(); while(it.hasNext()) { Student s = (Student)it.next(); System.out.println(s.name); } }} 结果为:equalstruelisizhangsan 
查看完整描述

2 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

这个就要说一下所谓的散列的概念了。像Set,Map这种东东在判断你的两个对象是否是一样的时候先回去判断你的hashCode方法返回的值是否一致,如果一致再去判断equals方法返回的值。所以,这个地方,你想玩的话,hashCode方法是需要重写的啦,像这种hashCode和equals方法在重写的时候有许多java规约性的东西。这里顺便就说一下散列桶这个东西吧,在Set,Map这种容器里面存放对象数据的时候,这些数据以存在以hashCode为单位的散列桶里面的,hashCode相同的对象就会被放在同一个散列桶里面,在查找的时候会先定位到散列桶,然后再用equals方法去匹配散列桶里面的具体对象。所以,如果你定义的对象需要被存放在这类容器里面的话,hashCode和equals方法的重写就需要好好考虑一下了,不然会非常影响效率的。

查看完整回答
反对 回复 2022-05-04
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

import java.text.DateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class test {
static class Student {
String name;
int age;

public Student() {
}

public Student(String name, int age) {
this.name = name;
this.age = age;
}

public int hashCode(){
return 1000;
}
public boolean equals(Object o) {
return true;
}

public static void main(String args[]) {
Set set = new HashSet();
Student s1 = new Student("zhangsan", 20);
Student s2 = new Student("lisi", 21);
System.out.println(s1.equals(s2));
set.add(s1);
set.add(s2);
Iterator it = set.iterator();
while (it.hasNext()) {
Student s = (Student) it.next();
System.out.println(s.name);
}
}
}

}

把代码改了一下 这下运行一下你该明白了
运行结果是
true
zhangsan



查看完整回答
反对 回复 2022-05-04
  • 2 回答
  • 0 关注
  • 347 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信