簡體   English   中英

Java中的平等

[英]Equality in java

Java中的==運算符檢查兩個對象是否在同一內存位置。 這樣做的意思是,如果object1 != object2object1不與obejct2鏈接? 通過鏈接,我的意思是如果object1被更改,那么obejct2也被更改。

它檢查兩個指針​​是否相等,即。 他們指向相同的對象。

==檢查兩個引用是否相同。

換句話說:如果該檢查返回true,則只有一個對象。

如果返回false,則有兩個對象。

但是,當然可以輕松地編寫一些代碼,其中a = b。 但是a.foo()將對b產生影響。

喜歡:

class Bar {
  private static int counter = 0;
  void foo() { counter++ };
  int getCounter() { return counter; }

當您現在擁有:

Bar a = new Bar();
Bar b = new Bar();

然后a!= b; 但是當你這樣做時

System.out.println(b.getCounter());
a.foo();
System.out.println(b.getCounter());  

將打印0,然后打印1。

因此,在本質上,回答你的第二個問題是:A = B 並不意味着“做了什么”無助於B”。

但是,根據記錄,最后一句話是為什么在良好的OO設計中可以將static視為異常的原因; 正是針對這種“奇怪”的副作用。

編輯以回答“容器和克隆會發生什么”?

當然,當您遇到以下情況時:

List<WhatEver> a = some list containing one object "X"
List<WhatEver> b = a "clone" of a

然后a!= b; 但是當然; 當您調用影響b.get(0)的a.get(0).foo()...時,因為兩個列表內部指向同一X

您會看到:在這種情況下,a.equals(b)將返回true 而a == b為假。

首先– object1object2本身不是對象,它們都是保存對對象的引用的變量(除非為null)。 因此, ==不會檢查兩個對象是否在同一內存位置(因為這不可能發生),而是檢查兩個變量是否持有對同一對象的引用。 因此,如果object1!= object2,則這兩個變量不包含對同一對象的引用。

我認為通過示例可以更容易理解,IMHO的最佳示例是重寫equals,創建帶有名稱和年齡的Human實例時,方法equals讀取:

  • 如果(例如John)與John相同,則兩個人都相等(John的克隆)
  • 如果傳遞的對象不是人類,則返回false,它們不相同(例如,一條狗,誰知道)
  • 然后逐一檢查每個人是否相同,即使他們是不同的人,也可能有另一個約翰具有相同的年齡。

      public class Human { private final String name; private final int age; public Human(String name, int age) { this.name = name; this.age = age; } public String getName() { return this.name; } public int getAge() { return this.age; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof Human)) { return false; } Human that = (Human) o; if (this.age != that.age) return false; return this.name != null ? this.name.equals(that.name) : that.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM