Object.equals 和 String.equals的区别

发布时间 2023-07-08 23:05:02作者: 一只礼貌狗

一.  源码展示:

1. Object.equals:  

  ①引用类型地址值比较,直接返回结果:true || false

public class Object { 
   public boolean equals(Object obj) {
        return (this == obj);
    }
}

 

2. String.equals:  

  ① 判断地址值是否相等,若相等 返回 true,若不等则进入下列判断 ;

  ② 判断参数是否为String类型,若不是 返回false,若是则进入下列判断;

  ③ 判断字符串长度是否相等,若不等 返回false,若相等则进入下列判断 ;

  ④ 判断索引位置的字符是否相同,若不等 返回false,若相等,则返回true;

  • 字符串的内容相等指的是字符序列完全相同,包括字符的顺序和大小写敏感。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {

  private final char value[];
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; } }

 

二. 二者区别

   1. 作用域:

     Object类是Java中所有类的基类,因此每个对象都继承了equals()方法,自定义实例对象默认使用Object.equals()比较值是否相等,且可以通过重写equals() 实现自定义比较。

     String类是Java中的一个内置类,它代表字符串对象,String重写了Object的equals()方法,仅用于做String字符串的值比较。

   2.  比较方式:

     Object.equals() 比较的是对象的引用是否相同。

     String.equals() 比较的是字符串的内容是否相同。

 

三.  代码层面展示

public static void main(String[] args) {
        Object obj1 = new Object();
        Object obj2 = new Object();
        System.out.println("Object地址值比较:" + obj1.equals(obj2));  // 输出结果: false

        String str1 = "Hello";
        String str2 = "hello";
        String str3 = " hello ";
        String str4 = new String("Hello");
        System.out.println("Hello::hello比较(区分大小写):" + str1.equals(str2)); // 输出结果: false
        System.out.println("Hello:: hello (前后存在空格):" + str1.equals(str3)); //  输出结果: false
        System.out.println("比较常量池(使用new操作符):" + str1.equals(str4));    //  输出结果: true

    }

打印输出:
  Object地址值比较:false
  Hello::hello比较(区分大小写):false
  Hello:: hello (前后存在空格):false
  比较常量池(使用new操作符):true

 

 四. 拓展

  String常量池:

    在Java中,String常量池是一种特殊的内存区域,用于存储字符串常量。它是为了节省内存空间和提高性能而设计的。

    当我们使用字符串字面值创建一个字符串对象时,Java编译器会首先检查字符串常量池中是否已经存在相同内容的字符串。如果存在,则返回常量池中的引用;如果不存在,则在常量池中创建一个新的字符串对象,并返回该引用。

    由于String类是不可变的,也就是说一旦创建了字符串对象,它的内容就不能被改变。因此,多个字符串对象可以共享同一个字符串常量池中的内容,这样可以减少内存的占用。

    需要注意的是,通过调用String的intern()方法可以将一个字符串对象加入到常量池中,并返回常量池中的引用。这在某些场景下可能会有用,但要谨慎使用以避免不必要的内存开销。

    总之,String常量池是Java中用于存储字符串常量的特殊内存区域,可以提高内存利用率和程序性能。