Java:判斷字符串相等
問題描述
問題解答
回答1:String a = new String('abc');a = a.intern();String b = 'abc';if (a == b) { System.out.println('相等');} else { System.out.println('不等');}
你是調(diào)用了a.intern()方法,但是你又沒有將返回結(jié)果重新賦值,a還是原來那個(gè)a。
回答2:字符串相等用 equals() 判斷,Java 中這個(gè)題都考爛了噠!
回答3:a.intern();不會(huì)改變a字符的引用,他有個(gè)返回值。下面這樣才會(huì)相等
String b = a.intern();回答4:
String a = new String('abc');
這里的a和'abc'是兩個(gè)對(duì)象,當(dāng)調(diào)用 intern 方法時(shí),字符常量池中已經(jīng)包含一個(gè)等于此對(duì)象的字符串了,所以intern這個(gè)方法調(diào)用等于沒用,即使后面b='abc',b和a也不是同一個(gè)對(duì)象。
想要輸出相等的話,要么第一句變成:
String a = 'abc';
要么第二句變成:
a = a.intern();回答5:
首先要知道一點(diǎn)是==操作判斷的是:是否a,b兩個(gè)對(duì)象或基本類型指向同一內(nèi)存區(qū)域
String的底層實(shí)現(xiàn)是private final value[]String實(shí)例化時(shí),實(shí)際上是通過System.arraycopy劃分一段連續(xù)內(nèi)存保存char數(shù)組。
new String('abc')實(shí)際上不推薦這種方法初始化String,實(shí)際實(shí)現(xiàn)起來比 a = 'abc'多了一個(gè)步驟,底層步驟是
劃分內(nèi)存空間,創(chuàng)建臨時(shí)數(shù)組temp
temp[0] = ’a’;temp[1] = ’b’;temp[2] = ’c’;
創(chuàng)建數(shù)組value ,將value所指內(nèi)存空間指向temp指向的內(nèi)存空間,即 &value = &temp(若使用a = 'abc'則不需要這步)
intern方法是jdk1.5提供的方法,用于內(nèi)存優(yōu)化的,相同String引用共同內(nèi)存空間,實(shí)際上就是上述的第三步。這里若要a,b相等,可以寫為
String a = 'abc';String b = 'abc'.intern(); 或者String b = a.intern();
實(shí)際上 進(jìn)行的操作就是上述的第三步,即 b = a;
String b = 'abc'實(shí)際的底層實(shí)現(xiàn)是:
劃分內(nèi)存空間,創(chuàng)建數(shù)組value
value[0] = a.value[0];value[1] = a.value[0]’;value[2] = a.value[0];
第二步中,String b中value[0]中的String a中的value[0]實(shí)際中指向的是同一個(gè)內(nèi)存地址,因此實(shí)際上b.value[0] = a.value[0] = ’a’,但b.value 不等于a.value,根本原因在于指向內(nèi)存區(qū)域不同
推薦看一下String的源碼分析【JAVA源碼分析——Java.lang】String源碼分析
相關(guān)文章:
1. javascript - sublime快鍵鍵問題2. javascript - immutable配合react提升性能?3. vue.js - Vue 如何像Angular.js watch 一樣監(jiān)聽數(shù)據(jù)變化4. 配置Apache時(shí),添加對(duì)PHP的支持時(shí)語(yǔ)法錯(cuò)誤5. css - 寫頁(yè)面遇到個(gè)布局問題,求大佬們幫解答,在線等,急!~6. javascript - nodejs關(guān)于進(jìn)程間發(fā)送句柄的一點(diǎn)疑問7. javascript - 移動(dòng)端上不能實(shí)現(xiàn)拖拽布局嗎?8. phpstudy8.1支持win11系統(tǒng)嗎?9. 實(shí)現(xiàn)bing搜索工具urlAPI提交10. Apache 已經(jīng)把網(wǎng)站根目錄的改為allow from all了,但是服務(wù)器還是不能訪問?

網(wǎng)公網(wǎng)安備