第一步就是比较两个对象的hash值是否相同(注意这里的hash值是经过处理的,为了使散列更均匀)
hash值相同的就会散列到一组 不相同就会散列到不同的组(此时就不会再继续比较了,因为在不同组hashset认为他们就是不同的对象)
第二步 如果hash值相同 则进行连等判断 即比较内存地址是否相同 如果不相同那么hashset就认为他们肯定不是相同的对象 如果内存地址相等(这一步最主要的目的其实就是删除元素的时候判断)那么进行第三步
第三步 如果equals返回相同 那么他们就是彻彻底底的相同的对象 不能添加到set里,如果返回不同那么他们就不是彻底的不相同 就可以添加到一个set里
楼主明白了吧,纯手打,希望对你有帮助
1问号,删除了。2问号,不出现了
JDK 1.6.30 测试过
java.util.HashSet<String>set = new java.util.HashSet<String>()
set.add("123")
set.add("123")
System.out.println(set)
set.remove("123")
System.out.println(set)
命令行输出
[123]
[]
因为你只重写了equals方法 没有重写hashCode方法
HashSet 判断元素是否相等 , 首先调用hashCode方法,
如果hashCode的值一样, 那么调用equals方法,
如果equals方法也一样, 那么才算重复元素, 不在添加
所以没有重写hashCode方法的时候, stu2和stu3的hashCode值不一样,
你就可以添加两次相同的元素
修改后的代码
import java.util.*class Student {
private String id
private String name
public Student(String id, String name) {
this.id = id
this.name = name
}
public String toString() {
return id + ":" + name
}
public int HashCode() {
return this.id.hashCode()
}
public boolean equals(Object obj) {
if (this == obj) {
return true
}
if (!(obj instanceof Student)) {
return false
}
Student stu = (Student) obj
boolean b = this.id.equals(stu.id)
return b
}
public int hashCode() {//重写hashCode方法
final int prime = 31
int result = 1
result = prime * result + ((id == null) ? 0 : id.hashCode())
result = prime * result + ((name == null) ? 0 : name.hashCode())
return result
}
}
public class xuexi {
public static void main(String[] args) {
HashSet hs = new HashSet()
Student stu1 = new Student("1", "Jack")
Student stu2 = new Student("2", "Rose")
Student stu3 = new Student("2", "Rose")
hs.add(stu1)
hs.add(stu2)
hs.add(stu3)
System.out.println(hs)
}
}
测试
[2:Rose, 1:Jack]欢迎分享,转载请注明来源:内存溢出
评论列表(0条)