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

我想问下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 

智慧大石
浏览 348回答 2
2回答

慕姐8265434

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

猛跑小猪

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);}}}}把代码改了一下 这下运行一下你该明白了运行结果是truezhangsan
打开App,查看更多内容
随时随地看视频慕课网APP