Object o1 = new Object();
Object o2 = new Object();
//o1=o2;
System.out.println(o1.equals(o2));
它返回false
。 它可以返回true
,如果注释被删除。
为什么不是适用于同样的事情String
类?
String s1=new String();
String s2=new String();
System.out.println(s1.equals(s2));
它返回true
。 为什么? (因为String
使用实习生或别的参与?)
由于equals()方法用于字符串的内容,而不是对象本身进行比较。
公共布尔等于(object对象)
比较此字符串与指定的对象。 当且仅当该参数不是null,是一个结果是真String
表示相同的字符序列与此对象的对象。
/* String.equals() */
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
(链接到的源String.equals() )
对战平等的对象 :
对于类的equals方法Object
实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空引用值x
和y
,这种方法当且仅当返回true x
和y
指代相同的对象( x == y
的值为true
)。
/* Object.equals() */
public boolean equals(Object obj) {
return (this == obj);
}
(链接的源的Object.Equals() )
另外,不要忘了合同equals()
函数:
equals方法实现对非空对象引用的一个等价关系:
- 自反性 :对于任何非空的参考值
x
, x.equals(x)
应返回true。 - 它是对称的 :对于任何非空引用值
x
和y
, x.equals(y)
应返回true当且仅当y.equals(x)
返回true。 - 传递性 :对于任何非空引用值
x
, y
,和z
,如果x.equals(y)
返回true
和y.equals(z)
返回true
,那么x.equals(z)
应该返回true
。 - 它是一致的 :对于任何非空引用值
x
和y
,多次调用x.equals(y)
始终返回true
或始终返回false
,没有设置中使用的信息等于在对象上比较被修改。 - 对于任何非空引用值
x
, x.equals(null)
应该返回false
。
同时推荐阅读:
- 是Object.hashCode()
- 有效的Java(布洛克)
equals
为Object
进行比较的内存引用。
这就是为什么它是假的,因为它们是不同的Object
小号
equals
为String
被覆盖比较基础上的人物。
你有2个空String
,这就是为什么对象equals
返回true
。
==
比较对象/串/任何东西的地址
.equals()
设计为使用对象的内部状态进行比较。
所以:
new Object() == new Object() => false
-在存储器中的不同地址两个单独的对象。
new String("a") == new String("a") => false
-同样的情况-为对字符串对象两个单独的地址。
new String("a").equals(new String("a")) => true
-地址不同,但Java将带着一个对象状态( 'a')和与其他对象状态( 'A')相比,会发现他们平等的,并将报告真实。
使用equals()方法,你可以编写比较任何方式是正确的为您的程序。
intern()
是有点不同的故事。 它的目的是为同一个字符序列返回相同的对象(地址)。 当你有相同的字符串构成几次这是为了减少所需的存储量非常有用。
new String("aaa").intern()
将在设备内存谋求如果曾经有人创建了“AAA”字符串前,将返回字符串的第一个实例...如果不被发现-当前一个将被征作为第一个和所有进一步的“AAA” .intern()和新的String("aaa").intern()
和("a"+"aa").intern()
将返回“第一”的实例。
当心: "aaa".intern()
是不是很快速的操作,如果你将实习生的所有字符串-你会节省一些内存,但将失去相当多的CPU工作。
在equals
的实施Object
类只比较引用。 这里是源代码:
public boolean equals(Object obj) {
return (this == obj);
}
equals方法需要在类中被重写,如果你想让它在一些其他的方式表现。 默认情况下,它会检查两个引用是否指向同一个对象。
该equals()
的方法Object
类不知道如何比较字符串,它只知道如何比较的对象。 对于比较字符串,字符串类将重写equals()
方法和它比较字符串。
Object.equals()
将只比较基准,其中String.equals()
将比较值。