Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java enum.values()的复杂性_Java_Enums_Complexity Theory - Fatal编程技术网

Java enum.values()的复杂性

Java enum.values()的复杂性,java,enums,complexity-theory,Java,Enums,Complexity Theory,我有一个非常简单的枚举,如下所示: 公共枚举颜色{ 红、蓝、绿; } 这里我放了三种颜色,但它可能有一个未定义的大小 此枚举将用于具有未定义的实例数(数百、数千甚至数百万)的类中 在这个类中,我有一个必须返回随机颜色的方法 我有两个选择 private Colour[] colours; public Datastructure() { colours = Colour.values(); } public Colour getRandomColour() { retu

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

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

这里我放了三种颜色,但它可能有一个未定义的大小

此枚举将用于具有未定义的实例数(数百、数千甚至数百万)的类中

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

我有两个选择

private Colour[] colours;

public Datastructure() {

    colours = Colour.values();
}

public Colour getRandomColour() {
     return colours[rand.nextInt() % colours.length];
}
或者我可以继续调用color.values(),而不是创建颜色列表

public Colour getRandromColour() {
     return Colour.values()[rand.nexInt() % Colour.values().length]
在第一个选项中,将创建一个额外的数组。请记住,该类可能有许多实例,因此可能会被视为内存浪费,并且可能会影响运行时间(实例化数组)。特别是当有很多类实例时

在第二个选项中,color.values()被调用了几次(在这个简单的示例中,它只调用了几次,但在我的项目中,它有点复杂,并且有更多的调用),因此这可能被认为是CPU使用的浪费

我更喜欢使用第二个选项,但我对color.values()方法的复杂性感到好奇,我担心它可能是线性的O(n)。n是枚举中的颜色数。如果有很多颜色,那就太可怕了

或者只是权衡利弊,从两种邪恶中选择最好的


tl;drEnum.values()的复杂性是什么?

color.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.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 enum拥有这段数据/方法是有意义的。

为什么不将缓存的数组放在color enum本身的静态字段中呢。然后在颜色枚举中提供一个方法以返回一个随机条目


无论如何,颜色枚举拥有这段数据/方法是有意义的。

尝试对完全无关的内容进行微优化是在浪费时间。@Boristeider解释?模运算是一项昂贵的操作。您最好调用
rand.nextInt(values().length)
。如果您关心微优化,您应该使用C++ + .Aubon,然后考虑将EnUM元素的最大数量为65535。您浪费时间来尝试优化完全无关的东西。BrasSppIDER解释说?Modulo是一个昂贵的操作。你最好调用<代码> RAND .NEXT(Values)长度(<代码> >。如果微优化是你的关注点,你应该使用C++。@ Aubon,然后考虑它会给EnUM元素的最大数量为65535。谢谢。有点奇怪,我没想到这个。你能修改你的答案,让它提到@Boristeider指出的事情吗?(Modulo是昂贵的+.values()相当于.clone(),它是O(n))@Auberon答案修改的。就我个人而言,我会在enum类本身内部完成这一切(将
rand
COLORS
定义为私有静态成员,将
getrandomColor
定义为公共静态)。将
color
相关函数封装在
color
@realponsign中这当然是一个有效的选项。它主要取决于您如何考虑<代码> GeTrand OrthCuulor()/Cuth>:它是一个有用的方法,并且很多类都需要调用,或者它只是在特定的用例中有用,不应该污染枚举的公共API吗?谢谢。有点奇怪,我没想到这个。你能修改你的答案,让它提到@Boristeider指出的事情吗?(Modulo是昂贵的+.values()相当于.clone(),它是O(n))@Auberon答案修改的。就我个人而言,我会在enum类本身内部完成这一切(将
rand
COLORS
定义为私有静态成员,将
getrandomColor
定义为公共静态)。将
color
相关函数封装在
color
@realponsign中这当然是一个有效的选项。它主要取决于您如何考虑<代码> GeTrand OrthCuulor()/Cuth>:它是一个有用的方法,并且很多类需要调用,或者是在特定的用例中有用的东西,而不应该污染枚举的公共API?