最近在看JDK源碼,其中ArrayList中的部分有這樣一行
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
通常笼踩,數(shù)組的最大值都是Integer.MAX_VALUE逗爹,在這里為什么要減8?
要解決這個(gè)問題嚎于,首先要明白Java中數(shù)組的結(jié)構(gòu)掘而。
數(shù)組對(duì)象的形狀和結(jié)構(gòu)(如int值數(shù)組)與標(biāo)準(zhǔn)Java對(duì)象類似。主要區(qū)別在于數(shù)組對(duì)象有一個(gè)額外的元數(shù)據(jù)于购,用于表示數(shù)組的大小袍睡。然后,數(shù)組對(duì)象的元數(shù)據(jù)由以下部分組成:
Class:指向描述對(duì)象類型的類信息的指針肋僧。在int數(shù)組的情況下斑胜,這是一個(gè)指向int []類的指針。
標(biāo)志:描述對(duì)象狀態(tài)的標(biāo)志集合嫌吠,包括該對(duì)象的散列碼(如果有)以及對(duì)象的形狀(即對(duì)象是否為數(shù)組)止潘。
鎖定:對(duì)象的同步信息 - 即對(duì)象是否當(dāng)前同步。
大斜枳纭:數(shù)組的大小凭戴。
減去的空間就是用來存儲(chǔ)數(shù)組大小,標(biāo)志炕矮,鎖定么夫,類信息指針等對(duì)象頭信息,對(duì)象頭信息最大占用內(nèi)存不可超過8字節(jié)吧享。