Java中判斷字符串是否相等的實現(xiàn)
在最近的開發(fā)中,我踩到一個坑,過程是這樣的。我需要在Java中判斷兩個字符串是否相等,按照以往的經(jīng)歷使用 == 雙等號的操作符來判斷,但是在Java中,這樣寫卻沒有實現(xiàn)我想要的效果。經(jīng)過查閱資料后,把得到的經(jīng)驗分享給大家。
相等判斷操作符==
Java中,==相等判斷符用于判斷基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。 當判斷基本數(shù)據(jù)類型的時候判斷的是數(shù)值,當判斷引用數(shù)據(jù)類型時判斷變量是否指向同一引用對象。
使用==判斷字符串時,判斷的是兩個字符串是否指向同一個對象。如果兩個字符串指向同一個對象,那么它們就是相同的,使用==比較的結(jié)果也就是True。如果兩個字符串指向不同的對象,那么它們不相同,使用==比較的結(jié)果也就是False。
通過字面賦值的時候,相同的字符串會指向同一個對象,例如:
String str1="abcde";// 把"abcde"放入常量池中,編譯時產(chǎn)生 String str2="abcde";// 引用常量池中的對象,不會重新創(chuàng)建對象 str1 == str2; //str1和str2指向同一個對象,結(jié)果是true
但如果另有一個str3,不是通過這種字面的方式被賦值的,即便str3的值也是"abcde",例如:
String str3 = new String("abcde");//運行時把"abcde"放入堆里面,在堆中創(chuàng)建一個對象
str1 == str3; //str1和str3指向不同的對象,結(jié)果是false
相等判斷方法equals()
在Java中,可以使用equals()方法判斷字符串的內(nèi)容是否相同。
String str1="abcde";
String str3 = new String("abcde");
str1.equals(str3);//str1和str3的值一樣,結(jié)果是true
str1 == str3; //str1和str3指向不同的對象,結(jié)果是false
equals()方法原理
為什么可以使用equals()方法呢,我們看下String 類中的 equals()方法的源碼。
public boolean equals(Object anObject) {
if (this == anObject) { //先比較兩個字符串的引用是否相等(是否指向同一個對象), 是直接返回true
return true;
}
if (anObject instanceof String) { //兩個引用不等還會繼續(xù)比較
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value; //字符串類是用字符數(shù)組實現(xiàn)的, 先要拿到兩個字符串的字符數(shù)組
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { //然后對兩個數(shù)組逐個字符地進行比較
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
從上面的源碼可以看到, 當調(diào)用 String 類型數(shù)據(jù)的equals()方法時,首先會判斷兩個字符串的引用是否相等,也就是說兩個字符串引用是否指向同一個對象,是則返回true。
如果不是指向同一個對象,則把兩個字符串中的字符挨個進行比較。
總結(jié)
上述就是我為大家分享的java判斷兩個字符串是否相等的方法了,如果您也有類似的疑惑,不妨礙參照上述分析進行理解。在不斷的學(xué)習中,我相信會有更多的經(jīng)驗分享,歡迎大家持續(xù)關(guān)注。
到此這篇關(guān)于Java中判斷字符串是否相等的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java 字符串相等內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot3整合MyBatis出現(xiàn)異常:Property?'sqlSessionFactory&a
這篇文章主要介紹了SpringBoot3整合MyBatis報錯:Property?‘sqlSessionFactory‘?or?‘sqlSessionTemplate‘?are?required,其實不是個大問題,只是自己編碼時遇到了,然后總結(jié)總結(jié)分享一下,如果有遇到類似問題的,可以參考一下2022-11-11
如何使用IDEA的groovy腳本文件生成帶JPA注解的實體類(圖文詳解)
這篇文章主要介紹了如何使用IDEA的groovy腳本文件生成帶JPA注解的實體類,本文通過圖文并茂實例相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
Spring Boot集成 Spring Boot Admin 監(jiān)控
這篇文章主要介紹了Spring Boot集成 Spring Boot Admin 監(jiān)控,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2020-08-08
在?Spring?Boot?中使用?Quartz?調(diào)度作業(yè)的示例詳解
這篇文章主要介紹了在?Spring?Boot?中使用?Quartz?調(diào)度作業(yè)的示例詳解,在本文中,我們將看看如何使用Quartz框架來調(diào)度任務(wù),Quartz支持在特定時間運行作業(yè)、重復(fù)作業(yè)執(zhí)行、將作業(yè)存儲在數(shù)據(jù)庫中以及Spring集成,需要的朋友可以參考下2022-07-07
使用Spring Boot的LoggersEndpoint管理日志級別
這篇文章主要為大家介紹了使用Spring Boot的LoggersEndpoint管理日志級別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11

