今天看到一篇文章,都是大佬积累下来的经验。如标题所示
我们知道集合里边不能存放基本数据类型,只能存储引用数据类型。
例如整型吧, int与包装类Integer。假如你想串联起来变成一串数据。
要么 new int[]索引存值,要么ArrayList调用接口add(new Integer(X))方法添加数据
从java内存来说,从64位的操作系统来说(32位有些东西不一样):
一个java对象在Heap(堆)的表示,分三部分:
1.Object Header(占用4byte)
2.Class Pointer(占用4byte)
3.Fields
以一个 Integer 来说 , 上边固定的两部分都是 4byte, 还有一个 private final int value;整型占用4byte。加上 在java中,对象占用的heap大小是8位对齐的。上边 3 * 4 = 12 不对齐需补4byte。结果是16byte。
Arraylist源码中的两个字段: image.png
那么对于 Arraylist, 假如我们存储10个数据
运算公式:
10 * (一个Integer=(16byte)) + (list本身也是对象=12byte(不算 elementData)) + (elementData也是对象=12byte) = 10*16+12+12 = 184byte
而如果是new int[]:
(一个int = 4byte) *10 + (new int = 12byte) = 56byte
184 : 56 ,超过了 3 : 1
so能用数组就用数组.
如果你非要, 推荐一个比较节约内存的集合工具,fastutil , 包含了JDK集合中绝大部分的实现。
网友评论