与 equals 相比,使用 == 运算符如何带来性能提升?

2023-12-30

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(使用前将#替换为@)

与 equals 相比,使用 == 运算符如何带来性能提升? 的相关文章

随机推荐