2014-01-19 133 views
-1

我已經用Java編寫代碼來查找JVM可以支持的BigInteger的最大數組。將n維數組分配給對象

它通過添加創建BigInteger []並以更大的尺寸重新聲明它開始。一旦大小等於Integer.MAX_VALUE,它就開始創建BigInteger [Integer.MAX_VALUE] []並開始遞增第二個維度。一旦拋出OutOfMemory異常,它將停止,並返回最後成功初始化的數組。

不幸的是,基於計算機的RAM,它可能是BigInteger [],BigInteger [] [],一直到BigInteger [] [] [] [] []。我將如何將它分配給一個私人對象?陣列?在我的班級,所以我可以在以後參考它?

例如:

BigInteger[] x; 
    x = new BigInteger[][] //error, dims dont match. 
+1

我不確定,但我不認爲這與計算機有很大關係。支持多維數組並非如此任務。 – elyashiv

+0

@eylashiv這是當每個的BigInteger包含一個int [],所有的存儲器,它被分配。而且,我的try catch語句經常用來拋出內存不足的錯誤。 –

+0

隨着澄清編輯,我現在明白...思考。 –

回答

0

我同意,這個問題需要澄清,但要回答你的問題,在Java中所有的目標都從Object類繼承,從而Object類型的變量可以引用任何東西。

Object obj = new BigInteger[1]; 
Object obj = new BigInteger[1][1]; 
Object obj = new BigInteger[1][1][1]; 
. 
. 
. 
2

因爲你要求無界的限制,我會建議使用LinkedList<BigInteger[]>。或者,您可以使用LinkedList<ArrayList<BigInteger>>,只需使用List即可。

由於它是一個不受數組支持的經典雙向鏈表,因此它對其可以包含的元素數量沒有限制Integer.MAX_VALUE。它只受可用內存的限制。這使得它只能處理兩個維度。

一旦您按數組大小(或ArrayList)擊中BigInteger[Integer.MAX_VALUE],您將其添加到LinkedList並繼續。

唯一需要注意的是,size()一旦超過Integer.MAX_VALUE元素就無法工作,只有遍歷整個列表才能告訴你。我仍然可以被完全誤解了你的問題或你想達到什麼樣的:如果你想通過延長LinkedList /創建自己的代理類,並保持自己算不算一個long

編輯補充這是很容易克服。如果你試圖找出JVM支持的陣列尺寸的數量......它是255中定義的JVM spec section 4.3.2

如果你想知道你可以在內存中創建/保存多少個參考值,那麼BigInteger確實沒有進入圖片;從陣列本身的觀點來看,Object[10]將與BigInteger[10]的尺寸完全相同;它是一個可以容納10個參考值的數組。參考值是一個固定的大小,就像C中的指針一樣;您可以簡單地創建一個LinkedList<Object>並開始填充null - 當內存用完時,這就是您可以創建的數量。當然,列表中的每個節點都有開銷。在這種情況下,我原來的答案可能會更好。

如果你想知道你可以創建多少個BigInteger的實例...那麼只需創建一個LinkedList<BigInterger>並擁有它。