2015-05-04 59 views
1

我有一个Java类以下。区分Java对象

public class MyClass { 

private final String id; 

public MyClass(final String id) { 
    this.id= id; 
} 

public String getId() { 
    return id; 
} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result 
      + ((id == null) ? 0 : id.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(final Object obj) { 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    final MyClass other = (MyClass) obj; 
    if (id== null) { 
     if (other.getId != null) 
      return false; 
    } else if (!id.equals(other.getId)) 
     return false; 
    return true; 
} 

} 

现在我正在创建2个这个类的对象。

MyClass obj1 = new Object("ABCD"); 
MyClass obj2 = new Object("ABCD"); 

根据我的类定义,这两个对象是相等的。但在堆中,我相信会创建2个不同的对象。

如果我想证明,虽然两个对象是平等的,但他们仍然不同,我该怎么做?

回答

4
if(obj1 == obj2) 
    ; // Same object 

if(obj1.equals(obj2)) 
    ; // Equal objects (as defined by your equals() method). 

当使用new时会创建一个不同的对象,所以是有两个相等但分开的对象。

+0

'不同的对象,所以是有两个相等但分开的objects':除了已汇集机构('String'类,“Ingeter”在-256到255之间......)。但是,是的,我承认这不是问题的重点:D – Dici

+1

@Dici:整数池是从-128到127. –

+0

@Dici'new String()'将创建一个新对象,与Integer相同。只有在字符串被创建为字面值时才会发生池化,或者使用Integer.valueOf()/ Long.valueOf()创建'Integer/Long'自动装箱或创建。 – Kayaman

0

不知道正是你想做的事,但是这应该回答你:

  • equals实现逻辑平等
  • ==是物理平等(的身份),这意味着,如果返回true,它是实际相同的对象
0

为了比较对象的相等性,您需要使用equals()

如果您想检查引用是否直接显示给同一对象,则必须使用==运算符。

代码片断:用于当新创建

MyClass obj1 = new Object("ABCD"); // create first object at heap 
MyClass obj2 = new Object("ABCD"); // create second object at heap 

obj1.equals(obj2); // true 
obj1 == obj2;  // false 
obj1 == obj1  // true