这个问题遇到不少次了,还是写下来敬告做核心模块开发的朋友。
java中像HashMap,StringBuffer,ArrayList这类数据结构,再给开发人员带来极大方便性的同时,实际上还是存在着使用上的陷阱的,主要主意事项在于内存的使用上。
问题描述:
这类变长数据结构的缺省的实例化方法,都会分配一个缺省大小的空间,比如HashMap为16, ArrayList为10,等等。如果不断向其中增加内容,这类数据结构会自动延展,以适应需要,但自动延展的问题是空间的无畏消耗,比如会重新申请一个更大的空间,然后将数据从旧的空间copy到新的空间,然后扔掉旧空间。在数据量小的情况下,内存使用率问题并不严重,但是如果数据很大,需要不断的自动延展,那heap空间浪费也是惊人的。
在使用频率不是很高的非核心模块中使用这种变长数据结构,不会有很严重的后果,但是,如果在使用频率非常高的核心模块中使用,那可要小心加小心了,使用不当会造成非常高的内存使用率。
解决方法:
1. 就是尽量不使用这类变长数据结构,比如根据需求自行设计数据结构。不能闲麻烦,拿来就用的东西总是要付出代价的。
2. 如果非要使用,那唯一的解决之道就是尽量事先评估需要的容量,然后按评估容量进行初始化,尽量避免自动延展。说白了,就是尽可能不要使用无参数的构造方法。:)