iT邦幫忙

2024 iThome 鐵人賽

0

String是屬於一個不可變immutable 類型,在Java中有經過特別的處理。

在Java的String物件存放在Heap(堆) 中,但是為了優化記憶體和儲存空間,所以Java使用了字串池String Pool 的方式儲存字串。

💡字串池String Pool 一樣是放在Heap 中,只是有一個獨立的空間存放,之前在Day12-類(記憶體中的表現方式)中的圖片有提過沒那麼正確。

String s1 = "hello";
String s2 = "hello";

當使用這樣的方式去創造一個String 時,會在String Pool 中建立一個hello 的物件,並且將這個物件的位址返回給s1s2

String s3 = new String("hello");

當使用String 的構造器創建時,這時候的s3 指向的會是一個存放在Heap 中的物件位址,這個物件會有一個value屬性 ,並且value 的屬性會指向String Pool 中存放hello 的物件位址。

s1 == s2 // true
s1 == s3 // false

JDK9以前String 是使用char[] 進行value 的儲存。

JDK9以後String 是使用byte[] 進行value 的儲存(會根據使用的字符編碼判斷要儲存單字節或是雙字節)。

在記憶體中應該要是長這個樣子,會在String Pool中創建一個byte[]存放String,並且有一個指針指向這個物件。
https://ithelp.ithome.com.tw/upload/images/20241021/20139160pjXuUi0vmF.jpg

使用+ 連接字串

String s1 = "hello";
String s2 = "world";

String s3 = "helloworld";
String s4 = "hello" + "world";

String s5 = s1 + "world";
String s6 = "hello" + s2;
String s7 = s1 + s2;
s3 == s4 // true
s3 == s5 // false
s3 == s6 // false
s3 == s7 // false
  • s4 是兩個常量 ,所以在底層中會直接將兩個常量合併後,再指向String Pool 中的位址。
  • 當一個變數 + 常量 ,或是兩個變數相加String 底層是會使用StringBuilder 中的toString() 方法,而這個方法中是使用new String() 構造器的方式去新增的,所以會在Heap 中先創建一個物件 ,物件中會有一個value 的屬性指向String Pool 中的helloworld

上一篇
Day33-線程Thread(三)
下一篇
Day35-StringBuffer、StringBuilder
系列文
前端工程師的java學習紀錄37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言