今天有朋友問java中String[] str = s.split(",")的內存分析,於是開始查資料並測試。首先,發現在java的內存管理中“常量池”是個很奇怪的東西,很多人不清楚(當然我也不清楚),經查資料總結如下:
棧(Stack) :存放基本類型的變量數據和對象的引用。
堆(heap):存放所有new出來的對象。
常量池(constant pool):在堆中分配出來的一塊存儲區域,存放儲顯式的String常量。另外,可以存儲不經常改變的東西(public static final)。常量池中的數據可以共享。
具體參考:http://www.linuxidc.com/Linux/2014-04/99918.htm
http://www.linuxidc.com/Linux/2014-04/99919.htm
然後再來分析下,String[] str = s.split(",");split會產生幾個對象,存儲在哪?
測試代碼如下:
String s = "aa,aa";
String[] str = s.split(",");
if (str[0] == str[1]) {
System.out.println("str[0]==str[1]");
} else {
System.out.println("str[0]!=str[1]");
}
輸出結果:str[0]!=str[1]
可見,s.split(",");執行的是new String();方法,所以一個split片段會創建兩個對象(如果常量池中沒有的話):常量池中1個,堆中1個。