【发布时间】:2013-11-30 09:43:52
【问题描述】:
在 Joshua Bloch 的 Effective JAVA 中,当我阅读静态工厂方法时,有如下声明
静态工厂方法返回相同对象的能力 重复调用允许类保持严格的控制 任何时候都存在哪些实例。据说这样做的类是 实例控制。写作有几个原因 实例控制的类。实例控制允许一个类 保证它是单例(第 3 项)或不可实例化(第 4 项)。 此外,它允许不可变类(第 15 条)做出保证 不存在两个相等的实例:a.equals(b) 当且仅当 a==b。如果 一个类做出这个保证,然后它的客户可以使用 == 运算符而不是 equals(Object) 方法,这可能会导致 改进的性能。枚举类型(第 30 项)提供了这种保证。
要研究 == 运算符如何带来性能改进, 我得看看String.java
我看到了这个sn-p
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
这里所说的性能改进是什么意思?它如何带来性能提升。
他是不是想说下面的意思
如果每个类都可以确保 a.equals(b) 当且仅当 a==b 时,这意味着它带来了一个间接要求,即不能有对象引用 2 个不同的内存空间并且仍然持有相同的数据,这是内存浪费。如果它们持有相同的数据,它们就是同一个对象。也就是说,它们指向相同的内存位置。
我的推断是否正确?
如果我错了,你能指导我理解这一点吗?
【问题讨论】:
-
但这是否意味着 String a = "xyz";和 String b ="xyz" 一起是浪费内存,是不可能的?这不是用例吗?
-
字符串字面量始终在 Java 中。所以你会发现,在你的例子中,
a == b.
标签: java performance equals referenceequals