Java中判斷字符串是否相等的實(shí)現(xiàn)
在最近的開(kāi)發(fā)中,我踩到一個(gè)坑,過(guò)程是這樣的。我需要在Java中判斷兩個(gè)字符串是否相等,按照以往的經(jīng)歷使用 == 雙等號(hào)的操作符來(lái)判斷,但是在Java中,這樣寫卻沒(méi)有實(shí)現(xiàn)我想要的效果。經(jīng)過(guò)查閱資料后,把得到的經(jīng)驗(yàn)分享給大家。
相等判斷操作符==
Java中,==相等判斷符用于判斷基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。 當(dāng)判斷基本數(shù)據(jù)類型的時(shí)候判斷的是數(shù)值,當(dāng)判斷引用數(shù)據(jù)類型時(shí)判斷變量是否指向同一引用對(duì)象。
使用==判斷字符串時(shí),判斷的是兩個(gè)字符串是否指向同一個(gè)對(duì)象。如果兩個(gè)字符串指向同一個(gè)對(duì)象,那么它們就是相同的,使用==比較的結(jié)果也就是True。如果兩個(gè)字符串指向不同的對(duì)象,那么它們不相同,使用==比較的結(jié)果也就是False。
通過(guò)字面賦值的時(shí)候,相同的字符串會(huì)指向同一個(gè)對(duì)象,例如:
String str1="abcde";// 把"abcde"放入常量池中,編譯時(shí)產(chǎn)生 String str2="abcde";// 引用常量池中的對(duì)象,不會(huì)重新創(chuàng)建對(duì)象 str1 == str2; //str1和str2指向同一個(gè)對(duì)象,結(jié)果是true
但如果另有一個(gè)str3,不是通過(guò)這種字面的方式被賦值的,即便str3的值也是"abcde",例如:
String str3 = new String("abcde");//運(yùn)行時(shí)把"abcde"放入堆里面,在堆中創(chuàng)建一個(gè)對(duì)象 str1 == str3; //str1和str3指向不同的對(duì)象,結(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指向不同的對(duì)象,結(jié)果是false
equals()方法原理
為什么可以使用equals()方法呢,我們看下String 類中的 equals()方法的源碼。
public boolean equals(Object anObject) { if (this == anObject) { //先比較兩個(gè)字符串的引用是否相等(是否指向同一個(gè)對(duì)象), 是直接返回true return true; } if (anObject instanceof String) { //兩個(gè)引用不等還會(huì)繼續(xù)比較 String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; //字符串類是用字符數(shù)組實(shí)現(xiàn)的, 先要拿到兩個(gè)字符串的字符數(shù)組 char v2[] = anotherString.value; int i = 0; while (n-- != 0) { //然后對(duì)兩個(gè)數(shù)組逐個(gè)字符地進(jìn)行比較 if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
從上面的源碼可以看到, 當(dāng)調(diào)用 String 類型數(shù)據(jù)的equals()方法時(shí),首先會(huì)判斷兩個(gè)字符串的引用是否相等,也就是說(shuō)兩個(gè)字符串引用是否指向同一個(gè)對(duì)象,是則返回true。
如果不是指向同一個(gè)對(duì)象,則把兩個(gè)字符串中的字符挨個(gè)進(jìn)行比較。
總結(jié)
上述就是我為大家分享的java判斷兩個(gè)字符串是否相等的方法了,如果您也有類似的疑惑,不妨礙參照上述分析進(jìn)行理解。在不斷的學(xué)習(xí)中,我相信會(huì)有更多的經(jīng)驗(yàn)分享,歡迎大家持續(xù)關(guān)注。
到此這篇關(guān)于Java中判斷字符串是否相等的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java 字符串相等內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea 多模塊項(xiàng)目依賴父工程class找不到問(wèn)題的方法
這篇文章主要介紹了idea 多模塊項(xiàng)目依賴父工程class找不到問(wèn)題的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01java使用JDBC動(dòng)態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法
這篇文章主要介紹了java使用JDBC動(dòng)態(tài)創(chuàng)建數(shù)據(jù)表及SQL預(yù)處理的方法,涉及JDBC操作數(shù)據(jù)庫(kù)的連接、創(chuàng)建表、添加數(shù)據(jù)、查詢等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08SparkSQL中的JSON內(nèi)置函數(shù)全解析
你是否曾經(jīng)為處理JSON數(shù)據(jù)而頭疼?SparkSQL為我們提供了強(qiáng)大的內(nèi)置JSON函數(shù),讓JSON處理變得輕而易舉,本文將帶你深入了解這些函數(shù),感興趣的朋友一起看看吧2024-08-08解決springboot引入swagger2不生效問(wèn)題
這篇文章主要為大家介紹了解決springboot引入swagger2不生效問(wèn)題的方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Spring中@Transactional用法詳細(xì)介紹
這篇文章主要介紹了Spring中@Transactional用法詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02Java+opencv3.2.0實(shí)現(xiàn)hough直線檢測(cè)
這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0之hough直線檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02