1. 程式人生 > >HashMap原理及 Java 中陣列的最大長度是多少——華為面試總結

HashMap原理及 Java 中陣列的最大長度是多少——華為面試總結

今天去華為面試 ,感受收穫特別大,感謝開發小哥,

問到我HashMap原理 及陣列的最大長度是多少,經過網路瞭解如下:  

2. java 中陣列的最大長度是多少呢?看一下它的length屬性就可以了。length屬性是32位的有符號整數,它的最大值是2的31次冪,就是2G。為何有這個限制呢?為什麼length的屬性不是long型呢?我們假設一下,如果它是long型的,那麼它的最大長度是2的63次冪。記憶體永遠也不會有那麼大吧。即使是位元組陣列長度是int的,最大長都達到2GB.
由此想到了String,這個傢伙底層也是基於陣列的,是一個字元陣列。字元是16位的基本型別,一個String的最大長度是多少呢?就是字元陣列的最大長度也是2G,佔用記憶體是4GB。

一個數組最大的長度是一個 int 的最大值,也就是 2147483647,而一個字串在 Java 內部是使用 char[] 來表示的,也就是說一個字串的最大長度是 2147483647。
不過這些都是理論值,具體能放多少與 JVM 記憶體有關, 可以在執行 java 命令時加上 -Xmx 1024m 就將 JVM 記憶體最大置為了 1G, 預設情況下是 64MB.

可以寫一個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)。

實際開發中,虛擬機器預設記憶體大小根據不同的虛擬機器實現有所不同,可以在啟動應用時用-Xmx調整最大堆大小,比如調整堆最大大小為2G:
一般四五十萬的資料是放得下的。

 

Java 基本資料型別最大值極限和最小值極限,寫個小程式就很容易知道。

測試 Integer, Long, Float 和 Double 的最大值和最小值,程式碼如下: 

  public static void main(String[] args)
  {
    System.out.println("Integer.MIN_VALUE = " + Integer.MIN_VALUE);
    System.out.println("Integer.MAX_VALUE = " + Integer.MAX_VALUE);
 
    System.out.println("Long.MIN_VALUE = " + Long.MIN_VALUE);
    System.out.println("Long.MAX_VALUE = " + Long.MAX_VALUE);
 
    System.out.println("Float.MIN_VALUE = " + Float.MIN_VALUE);
    System.out.println("Float.MIN_NORMAL = " + Float.MIN_NORMAL);
    System.out.println("Float.MAX_VALUE = " + Float.MAX_VALUE);
 
    System.out.println("Double.MAX_VALUE = " + Double.MAX_VALUE);
    System.out.println("Double.MIN_VALUE = " + Double.MIN_VALUE);
  }

 輸結果如下:

Integer.MIN_VALUE = -2147483648
Integer.MAX_VALUE = 2147483647
Long.MIN_VALUE = -9223372036854775808
Long.MAX_VALUE = 9223372036854775807
Float.MIN_VALUE = 1.4E-45
Float.MIN_NORMAL = 1.17549435E-38
Float.MAX_VALUE = 3.4028235E38
Double.MAX_VALUE = 1.7976931348623157E308
Double.MIN_VALUE = 4.9E-324

解決方法參考 【本人面試記錄。。】:
https://blog.csdn.net/qq_36743013/article/details/78676349 
https://blog.csdn.net/joyous/article/details/10050849