在for循环中重用ArrayLists的有效方法是什么?

ane*_*yzm 3 java

我在for循环中重复使用相同的ArrayList,我使用

for loop
    results = new ArrayList<Integer>();
    experts = new ArrayList<Integer>();
    output = new ArrayList<String>();
....
Run Code Online (Sandbox Code Playgroud)

创造新的.

我想这是错的,因为我正在分配新的内存.它是否正确 ?如果是,我怎么能清空它们?

补充:另一个例子

我每次调用这个方法时都会创建新的变量.这是好习惯吗?我的意思是创造新的精度,相关的创造...等?或者我应该在我的课程中声明它们,在方法之外不分配越来越多的内存?

public static void computeMAP(ArrayList<Integer> results, ArrayList<Integer> experts) {

  //compute MAP
  double precision = 0;
  int relevantFound = 0;
  double sumprecision = 0;
Run Code Online (Sandbox Code Playgroud)

谢谢

tza*_*man 7

ArrayList.clear()会为你清空它们; 请注意,按照自己的方式进行操作也是"好的",因为Java是垃圾收集的,因此旧的分配最终会被清理干净.尽管如此,最好避免大量新的分配(以及垃圾生成),因此更好的方法是将这些声明移到循环之外并将调用clear放入其中.

对于你的第二个例子,无论哪种方式都很好; 原始类型通常只会被分配一次(在堆栈中,当您进入函数时),在循环内声明它们不会增加任何成本.它只是new你需要担心的堆分配(即调用).

回应评论:
如果那些事情成为实例成员没有意义,那么就不要这样做.此外,使用new"清理"它们意味着每次都要分配新对象; 绝对不要这样做 - 如果你的方法每次被调用时都需要一个新的东西副本,除了那个方法之外它没有被使用,那么它就没有业务是一个实例变量.
总的来说,在这一点上担心这种微观优化是适得其反的; 你只考虑它,如果你真的,绝对必须,然后在做任何事情之前衡量是否有好处.