Tin*_*iny 7 java string equals
Object o1 = new Object();
Object o2 = new Object();
//o1=o2;
System.out.println(o1.equals(o2));
Run Code Online (Sandbox Code Playgroud)
它回来了false.true如果删除了注释,它可以返回.
为什么不适合String同班同学?
String s1=new String();
String s2=new String();
System.out.println(s1.equals(s2));
Run Code Online (Sandbox Code Playgroud)
它回来了true.为什么?(因为String使用实习生或其他涉及的东西?)
ppe*_*rka 19
因为String的equals()比较内容,而不是对象本身.
public boolean equals(Object anObject)
将此字符串与指定的对象进行比较.当且仅当参数不为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;
}
Run Code Online (Sandbox Code Playgroud)
(链接到String.equals()的源代码)
与对象相等:
类的equals方法
Object实现了对象上最具辨别力的等价关系; 即,对于任何非空的参考值x和y,当且仅当该方法返回truex,并y指代相同的对象(x == y具有值true).
/* Object.equals() */
public boolean equals(Object obj) {
return (this == obj);
}
Run Code Online (Sandbox Code Playgroud)
(链接到Object.equals()的源代码)
另外,不要忘记equals()功能合同:
equals方法在非null对象引用上实现等价关系:
- 它是自反的:对于任何非空引用值
x,x.equals(x)应该返回true.- 它是对称的:对于任何非空引用值
x和y,x.equals(y)应真,当且仅当返回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.
还建议阅读:
equals用于Object比较内存引用.
这就是为什么它是假的,因为它们是不同的Object小号
equals的String是重写的比较基础上的人物.
你有两个空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 工作。
| 归档时间: |
|
| 查看次数: |
42637 次 |
| 最近记录: |