java中的==
运算符检查两个对象是否位于同一内存位置。这意味着,如果object1 != object2
,那么object1
与obejct2
没有关联?通过链接,我的意思是如果更改object1
,则obejct2
也会更改。
答案 0 :(得分:3)
检查两个指针是否相等,即。他们指向同一个对象。
答案 1 :(得分:3)
==检查两个引用是否相同。
换句话说:如果该检查返回true,则只有一个对象。
如果返回false,则有两个对象。
但是当然,人们可以轻松地编写一些代码,其中!= 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"。
但是对于记录 - 最后一句话是 static 可以被视为良好OO设计中的异常的原因;正是为了这样的"奇怪的"副作用。
编辑以回答"容器和克隆会发生什么?"?
当然,当你有类似的东西时:
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是假的。
答案 2 :(得分:0)
首先 - object1
和object2
本身不是对象,它们每个都是保存对象引用的变量(除非为null)。因此,==
不检查两个对象是否在同一个内存位置(因为这可能发生),但检查两个变量是否保持对同一对象的引用。因此,如果object1!= object2,则这两个变量不包含对同一对象的引用。
答案 3 :(得分:0)
我认为通过一个例子更容易理解,最好的例子是当你重写equals时,当你创建具有名字和年龄的Human实例时,方法等于读取:
然后逐个字段检查,如果这个人是相同的,可能会有另一个年龄相同的约翰,即使他们是不同的人。
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;
}
}