2

My guess is its a 32-bit/64-bit word (depending on the CPU) per value stored in the array. So it would be array size X 32-bit/64-bit.

In the case of linked lists, it would be twice this to store the reference which points to the next element. So it would be 2 * array size X 32-bit/64-bit.

Is this correct, am I missing anything?

4

2 回答 2

7

多得多。链表中的每个元素都有:

  • 指向下一个元素的指针,指向前一个元素的指针,指向项目值的指针(12 个字节)+ 对象开销(大约另外 12 个字节)。说 24 个字节。
  • 每个元素都不是原始的,而是一个包装器。如果每个元素都不一样,就会占据空间。对于整数说另外 16 个字节。

总计:每个元素 40 个字节。

不要从表面上看这个,这只是给你一个想法。如果您想要精确的数字,请启动内存分析工具(例如 Eclipse MAT)。

于 2013-10-11T15:49:33.253 回答
0

我对数组的内存消耗做了一个实验。以下是 20000 个整数数组的结果:

    
操作系统:Windows 8 6.2,amd64
JVM:Oracle Corporation Java HotSpot(TM) 64 位服务器 VM 24.0-b56

                   x | 分钟 | 平均 | 最大 | 标准开发
       总 CPU,毫秒 | 7.000000 | 8.250000 | 10.000000 | 0.829156
每个 LinkedList 的字节数 | 830.48 KB | 830.48 KB | 830.48 KB | 0.50 乙
      每个项目的字节数 | 42.00 乙 | 42.00 乙 | 42.00 乙 | 0.00 乙

       总 CPU,毫秒 | 4.000000 | 6.000000 | 7.000000 | 0.547723
 每个 ArrayList 的字节数 | 416.00 KB | 416.00 KB | 416.00 KB | 0.00 乙
      每个项目的字节数 | 21.00 早 21.00 早 21.00 早 0.00 乙

       总 CPU,毫秒 | 0.000000 | 0.950000 | 1.000000 | 0.217945
每个 TIntArrayList 的字节| 105.56 KB | 105.56 KB | 105.56 KB | 0.00 乙
      每个项目的字节数 | 5.00 乙 | 5.00 乙 | 5.00 乙 | 0.00 乙

所以是

链表:42 字节
数组列表:21 个字节
TIntArrayList:5 个字节

但是,如果数组列表的大小未知,则由于数组重新分配导致的内存消耗为:

链表:42 字节
数组列表:29 字节
TIntArrayList:10 个字节
于 2013-10-11T21:40:23.673 回答