我需要从
List<MyObject> objects
中挑选 N 个随机元素。 MyObject
是一个复杂的类对象。我可以轻松地 Collections.shuffle(objects)
,并获得大小为 N 的子列表。
但后来我想到了一个想法。如果我创建一个
List<Integer> indexes
= [0, N-1],改洗这个索引数组,获取一个子列表,并使用它从原始列表中获取元素,它会提高性能吗?
我的问题归结为:在 Java 中重排与轻量级对象列表之间是否存在有意义的性能差异?
ps:如果重要的话,我需要在新列表中返回随机选择,同时将它们从原始列表中删除。
没有区别。
A
List
是references(本质上是指针)的集合,而不是对象。列表中的每个元素都是一个引用,可以将其视为对象所在的内存中的地址。该引用隐式地将您带到该对象的内容。因此,我们很方便地认为该列表包含对象,尽管这并不完全准确。
因此,洗牌
List<MyObject>
和洗牌 List<Integer>
会做同样的工作。两者都会打乱对象引用的集合,而不是对象。这些对象从未移动过,它们始终位于相同的内存地址中。对 MyObject
对象的引用和对 Integer
对象的引用是相同的,都是引用。
打乱重物体与轻物体的列表
MyObject
类和Integer
类的大小和复杂性与洗牌List
无关。