java HashSet类添加元素的问题

java HashSet类添加元素的问题,第1张

HashSet 比较两个对象是否相同的机制是 1.hash 2. == 3.equals()

第一步就是比较两个对象的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]


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/8006795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存