java中的平等

时间:2016-10-11 18:22:53

标签: java equality

java中的==运算符检查两个对象是否位于同一内存位置。这意味着,如果object1 != object2,那么object1obejct2没有关联?通过链接,我的意思是如果更改object1,则obejct2也会更改。

4 个答案:

答案 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)

首先 - object1object2本身不是对象,它们每个都是保存对象引用的变量(除非为null)。因此,==不检查两个对象是否在同一个内存位置(因为这可能发生),但检查两个变量是否保持对同一对象的引用。因此,如果object1!= object2,则这两个变量不包含对同一对象的引用。

答案 3 :(得分:0)

我认为通过一个例子更容易理解,最好的例子是当你重写equals时,当你创建具有名字和年龄的Human实例时,方法等于读取:

  • 如果(例如约翰)和约翰一样,那么两个人都是平等的(约翰的克隆)
  • 如果传递的对象不是人类,则返回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;
            }
        }