Java:判斷字符串相等
問題描述
問題解答
回答1:String a = new String('abc');a = a.intern();String b = 'abc';if (a == b) { System.out.println('相等');} else { System.out.println('不等');}
你是調用了a.intern()方法,但是你又沒有將返回結果重新賦值,a還是原來那個a。
回答2:字符串相等用 equals() 判斷,Java 中這個題都考爛了噠!
回答3:a.intern();不會改變a字符的引用,他有個返回值。下面這樣才會相等
String b = a.intern();回答4:
String a = new String('abc');
這里的a和'abc'是兩個對象,當調用 intern 方法時,字符常量池中已經包含一個等于此對象的字符串了,所以intern這個方法調用等于沒用,即使后面b='abc',b和a也不是同一個對象。
想要輸出相等的話,要么第一句變成:
String a = 'abc';
要么第二句變成:
a = a.intern();回答5:
首先要知道一點是==操作判斷的是:是否a,b兩個對象或基本類型指向同一內存區域
String的底層實現是private final value[]String實例化時,實際上是通過System.arraycopy劃分一段連續內存保存char數組。
new String('abc')實際上不推薦這種方法初始化String,實際實現起來比 a = 'abc'多了一個步驟,底層步驟是
劃分內存空間,創建臨時數組temp
temp[0] = ’a’;temp[1] = ’b’;temp[2] = ’c’;
創建數組value ,將value所指內存空間指向temp指向的內存空間,即 &value = &temp(若使用a = 'abc'則不需要這步)
intern方法是jdk1.5提供的方法,用于內存優化的,相同String引用共同內存空間,實際上就是上述的第三步。這里若要a,b相等,可以寫為
String a = 'abc';String b = 'abc'.intern(); 或者String b = a.intern();
實際上 進行的操作就是上述的第三步,即 b = a;
String b = 'abc'實際的底層實現是:
劃分內存空間,創建數組value
value[0] = a.value[0];value[1] = a.value[0]’;value[2] = a.value[0];
第二步中,String b中value[0]中的String a中的value[0]實際中指向的是同一個內存地址,因此實際上b.value[0] = a.value[0] = ’a’,但b.value 不等于a.value,根本原因在于指向內存區域不同
推薦看一下String的源碼分析【JAVA源碼分析——Java.lang】String源碼分析
相關文章:
1. mac連接阿里云docker集群,已經卡了2天了,求問?2. ddos - apache日志很多其它網址,什么情況?3. 上傳圖片老是失敗是什么原因?SAE_TMP_PATH.后面跟的路徑在哪看4. javascript - 關于jquery的ajax post數據的問題5. 前端 - 我有一個建站程序,但是多個文件夾下的HTML模板代碼沒有進行縮進格式化,請問用什么軟件可以批量格式化一下代碼?6. android-studio - Win10下修改Windows用戶文件夾名user,導致Android Studio報錯無法使用7. phpstudy pro小皮面板經常報這個nginx: [emerg] CreateFile【急】8. thinkphp5.1學習時遇到session問題9. angular.js - angular 路由為什么一直請求css和js文件10. javascript - setTimeout的延遲時間,是從什么時間段開始算起的?
