关于kotlin中的比较器
这两者有什么不同关于kotlin中的比较器,kotlin,equals,Kotlin,Equals,这两者有什么不同 fun main(args: Array<String>) { var a = printName("Jennie") var b = printName("Jennie") println(a == b) // compiler : false var c = "Robert" var d = "Robert" println
fun main(args: Array<String>) {
var a = printName("Jennie")
var b = printName("Jennie")
println(a == b) // compiler : false
var c = "Robert"
var d = "Robert"
println(c == d) // compiler : true
}
class printName(val name : String)
趣味主线(args:Array){
var a=打印名(“珍妮”)
var b=打印名(“珍妮”)
println(a==b)//编译器:false
var c=“罗伯特”
var d=“罗伯特”
println(c==d)//编译器:true
}
类printName(val名称:String)
使用该类时,即使字符串类型相同,结果也是
false
。但是如果我不使用class,那么发生的事情就是true
如果你想使用class
,你必须重写equals
和hashcode
。但是,如果要比较对象,如等于且hashcode
已在数据类中处理,也可以使用数据类
,c
和d
是对同一字符串
实例的引用(编译器看到两个字符串文本是相同的,并将它们合并。)但即使它们是不同的string
实例,它们仍然会作为相等的实例进行比较。这是因为调用该方法,并且string
重写该方法,以便在两个字符串具有相同字符时返回true
在第一种情况下,a
和b
是对不同的printName
*实例的引用。(printName()
是对其构造函数的调用,因此每次调用都返回一个新实例。)并且printName
类不重写,因此它从其超类继承默认实现(Any
)。对于不同的实例,该实现总是返回false,而不管它们的内容是否相同
如果希望不同的printName
实例在内容相同的情况下进行相等比较,则应重写其equals()
方法。您可以手动执行此操作,例如:
class PrintName(val name: String) {
override fun equals(other: Any?) = other is PrintName
&& name == other.name
}
或者您可以将其设为一个,它会自动执行此操作。(它还添加了toString()
和其他一些有用的方法,但在构造函数和继承方面有一些限制。)
另一种选择可能是共享或缓存printName
s,而不是每次创建一个新的
(*顺便说一句,通常使用以大写字母开头的类名,因此它们非常突出。)您的类不会覆盖equals
,而字符串会覆盖。