某些情况宁愿多用数组也不用集合
今天看到一篇文章,都是大佬积累下来的经验。如标题所示
我们知道集合里边不能存放基本数据类型,只能存储引用数据类型。
例如整型吧, 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, 假如我们存储10个数据
Arraylist源码中的两个字段:
文章图片
image.png
运算公式:
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集合中绝大部分的实现。
推荐阅读
- 稻草人
- linux查看所有/某个程序端口占用情况
- 第二周任务完成情况
- 查看win8系统平板电池损耗情况的办法
- 2022PMP考试基本情况详情了解
- MySQL|MySQL什么情况下会导致索引失效()
- linux服务器带宽占用情况,Linux系统使用iftop查看带宽占用情况
- Linux|Linux查看网络带宽使用情况 (端口显示)
- 《Linux从入门到精通》|Linux系统如何查看服务器带宽及网络使用情况
- 项目涉及知识点|海康网络摄像机与电脑交互,有网络和无网络两种方式读取URL视频流,以及无网络情况下配置IP地址