Java 独立arraylist构建与比较器逻辑对垃圾收集的影响

Java 独立arraylist构建与比较器逻辑对垃圾收集的影响,java,performance,arraylist,garbage-collection,Java,Performance,Arraylist,Garbage Collection,向Java垃圾收集专家提出的问题。想了解当我们通过以下技术进行排序时,是否/有任何性能影响堆内存 具有唯一成员变量的对象集合 ArrayList<Car> Class Car{ boolean preferredVehicle; } ArrayList 班车{ 布尔优先车辆; } 现在,我们需要对首选车辆进行排序,并将其显示在选择列表的顶部 方法1: 创建两个列表一个是regularList,一个是PreferredList 迭代CarList,如果布尔值为true,则添加到

向Java垃圾收集专家提出的问题。想了解当我们通过以下技术进行排序时,是否/有任何性能影响堆内存

具有唯一成员变量的对象集合

ArrayList<Car> 

Class Car{
boolean preferredVehicle;
}
ArrayList
班车{
布尔优先车辆;
}
现在,我们需要对首选车辆进行排序,并将其显示在选择列表的顶部

方法1:

  • 创建两个列表一个是regularList,一个是PreferredList
  • 迭代CarList,如果布尔值为true,则添加到PreferredList
  • 将非首选汽车添加到非首选汽车列表
  • 一旦车辆列表循环完成,将所有非首选项添加到完整的首选项列表中
  • 方法2: Collections.sort使用比较器

    在性能上是否存在可量化的差异?在未来的垃圾收集和堆内存消耗中,哪一种更友好?

    方法1是
    O(n)
    ,而方法2是
    O(n*logn)
    。所以我会选择#1。
    至于GC,我没有看到真正的区别,主要是因为
    Car
    实例是相同的。
    HTH,

    Yinon

    2列表肯定会获得更多的空间,并想象列表是巨大的。而且,如果您不预先分配所需的列表容量,添加一个元素可能会导致另一个列表对象分配的大小增加一倍,因此gc需要更多的工作。
    如果你不在乎原始订单,就在同一个列表上进行排序。

    这是一个很好的视角“如果你不在乎原始订单”@satts我想,情况正好相反:1。排序是
    O(n*log(n))
    ,因此对于大型列表来说速度较慢。2.它还需要一些临时内存(AFAIK没有使用临时内存的稳定排序),因此它可能与两个列表一样昂贵。3.它是稳定的,这意味着您可以保留原始顺序。@maartinus我同意您的说法,排序是O(nlog(n))。在这种情况下,排序是基于布尔值的,这意味着如果在开始处排列True,在另一端排列false,则可以在O(n)中对原始列表进行排序,而无需额外空格,即使Car实例相同,但列表容器不同。而且,如果列表容量不是在实例化时预定义的,那么许多列表对象的分配将发生在容量不足的情况下。因此,在同一个列表上,您可以实现O(n)