【发布时间】:2014-11-23 13:26:11
【问题描述】:
我有一个非常简单的枚举如下:
public enum Colour {
RED, BLUE, GREEN;
}
这里我放了三种颜色,但它可能有一个undefined尺寸。
这个 Enum 将用于一个可以有 undefined 个实例(数百、数千甚至数百万)的类。
在这个类中,我有一个必须返回随机颜色的方法。
对此我有两种选择。
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() 的复杂度是多少?
【问题讨论】:
-
你在浪费时间尝试对完全不相关的东西进行微优化。
-
@BoristheSpider 解释一下?
-
取模是一项昂贵的操作。你最好打电话给
rand.nextInt(values().length)。 -
如果你关心微优化,你应该使用c++。
-
@Auberon 然后考虑this link,它将给出枚举元素的最大数量为 65535。
标签: java enums complexity-theory