gpt4 book ai didi

java - enum.values() 的复杂性

转载 作者:行者123 更新时间:2023-12-01 18:23:04 26 4
gpt4 key购买 nike

我有一个非常简单的枚举,如下所示:

公共(public)枚举颜色{
红、蓝、绿;
}

这里我放置了三种颜色,但它可能具有未定义尺寸。

此枚举将在一个类中使用,该类可以具有未定义数量的实例(数百、数千甚至数百万)。

在这个类中,我有一个必须返回随机颜色的方法。

对此我有两个选择。

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;drEnum.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) 的用法,它完全符合您的要求,可能更快,并且比使用模数更清楚地表达意图。

关于java - enum.values() 的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27089438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com