中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java new String()方法有哪些作用

發布時間:2021-06-18 09:09:29 來源:億速云 閱讀:1338 作者:chen 欄目:開發技術

本篇內容介紹了“Java new String()方法有哪些作用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

問題一:這段代碼創建了幾個對象?

String str1 = new String("aa");

答案是兩個
“aa”對象和String對象

其中有一項是常量池
常量池在Class文件被加載的時候,會被加載進內存中的方法區中的運行時常量池,而運行時常量池里就包括字符串常量池,Class文件中的字符串在類加載時就會加載到字符串常量池中去

Java new String()方法有哪些作用

不過在周志明老師在深入java虛擬機中有說到,到了JDK1.7時,字符串常量池就被移出了方法區,轉移到了堆里了。

String str1 = new String(“aa”);
"aa"就是被加載進去的字符串,我們可以看看Class文件

Java new String()方法有哪些作用

這里的aa在之后類加載的時候,會在字符串常量池里創建一個 "aa"對象,這是第一個對象類加載完成了之后,那就要開始正式執行代碼了,執行該行代碼時new一個"aa"的String對象存放在Java堆中,這是第二個對象創建完第二個對象后,虛擬機棧上的str1將會指向第二個對象,也就是堆上的對象

問題二:輸出結果是true還是false?

String str1 = new String("aa");
 String str2 = "aa";
 System.out.println(str1 == str2);

答案很明顯是false,因為兩個變量指向的地址不同,一個指向字符串常量池,一個指向堆上的對象,而==比較的就是地址。

問題三:輸出結果是true?

String str1 = new String("aa");
 str1.intern();
 String str2 = "aa";
 System.out.println(str1 == str2);

首先我們來了解一下intern方法
intern的處理是 先判斷字符串常量是否在字符串常量池中,如果存在直接返回該常量,如果沒有找到,說明該字符串常量在堆中,則處理是把堆區該對象的引用加入到字符串常量池中,以后別人拿到的是該字符串常量的引用,實際存在堆中。

也就是說現在字符串常量池中的"aa"實際上是指向堆上的String對象的?所以結果是true?
并不是,結果還是false

回到問題一

String str1 = new String("aa");

這段代碼創建了兩個對象,而第一個就是在字符串常量池中的,而intern方法在判斷時會發現字符串常量池中已經存在"aa"對象了,所以它就不用把字符串常量池中添加一個指向堆上的String對象的地址了
所以最后intern方法只是返回了"aa"對象,并沒有做任何修改

所以還是str1指向堆,str2指向字符串常量池,結果為false

問題四:那要怎么樣才能true?

String str3 = new String("a") + new String("a");
str3.intern();
String str4 = "aa";
System.out.println(str3 == str4);

這里打印的結果就是true了

這里的str3生成的方式不再是new String(“aa”);
而是new String(“a”) + new String(“a”);拼接起來的方式,因此在編譯后,Class文件中的常量池寫入的是"a"對象而不是"aa"對象,如下圖:

Java new String()方法有哪些作用

因此intern方法在判斷時會發現字符串常量池中并沒有"aa"對象,于是它就把堆中String對象的引用加入到字符串常量池中。
之后創建str4的時候,str4就會先在字符串常量池中先查找有沒有"aa",于是它找到了intern放入的引用,并把這個引用賦給str4
所以str3和str4都是同一個引用,str3==str4,為true

問題五:那么這段代碼又創建了幾個對象?

String str3 = new String("a") + new String("a");

答案是五個

因為使用+號的String字符串拼接,底層其實都是先創建一個StringBuilder對象,然后調用append方法把要+的字符串都append進去,最后toString創建一個新的String對象如下圖:

Java new String()方法有哪些作用

紅色的地方就是new出來對象的語句,而綠色則是兩次append
四個紅色一共四個對象,再加上字符串常量池上創建的"a"對象,一共五個

這也正是為什么阿里巴巴代碼規范中不建議在for循環里使用+號拼接字符串

Java new String()方法有哪些作用

String str1 = "aaa";
String str2 = "bbb";
String str4 = str1 + str2;

這個的String str4 = str1 + str2;創建了兩個對象,StringBuilder和toString時生成的String對象

那下面這段呢?是"aaa"對象加"bbb"對象加StringBuilder和toString時生成的String對象一共四個對象嗎?

String str5 = "aaa" + "bbb";

很可惜這段只創建了1個對象
java編譯器在編譯這段的時候做了優化,實際上"aaa"+"bbb"會先拼接成"aaabbb"之后才開始編譯,也就是說這段代碼等于是String str5 = “aaabbb”
如下圖:(code里面沒有任何new操作)

Java new String()方法有哪些作用

“Java new String()方法有哪些作用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尉氏县| 佛学| 雅安市| 恭城| 且末县| 汤阴县| 阳春市| 宝坻区| 连江县| 乐都县| 郸城县| 河东区| 从化市| 襄垣县| 东源县| 凤翔县| 星座| 浠水县| 黄龙县| 清河县| 汉川市| 松潘县| 罗城| 平乡县| 大同县| 五原县| 文水县| 富阳市| 盘锦市| 拉萨市| 十堰市| 松江区| 涞源县| 武宣县| 喀喇沁旗| 专栏| 贞丰县| 武安市| 时尚| 扎鲁特旗| 冷水江市|