一. 源码展示:
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中用于存储字符串常量的特殊内存区域,可以提高内存利用率和程序性能。