回覆列表
-
1 # 碼農日常觀察
-
2 # ZJef
呃,可以看原始碼,而且情況很多,string的實現陣列最大的長度當然是Integer.MAX_VALUE,但是,Java在常量池中有一個變體utf8表,該表有個欄位最大是65535,null佔用兩個位元組,所以,當string中放的是字母,原始碼中有個判斷(<65535),也就是能放65534個字母,但是如果是漢字等,判斷條件是(<=65535),也就是能放65535個漢字,當然,上面的情況都是在編譯期,如果是在執行期的話,最大的長度就是Integer.MAX_VALUE了,也就是將近4g,這基本上是不可能有的了,最長的string場景應該是序列化類吧,撐死幾千。
從語言上來看,java.util.List是個介面,其下有N多實現,最常用的是ArrayList和LinkedList及其各種繼承或同步化實現(如Vector/Queue/Stack這些的)
ArrayList內部是拿陣列儲存,那麼上限就是Integer.MAX_VALUE
LinkedList內部是個連結串列,理論上是無限的
另外,List裡放的東西都是在記憶體裡的(當然你也可以自己實現一個放磁碟上的),因此能放多少也取決於放的東西的大小以及種類。
大小方面很容易計算,一個物件如果1K,那400,000個就至少要佔用400M的記憶體(不算其他佔用)。
而虛擬機器記憶體分類方面,如果是普通物件,一般佔用的都是堆(Heap)空間,如果是常量或是類似String.intern()出來的東東,則佔用的是永生帶(Permanent Generation)。