一. 源碼展示: 1. Object.equals: ①引用類型地址值比較,直接返回結果:true || false public class Object { public boolean equals(Object obj) { return (this == obj); } } 2. Stri ...
一. 源碼展示:
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中用於存儲字元串常量的特殊記憶體區域,可以提高記憶體利用率和程式性能。