本篇文章给大家分享的是有关java中ArrayList如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
public void trimToSize()
这个方法想必很多人都没有用过甚至不一定知道ArrayList有这个方法,那么这个方法是做什么的呢?从该方法的介绍上可以得知该方法是将内部的数组最小化,怎么最小化呢?就是当前内部如果数组长度是100,而实际使用的(放入的有数据的)只有10,那么使用这个方法后会重新申请一个长度为10的数组,然后将数据从原数组中复制过来,然后将这个新的长度为10的数组引用赋给ArrayList对象作为内部数组,源码如下:
如果你不是计算机专业的或者基础不够扎实的话可能会问:这么做有什么好处呢?那么这里我可以告诉你,这样做的好处就是节省空间,因为如果内部数组很大但是实际使用到的只有很少一部分的话,多余的那部分数组空间虽然没有存放东西,但是仍然是占用一定空间的,在有些内存紧张的场景这个小优化是很有必要的。同时根据源码可以很容易得出该方法的时间渐进复杂度是O(n),其中n与当前ArrayList的size相同。
如果觉得文字不够直观的话,给大家上一段代码,然后大家可以用jconsole观察一下程序运行时堆内存的占用变化情况。
如果不会用jconsole又想看到结果的话我这里有运行好的截图,大家可以看一下,截图如下:
可以看到在程序执行到构建ArrayList对象的时候堆内存占用一下达到了1G多,而当调用trimToSize方法后堆内存又下降到了起始状态,因此在ArrayList扩充到比较大的状态后里边的元素又被删除了很多或者初始化ArrayList时构建了一个比较大的内部数组时(利用ArrayList的构造器),调用trimToSize会明显改善堆内存的占用情况。但是,由于该方法的时间复杂度为O(n),其中n与ArrayList的size相关,当size比较大时该方法效率并不高,所以当size较大而内存又充足的情况或者ArrayList内部数组的使用率比较高的情况下(size/内部数组的长度,该值越大说明数组的使用率越高)不建议调用该方法,该方法也不建议频繁调用。
ArrayList的构造器优化
看到上面的小标题可能有的人会问,ArrayList的构造器还能优化吗?是的,确实能,上篇讲到ArrayList的构造器有三个,其中有一个接收一个int类型值的构造器,而该构造器就是我们优化的重点。
根据上节知识可以得出,ArrayList的add方法通常是比较高效的,可以在O(1)的时间内完成,但是如果此时ArrayList内部数组的长度不够需要扩容时,就需要调用grow方法扩容了,而该方法的时间渐进复杂度是O(n),其中n与当前size有关,所以该方法相对来说是比较低效的(实际在算法的世界O(n)的时间复杂度通常是比较高效的),那么如何减少该方法的调用次数就成了优化ArrayList性能的一个关键问题。
想要减少grow方法的调用,首先要知道在什么时候grow方法会被调用,而在前面我们已经说过,在需要扩容,也就是当前ArrayList内部维护的数组长度不够的时候,该方法会被调用,那么如果我们的ArrayList内部维护的那个数组长度一直够用,我们不就不需要调用这个方法了吗?实际上,这种想法是可行的,因为我们可以通过ArrayList的构造器去控制ArrayList内部维护的这个数组的初始大小,而如果我们精确的知道我们将要往ArrayList中放入多少数据,那么我们就可以直接通过ArrayList的构造器去指定ArrayList内部维护的这个数组的初始大小,即使我们不确定我们创建的ArrayList对象将要放入多少数据,我们也可以估算一个相对较大的值,然后使用该值去构建ArrayList,以此达到尽量少的调用grow方法。
以上就是java中ArrayList如何使用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。