【发布时间】:2015-09-21 10:13:52
【问题描述】:
tl;dr:在Java中,最好是重用容器对象或每次都创建对象,让垃圾收集器完成工作
我在 Java 中处理大量数据,其中经常有以下类型的代码结构:-
版本 1:
for(...){//outer loop
HashSet<Integer> test = new HashSet<>(); //Some container
for(...){
//Inner loop working on the above container Data Structure
}
//More operation on the container defined above
}//Outer loop ends
这里我每次循环分配新内存,并在内部/外部循环中进行一些操作,然后再次分配空内存。
现在我担心 Java 中的内存泄漏。我知道 Java 有一个相当不错的垃圾收集器,但我应该修改我的代码,而不是依赖它:-
版本 2:
HashSet<Integer> test = null;
for(...){//outer loop
if(test == null){
test = new HashSet<>(); //Some container
}else{
test.clear()
}
for(...){
//Inner loop working on the above container Data Structure
}
//More operation on the container defined above
}//Outer loop ends
我有三个问题:-
- 哪个性能更好,或者没有明确的答案。
- 第二个版本的时间复杂度会更高吗?换句话说,在复杂度上是 O(n) 的 clear() 函数 O(1)。我在 javadocs 中什么都没有。
- 这种模式比较常见,哪个版本比较推荐?
【问题讨论】:
-
clear可能会稍微快一些(上次我检查了 10/15%)。最好的方法是用您的数据测试这两种方法。在正常程序中,这不会成为瓶颈。 -
@assylias 我认为的一个原因是每次都必须调整内存大小如果我每次都分配新内存。但是空间复杂度呢?如果速度不是问题,是否会对内存占用产生重大影响?
-
@TagirValeev 请原谅我,我在那里很心不在焉。我打算进行空检查,如果容器从未被初始化,我会提供内存,否则我会清理并重用我拥有的空间
标签: java performance garbage-collection time-complexity hashset