森栏
List.clear 会删除这些元素而不减少列表的容量。groovy:000> mylist = [1,2,3,4,5,6,7,8,9,10,11,12]===> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]groovy:000> mylist.elementData.length===> 12groovy:000> mylist.elementData===> [Ljava.lang.Object;@19d6afgroovy:000> mylist.clear()===> nullgroovy:000> mylist.elementData.length===> 12groovy:000> mylist.elementData===> [Ljava.lang.Object;@19d6afgroovy:000> mylist = new ArrayList();===> []groovy:000> mylist.elementData===> [Ljava.lang.Object;@2bfdffgroovy:000> mylist.elementData.length===> 10在这里,mylist被清除,对其所包含元素的引用也被清空,但它保留了相同的后备数组。然后,重新初始化mylist并获得一个新的后备阵列,对旧列表进行GCed。因此,一种方法可以保留内存,另一种方法可以丢弃内存,并从头开始重新分配(具有默认容量)。哪个更好,取决于您是要减少垃圾回收流失还是要使当前的未使用内存量最小化。该列表是否停留足够长的时间以至于可以从Eden中移出,这可能是决定哪个列表更快的一个因素(因为这可能会使垃圾回收变得更加昂贵)。