当前位置: 首页 > 面试题库 >

Enum#values()是否在每次调用时分配内存?

方楷
2023-03-14
问题内容

我需要int在Java中将序数值转换为枚举值。这很简单:

MyEnumType value = MyEnumType.values()[ordinal];

values()方法是隐式的,我无法找到它的源代码,因此是一个问题。

是否MyEnumType.values()分配新数组?如果可以的话,第一次调用时是否应该缓存该数组?假设将非常频繁地调用转换。


问题答案:

是。

Java没有让我们创建不可修改数组的机制。因此,如果values()返回相同的可变数组,我们将冒有人可以为所有人更改其内容的风险。

因此,在将不可修改的数组引入Java之前,为了安全起见,values()必须返回包含所有值的新的/分离的数组。

我们可以用==运算符来测试它:

MyEnumType[] arr1 = MyEnumType.values();
MyEnumType[] arr2 = MyEnumType.values();
System.out.println(arr1 == arr2);       //false

如果要避免重新创建此数组,则可以简单地存储它并重用values()以后的结果。有几种方法可以做到,例如。

  • 您可以创建私有数组并仅允许通过getter方法访问其内容,例如
        private static final MyEnumType[] VALUES = values();// to avoid recreating array

    MyEnumType getByOrdinal(int){
        return VALUES[int];
    }
  • 您可以将结果存储values()在不可修改的集合中,List以确保其内容不会更改(现在这样的列表可以公开)。
        html" target="_blank">public static final List<MyEnumType> VALUES = Collections.unmodifiableList(Arrays.asList(values()));


 类似资料:
  • 问题内容: 在我的应用程序中,我对用户的得分进行排名。但是,我仅每24小时计算一次我的排名。我的问题是我不知道在不打扰用户的情况下将计算代码放在哪里。 是否不可能在“后台”中每24小时调用一次代码?因为此刻,当第一个用户在24小时之后使用我的应用程序时,将调用计算代码,但是随后用户必须等待几分钟,直到计算结束。我每个用户的数据都保存在Firebase中。 提前致谢! 问题答案: 编辑2019年4月

  • React是否在每次调用时重新呈现所有组件和子组件? 如果是,为什么?我认为这个想法是,当状态改变时,只会根据需要提供少量的反应。 我希望只有在数据发生更改时才会出现呈现。 下面是示例的代码,作为JS Fiddle和嵌入的代码片段:

  • 本文向大家介绍ajax的定时调用每5秒调用一次,包括了ajax的定时调用每5秒调用一次的使用技巧和注意事项,需要的朋友参考一下

  • 所以,这个AVX的东西-它就像一个小机器的每个核心?或者它就像整个CPU的一个引擎单元? 比如,我可以在每个核心上使用它吗?我在玩它,我觉得我可能会“过度使用”它,造成某种瓶颈。 你能给我解释一下吗?我全搞错了吗?

  • 问题内容: 我希望下面的代码只会初始化,以及字典。但它似乎具有复制效果: 如您所见,结果如下: 为什么该程序会产生先前的结果,当我期望它返回时: 问题答案: 这是因为在Python中,变量(名称)只是对单个对象的引用。当您指定,你真的复制存储器地址(或指针,如果你愿意)从到。该词典仍然有一个实例。 要获得所需的行为,请使用方法,或者如果您的字典可能具有嵌套的字典或其他嵌套的对象,请使用。

  • 我尝试在每次创建活动时运行以下线程。它第一次工作,但如果我按下后退按钮并尝试再次导航到活动,它总是崩溃第二次。我怎样才能确保这个线程每次都运行成功呢?