[英]Equality in java
Java中的==
運算符檢查兩個對象是否在同一內存位置。 這樣做的意思是,如果object1 != object2
則object1
不與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為假。
首先– object1
和object2
本身不是對象,它們都是保存對對象的引用的變量(除非為null)。 因此, ==
不會檢查兩個對象是否在同一內存位置(因為這不可能發生),而是檢查兩個變量是否持有對同一對象的引用。 因此,如果object1!= object2,則這兩個變量不包含對同一對象的引用。
我認為通過示例可以更容易理解,IMHO的最佳示例是重寫equals,創建帶有名稱和年齡的Human實例時,方法equals讀取:
然后逐一檢查每個人是否相同,即使他們是不同的人,也可能有另一個約翰具有相同的年齡。
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.