一.? 源碼展示:
1. Object.equals:
①引用類型地址值比較,直接返回結(jié)果:true || false
public class Object { public boolean equals(Object obj) { return (this == obj); } }
?文章來源地址http://www.zghlxwxcb.cn/news/detail-534779.html
2. String.equals:
?、?判斷地址值是否相等,若相等 返回 true,若不等則進入下列判斷 ;
?、?判斷參數(shù)是否為String類型,若不是 返回false,若是則進入下列判斷;
?、?判斷字符串長度是否相等,若不等 返回false,若相等則進入下列判斷 ;
④ 判斷索引位置的字符是否相同,若不等 返回false,若相等,則返回true;
- 字符串的內(nèi)容相等指的是字符序列完全相同,包括字符的順序和大小寫敏感。
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; } }
?
二. 二者區(qū)別
1. 作用域:
Object類是Java中所有類的基類,因此每個對象都繼承了equals()方法,自定義實例對象默認(rèn)使用Object.equals()比較值是否相等,且可以通過重寫equals() 實現(xiàn)自定義比較。
String類是Java中的一個內(nèi)置類,它代表字符串對象,String重寫了Object的equals()方法,僅用于做String字符串的值比較。
2.? 比較方式:
Object.equals()?比較的是對象的引用是否相同。
String.equals() 比較的是字符串的內(nèi)容是否相同。
?
三.? 代碼層面展示
public static void main(String[] args) { Object obj1 = new Object(); Object obj2 = new Object(); System.out.println("Object地址值比較:" + obj1.equals(obj2)); // 輸出結(jié)果: false String str1 = "Hello"; String str2 = "hello"; String str3 = " hello "; String str4 = new String("Hello"); System.out.println("Hello::hello比較(區(qū)分大小寫):" + str1.equals(str2)); // 輸出結(jié)果: false System.out.println("Hello:: hello (前后存在空格):" + str1.equals(str3)); // 輸出結(jié)果: false System.out.println("比較常量池(使用new操作符):" + str1.equals(str4)); // 輸出結(jié)果: true } 打印輸出: Object地址值比較:false Hello::hello比較(區(qū)分大小寫):false Hello:: hello (前后存在空格):false 比較常量池(使用new操作符):true
?
?四. 拓展
String常量池:
在Java中,String常量池是一種特殊的內(nèi)存區(qū)域,用于存儲字符串常量。它是為了節(jié)省內(nèi)存空間和提高性能而設(shè)計的。
當(dāng)我們使用字符串字面值創(chuàng)建一個字符串對象時,Java編譯器會首先檢查字符串常量池中是否已經(jīng)存在相同內(nèi)容的字符串。如果存在,則返回常量池中的引用;如果不存在,則在常量池中創(chuàng)建一個新的字符串對象,并返回該引用。
由于String類是不可變的,也就是說一旦創(chuàng)建了字符串對象,它的內(nèi)容就不能被改變。因此,多個字符串對象可以共享同一個字符串常量池中的內(nèi)容,這樣可以減少內(nèi)存的占用。
需要注意的是,通過調(diào)用String的intern()
方法可以將一個字符串對象加入到常量池中,并返回常量池中的引用。這在某些場景下可能會有用,但要謹(jǐn)慎使用以避免不必要的內(nèi)存開銷。
總之,String常量池是Java中用于存儲字符串常量的特殊內(nèi)存區(qū)域,可以提高內(nèi)存利用率和程序性能。
文章來源:http://www.zghlxwxcb.cn/news/detail-534779.html
?
到了這里,關(guān)于Object.equals 和 String.equals的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!