当前位置:   article > 正文

Kotlin/Java hashCode与equals/==号(1)

Kotlin/Java hashCode与equals/==号(1)

Kotlin/Java hashCode与equals/==号(1)

 

Kotlin/Java的hashCode()方法默认返回对象在内存中地址的整数值。

  1. fun main(args: Array<String>) {
  2. val u1 = User("zhang", 1)
  3. val u2 = User("phil", 2)
  4. println("$u1 ${u1.hashCode()}")
  5. println("$u2 ${u2.hashCode()}")
  6. }
  7. class User {
  8. private var name: String? = null
  9. private var id: Int? = 0
  10. constructor(name: String, id: Int) {
  11. this.name = name
  12. this.id = id
  13. }
  14. }

User@1ddc4ec2 500977346
User@133314b 20132171

@后面的16进制值即对象在内存中的地址,16进制转为10进制后即是hashCode():

1ddc4ec2转为十进制即是500977346

133314b转为十进制即是20132171

当在Kotlin/Java代码中用 == 比较两个对象是否相等(在kotlin中,如果使用equals()比较两个对象是否相等,ide会建议把equals换用 ==),比较的是对象在内存中的地址,如果两个对象的内存地址相同,那么Kotlin/Java就返回true,否则false。Java的Object中。默认的equals()实现:

  1. public boolean equals(Object obj) {
  2. return (this == obj);
  3. }

Kotlin/Java比较两个对象是否相同的equals方法(相当于==),是根据两个对象的内存地址,如果默认不重写hashCode()实现,即可以简单理解为比较hashCode()的值是否相等,因为hashCode()值即为内存地址值。

以上说的是Kotlin/Java默认不重写hashCode与equals()方法时候的情景。如果定义的Kotlin/Java对象没有重写hashCode和equals,那么Kotlin/Java就调用根(super)的Obejct的hashCode()和equals()方法。

如果开发者重写了hashCode(),那么Object默认的toString()是把hashCode值转为十六进制,

Kotlin/Java默认的toString():

  1. public String toString() {
  2. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  3. }

是类名加上把hashCode()转为十六进制。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/230960
推荐阅读
相关标签
  

闽ICP备14008679号