Joshua Bloch 的《Effective JAVA》中,当我阅读有关静态工厂方法的内容时,有这样的说法:
静态工厂方法返回相同对象的能力
重复调用允许类保持严格的控制
任何时候都存在哪些实例。据说执行此操作的类是
实例控制。写的原因有几个
实例控制的类。实例控制允许类
保证它是单例(第 3 项)或不可实例化(第 4 项)。
此外,它允许一个不可变的类(第 15 条)来做出保证
不存在两个相等的实例:a.equals(b) 当且仅当 a==b。如果
一个类做出了这样的保证,那么它的客户就可以使用 ==
运算符而不是 equals(Object) 方法,这可能会导致
提高性能。枚举类型(第 30 项)提供了这种保证。
要研究 == 运算符如何带来性能改进,
我得看看字符串.java https://upsource.jetbrains.com/lib/view/jdk7u10/java/lang/String.java;nav:0:0:focused
我看到了这个片段
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 个不同的内存空间,但仍然保存相同的数据,即内存浪费。如果它们保存相同的数据,那么它们就是同一个对象。也就是说,它们指向相同的内存位置。
我的这个推论正确吗?
如果我错了,你能指导我理解这一点吗?
如果每个类都可以保证 a.equals(b) 当且仅当 a==b 时,这意味着它带来了一个间接要求,即不能有对象引用 2 个不同的内存空间,但仍然保存相同的数据,即内存浪费。如果它们保存相同的数据,那么它们就是同一个对象。也就是说,它们指向相同的内存位置。
是的,这就是作者的目的。
如果可以(对于给定的类,这对所有人来说都是不可能的,特别是它不适用于可变类)调用==
(这是单个 JVM 操作码)而不是equals
(这是动态分派的方法调用),它节省了(一些)开销。
它以这种方式工作enum
例如。
即使有人打电话给equals
方法(这将是很好的防御性编程实践,你不想养成使用的习惯==
对于对象恕我直言),该方法可以实现为一个简单的==
(而不必查看潜在的复杂对象状态)。
顺便说一句,即使对于“普通”equals 方法(例如 String 的),在其实现中首先检查对象身份,然后快捷地查看对象状态可能是一个好主意(这就是 String#equals 所做的,就像您一样)已经发现了)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)