Star

Java中的比较

equals, == 和compareTo

  • == 操作符并不涉及对象内容的比较。
  • equals 比较的是reference,也就是引用内容
  • compareTo(): 在基本数据中,compareTo()是比较两个Character 对象; 在 Boolean中,是用boolean的实例于其它实例进行比较; 在String 中,则是按照字典顺序进行比较,返回的值是一个int 型。

<pre class="editor-colors lang-text"><div class="line"><span class="text plain"><span> </span><span class="meta paragraph text"><span>String a = "abc";</span></span></span></div><div class="line"><span class="text plain"><span class="meta paragraph text"><span> String b = "abc";</span></span></span></div></pre>

a == b: **true**

a.equals(b): true

a.compareTo(b): ** 0**

<pre class="editor-colors lang-text"><div class="line"><span class="text plain"><span> </span><span class="meta paragraph text"><span>String a = new String("abc");</span></span></span></div><div class="line"><span class="text plain"><span class="meta paragraph text"><span> String b = new String("abc");</span></span></span></div></pre>

 a == b: **false**

这是因为,对于对象的比较是对对象引用的比较。a和b的内存地址不同,对象引用不同

a.equals(b): true

a.compareTo(b): ** 0**

  • 在继承了Comparabale接口的类中,compareTo()的应该与euqals()一致,比如 x.equals(y) == true, 则 x.compareTo(y) == 0

关于equals和hashcode

实际上,equals虽然说是表面比较是否一致,但是实际的原理是于hashcode()方法有关的。 比如上例中的String的比较,是因为String重写了hashcode()和equals() 方法。

  • 如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。

  • 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。

  • 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。