您的当前位置:首页正文

String中equals源码解析

来源:华佗小知识

之前,我写过一个怎样重写Object的equals方法,现在我们来看看String是怎样重写equals方法的。
代码如下:

/** The value is used for character storage.*/
    private final char value[];


public boolean equals(Object anObject) {
    //首先判断比较的字符串是不是本身
    if(this == anObject) {
       return true;
    }
    //判断Object是否是String类型
    if(anObject instanceof String) {
      // true 进行强制类型声明
    String anotherString = (String) anObject;
    //获取char类型数组的长度
      int n = value.length;
      //比较 anotherString转换成字符数组的长度是否相等
      if(n == anotherString.value.length) {
        //分布定义两个char[]
            char v1[] = value;
            char v2[] = anotherString.value;
            /*
             *循环递减直到字符数组长度直到不为0
             * 依次从下标0开始比较两个char[]
             */
             int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
      }
      
      
    }
    return false;
}

这段代码的执行步骤主要有:

  • 按照Object规范重写equals方法
  • 如果对象是String类型在进行数组是否相等比较
大家仔细看,String比较两个字符串相等实际上是将字符串拆分成单个字符数组在进行比较的,在数组比较是否相等时,源码设计用了一个算法:
  • 首先比较两个数组是否相等,不相等则直接返回false
  • 如果两个数组相等,在用一个while循环从一次比较每个数组元素.(规避了用两个for循环比较数组的性能)。

运用这个算法怎样比较两个数组是否相等

package com.minglangx.array;

import org.junit.Assert;
import org.junit.Test;

public class ArraysEquals {

    public static void main(String[] args) {
        
        
        String[] str1 = {"a","b","c"};
        String[] str2 = {"a","b","c"};
        //比较这两个数组是否元素是否相等  保证数组上每个位置上元素都是一样的
        
        boolean boo = equalStringArray(str1, str2);
        System.out.println("str1[]和str2[]是否相等>>>>>" + boo);
        
        
        
    }
    
    
    
    
    @Test
    public static boolean equalStringArray(String[] str1,String[] str2) {
        
        //如果采用两层for循环的话效率很慢
        
        
        if(str1.length == str2.length) { //先判断两个数组长度是否相同
            int n = str1.length;
            int i = 0;
            while(n-- != 0) {            
                if(str1[i] != str2[i]) {   //依次比较2个数组
                    return false;
                }
                
                i++;
            }
            return true;
        }
        
        return false;//数组长度不相等 则证明根本不是相同的两个数组
        
    }

}