set去重:底层使用了hashMap进行去重,而hashMap判定元素是否相同时调用了hashcode,equals方法。
若在使用过程中使用set来装自定义类型并且想要达到去重的目的需要实现hashcode,equals方法
在使用中发现若用set装自定义的case class会自动实现去重,代码如下:
case class Name(name:String)
def main(args: Array[String]): Unit = {
val names = mutable.Set[String]()
names += "lixin"
names += "lixin"
names.foreach(println)
val nameObjects = mutable.Set[Name]()
nameObjects += Name("lixin")
nameObjects += Name("lixin")
nameObjects += Name("lijing")
nameObjects.foreach(println)
打印结果:
lixin
Name(lixin)
Name(lijing)
测试:
println(Name("lixin").equals(Name("lixin")))
println(Name("lixin") == Name("lixin"))
println(Name("lixin").hashCode())
println(Name("lixin").hashCode())
打印结果:
true
true
1791894882
1791894882
结论:case class与字符串都能实现自动去重。
原理:
set调用hashcode,equals方法判断是否相同,case class默认实现了这两个方法所以能够去重;