zoukankan      html  css  js  c++  java
  • 【Java源码解读】String中的equals方法

    //简单来说,就是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。
    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;
        }

    equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

    下面解读一下这个:

     while (n--!= 0) {
     if (v1[i] != v2[i])
     return false;
     i++; 
     }

    这段代码是用于判断字符串是否相等,但有个奇怪地方是用了 n-- != 0 来做判断,我们通常不是用 n++ 么?为什么用 n-- 呢?而且循环次数相同。

    原因在于编译后会多一条指令:(下面将n--说成i--,方便理解!)

    i-- 操作本身会影响 CPSR(当前程序状态寄存器),CPSR 常见的标志有 N(结果为负), Z(结果为 0),C(有进位),O(有溢出)。 i > 0 ,可以直接通过 Z 标志判断出来。
    i++ 操作也会影响 CPSR(当前程序状态寄存器),但只影响 O(有溢出)标志,这对于 i < n  的判断没有任何帮助。所以还需要一条额外的比较指令,也就是说每个循环要多执行一条指令。

    简单来说,跟 0 比较会少一条指令。所以,循环使用 n-- ,高端大气上档次

  • 相关阅读:
    Ubuntn16.04+OpenCV3.1+CUDA8.0+cudnn5.1+caffe配置及问题集锦
    理解最短路径-Dijkstra算法
    使用git命令从github上clone项目
    Vscode中问题
    windows和ubuntn互传文件
    Python中的一些模块用法
    机器学习中矩阵的求导知识
    训练集,验证集,测试集
    Javascript、Jquery获取浏览器和屏幕各种高度宽度
    DTCMS规格统一赋值
  • 原文地址:https://www.cnblogs.com/tzeyeung/p/13531343.html
Copyright © 2011-2022 走看看