Set集合的核心作用是自动去重—— 它会确保集合中不会包含 “重复” 的元素。
具体到这段代码的场景:代码创建了两个属性(name、age)完全一样的Stu对象(stu1和stu2),然后把它们放入Set中;如果Set能识别这两个对象是 “重复” 的,最终集合里只会保留一个Stu实例。
不过要注意:这段代码目前无法实现正确去重—— 因为Set判断元素是否重复的规则是:
- 先比较两个元素的
hashCode是否相等; - 如果
hashCode相等,再调用equals判断是否相等。
而这段代码只重写了equals,但没重写hashCode(默认hashCode是对象的内存地址),所以stu1和stu2的hashCode不相等,Set会认为它们是不同元素,最终集合里还是会保留两个对象。
代码如下
package caseclass
object class1 {
// Set是可以去重的
// 创建一些对象,把他们装入Set,看看是否能去重!
class Stu(var name:String, var age:Int) {
override def equals(obj: Any): Boolean = {
val other = obj.asInstanceOf[Stu]
other.age == age && other.name == name
}
override def toString: String = s"Stu(${name}, ${age})"
}
def main(args: Array[String]): Unit = {
val stu1 = new Stu("小花", 18)
val stu2 = new Stu("小花", 18)
println(stu1)
println(stu1 == stu2)
val set1 = Set(stu1, stu2)
println(set1)
}
}
运行结果