set

31 阅读1分钟

Set集合的核心作用是自动去重—— 它会确保集合中不会包含 “重复” 的元素。

具体到这段代码的场景:代码创建了两个属性(nameage)完全一样的Stu对象(stu1stu2),然后把它们放入Set中;如果Set能识别这两个对象是 “重复” 的,最终集合里只会保留一个Stu实例。

不过要注意:这段代码目前无法实现正确去重—— 因为Set判断元素是否重复的规则是:

  1. 先比较两个元素的hashCode是否相等;
  2. 如果hashCode相等,再调用equals判断是否相等。

而这段代码只重写了equals,但没重写hashCode(默认hashCode是对象的内存地址),所以stu1stu2hashCode不相等,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)
  }
}

运行结果

image.png