繁体   English   中英

enum.values()的复杂度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM