[英]Complexity of enum.values()
我有一个非常简单的枚举,如下所示:
public enum Colour { RED, BLUE, GREEN; }
我在这里放了三种颜色,但是可能没有确定的大小。
此Enum将用于可能具有不确定数量的实例(数百,数千甚至数百万)的类中。
在此类中,我有一个必须返回随机颜色的方法。
我有两个选择。
private Colour[] colours;
public Datastructure() {
colours = Colour.values();
}
public Colour getRandomColour() {
return colours[rand.nextInt() % colours.length];
}
或者,我可以继续调用Colour.values()而不是创建颜色列表。
public Colour getRandromColour() {
return Colour.values()[rand.nexInt() % Colour.values().length]
在第一个选项中,将创建一个额外的数组。 请记住,此类可能有很多实例,因此它可能被认为浪费内存,并且也可能影响运行时间(实例化数组)。 尤其是当有很多类实例时。
在第二个选项中,Colour.values()被调用了几次(在这个简单的示例中,它仅被调用了几次,但是在我的项目中,它有点复杂,并且调用次数更多),因此可以认为这是对CPU使用率的浪费。
我更喜欢使用第二个选项,但是我对Colour.values()方法的复杂性感到好奇,我担心它可能是线性O(n)。 n是枚举中颜色的数量。 当有很多颜色时,这将是可怕的。
还是权衡利弊,选择两个弊端中的最佳者?
tl; dr Enum.values()的复杂性是什么?
Colour.values()
返回的数组始终包含相同的元素,但是values()
每次调用时都会创建一个新数组(所以它是O(n),其中n是枚举值的数量)。 而且您永远不会修改该数组。 因此,每次需要时调用该方法都是浪费时间。 并且在DataStructure类的每个实例中存储数组都是浪费时间和内存。 我只需调用一次该方法,然后将该数组缓存在一个常量中:
private static final Colour[] COLOURS = colour.values();
public Colour getRandomColour() {
return COLOURS[rand.nextInt(COLOURS.length)];
}
只要确保此数组永远不会暴露在类之外即可。
还要注意, Random.nextInt(limit)
的使用恰好满足您的要求,它可能更快,并且比使用模数更清楚地表达了意图。
为什么不只是将缓存的数组放在Color枚举本身的静态字段中。 然后在Color枚举中提供一个方法以返回随机条目。
无论如何,Color枚举拥有此数据/方法是有意义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.