天道酬勤,学无止境

enum-map

EnumMap 可能被认为是 Java bean 的合理替代品吗?(Might EnumMap be considered a reasonable alternative to Java beans?)

问题 好奇是否有人考虑过使用 EnumMap 代替 Java bean,尤其是“值对象”(没有行为)? 在我看来,一个优势似乎是“属性”的名称可以直接从支持的 Enum 访问,而无需反射,因此我认为它会更快。 回答1 它可能比使用反射快一点(我没有测量它,也没有在谷歌中找到任何指标); 但是这种方法有很大的缺点: 您正在失去类型安全性。 而不是int getAge()和String getName()一切都是Object get(MyEnum.FIELD_NAME) 。 这将提供一些丑陋的代码和运行时错误。 我们喜欢和喜欢的所有 javabean 细节(例如,属性级注释)都消失了。 由于您根本没有任何行为,因此这种方法的适用性似乎相当有限。 底线是 - 如果你真的需要所谓的:-) 性能提升(你必须测量它以证明它存在),这在非常特定的情况下可能是一种可行的方法。 它是整个 javabean 的可行替代方案吗? 绝对不是。 回答2 一个 bean 意味着是可变的,因此 setter 方法。 EnumMap 在速度上与使用整数作为 Key 的 HashMap 相当,但 Key 是不可变的。 Beans 和 EnumMaps 有两种不同的用途。 如果所有的 Key 在设计时都是已知的并且保证永远不会改变,那么使用 EnumMap 就可以了。 更新 bean 比更改 EnumMap 的支持

2022-01-22 12:09:48    分类:技术分享    java   javabeans   value-objects   enum-map

Might EnumMap be considered a reasonable alternative to Java beans?

Curious if anybody has considered using EnumMap in place of Java beans, particularly "value objects" (with no behavior)? To me it seems that one advantage would be that the name of a "property" would be directly accessible from the backing Enum, with no need for reflection, and therefore I'd assume it would be faster.

2022-01-22 08:21:40    分类:问答    java   javabeans   value-objects   enum-map

如何在 Java 的 Lambda API 中构建复制函数的 Map(How to build a Map that replicates a Function in Java's Lambda API)

问题 从将一对Enum映射到一个值的java.util.function.BiFunction ,我想构建一个反映该映射的EnumMap 。 例如,让E1和E2为enum类型,而T任何给定类型: BiFunction<E1,E2, T> theBiFunction = //...anything EnumMap<E1,EnumMap<E2,T>> theMap = buildTheMap( // <-- this is where the magic happens E1.values(), E2.values(), theBiFunction); 给定任意一对E1和E2类型的值 E1 e1 = //any valid value... E2 e2 = //any valid value.... 以下两个值应相等: T valueFromTheMaps = theMap.get(e1).get(e2); T valueFromTheFunction = theBiFunction.apply(e1,e2); boolean alwaysTrue = valueFromTheMaps.equals(valueFromTheFunction); 对于发生“魔术”的方法,最好的(更优雅、更高效等)的实现是什么? 回答1 如果您使用通用解决方案并将其分解,您将获得一个优雅的解决方案。 首先

2022-01-12 16:22:28    分类:技术分享    java   lambda   java-8   java-stream   enum-map

How to build a Map that replicates a Function in Java's Lambda API

From a java.util.function.BiFunction that maps a pair of Enums into a value, I want to build a EnumMap that reflects that mapping. For instance, let E1 and E2 be enum types and T any given type: BiFunction<E1,E2, T> theBiFunction = //...anything EnumMap<E1,EnumMap<E2,T>> theMap = buildTheMap( // <-- this is where the magic happens E1.values(), E2.values(), theBiFunction); Given any pair of values of type E1 and E2 E1 e1 = //any valid value... E2 e2 = //any valid value.... both values below should be equal: T valueFromTheMaps = theMap.get(e1).get(e2); T valueFromTheFunction = theBiFunction

2022-01-09 23:45:44    分类:问答    java   lambda   java-8   java-stream   enum-map

为什么 EnumSet 或 EnumMap 可能比散列对应物的性能更高?(Why an EnumSet or an EnumMap is likely to be more performant than their hashed counterparts?)

问题 以下内容来自 EnumMap 的 Java 文档的实现说明部分: 实现说明:所有基本操作都在恒定时间内执行。 它们很可能(虽然不能保证)比它们的 HashMap 对应物更快。 我在EnumSet的 java 文档中也看到了类似的行。 我想知道为什么EnumSets和EnumMaps比它们的散列对应物更快? 回答1 EnumSet由位数组支持。 由于您可以放入EnumSet的不同项目的数量是预先知道的,我们可以简单地为每个枚举值保留一位。 您可以想象对Set<Byte>或Set<Short>进行类似的优化,但对于Set<Integer> (对于 2^32 位,您需要 0.5 GiB 内存)或一般情况下,这是不可行的。 因此像exists或add ar 常量时间这样的基本操作(就像HashSet一样),但它们只需要检查或设置一位。 没有hashCode()计算。 这就是EnumSet更快的原因。 还有更复杂的操作,如联合或使用位操作技术轻松实现。 在 OpenJDK 中,有两种EnumSet实现: RegularEnumSet能够处理最多 64 个 long 值的 enum 和JumboEnumSet用于更大的 enum(使用 long[])。 但这只是一个实现细节。 EnumMap工作原理类似,但它使用Object[]来存储值,而键(索引)是从Enum.ordinal(

2021-06-09 15:42:37    分类:技术分享    java   enums   enumset   enum-map

番石榴中是否有相应的不可变 enumMap ?(Is there a corresponding immutable enumMap in guava?)

问题 我最近了解了 EnumMap 在 Java 中的好处,并想将现有的ImmutableMap<OccupancyType, BigDecimal>替换为 EnumMap。 但是,我也喜欢 ImmutableMap 提供的不可变属性。 番石榴中是否有变体 ImmutableEnumMap 可用? 在存储方面哪一个(EnumMap vs ImmutableMap)表现更好? 我找不到两者的比较。 如果有人可以指出我的链接或对两种数据结构的效率提供一些见解,我将不胜感激? 回答1 番石榴贡献者在这里。 Guava 目前没有ImmutableEnumMap变体,但如果有,它可能只是一个EnumMap的包装器。 (也就是说,稍微好一点的不可变实现是可能的。) 在任何情况下, EnumMap都会比基本的ImmutableMap表现得更好; 很难或不可能被击败。 (不过,我将提交一个问题来调查为枚举键类型添加ImmutableMap变体。) 更新:Guava 14 添加了 Maps.immutableEnumMap()。 回答2 我只是想提供一个例子,因为ImmutableEnumMap在 Guava 14.0 中,因为它是一个包私有类,所以你不能做ImmutableEnumMap.of() 。 您必须改为执行Maps.immutableEnumMap() 。 private final

2021-06-03 01:42:21    分类:技术分享    java   immutability   guava   enum-map

EnumMap 或 HashMap 如果查找键是字符串(EnumMap or HashMap if lookup key is a String)

问题 我正在尝试权衡在HashMap上使用EnumMap利弊。 因为,我将始终使用String查找,所以带有String键的HashMap似乎是正确的选择。 然而, EnumMap似乎是更好的设计,因为它传达了我将键限制为特定枚举的意图。 想法? 这是一个虚构的例子,展示了我将如何使用Map : enum AnimalType { CAT, DOG } interface Animal {} class Cat implements Animal {} class Dog implements Animal {} public class AnimalFactory { private static final Map<AnimalType, Animal> enumMap = new EnumMap<AnimalType, Animal>(AnimalType.class); // versus private static final Map<String, Animal> stringMap = new HashMap<String, Animal>(); static { enumMap.put(AnimalType.CAT, new Cat()); enumMap.put(AnimalType.DOG, new Dog()); stringMap.put("CAT"

2021-06-02 06:54:22    分类:技术分享    java   collections   hashmap   enum-map

EnumMap or HashMap if lookup key is a String

I'm trying to weigh the pros and cons of using an EnumMap over a HashMap. Since, I will always be looking up using a String, it seems that a HashMap with a String key would be the right choice. However, an EnumMap seems like better design because it conveys my intent to restrict keys to a specific enumeration. Thoughts? Here is a make-believe example, showing how I will be using the Map: enum AnimalType { CAT, DOG } interface Animal {} class Cat implements Animal {} class Dog implements Animal {} public class AnimalFactory { private static final Map<AnimalType, Animal> enumMap = new EnumMap

2021-05-17 14:00:08    分类:问答    java   collections   hashmap   enum-map

Why an EnumSet or an EnumMap is likely to be more performant than their hashed counterparts?

The following is from the Implementation Note section of Java doc of EnumMap : Implementation note: All basic operations execute in constant time. They are likely (though not guaranteed) to be faster than their HashMap counterparts. I have seen a similar line in the java doc for EnumSet also . I want to know why is it more likely that EnumSets and EnumMaps will be more faster than their hashed counterparts ?

2021-05-01 06:58:09    分类:问答    java   enums   enumset   enum-map

Is there a corresponding immutable enumMap in guava?

I recently learnt about the benefits of EnumMap in Java and would like to replace the existing ImmutableMap<OccupancyType, BigDecimal> to EnumMap. However, I'd also like the immutable property offered by ImmutableMap. Is there a variant, ImmutableEnumMap available in guava ? In terms of storage which one (EnumMap vs ImmutableMap) performs better ? I couldn't find a comparison of the two. I'd appreciate if someone can point me to a link or give some insights on the efficiency of the two data structures ?

2021-04-24 14:01:53    分类:问答    java   immutability   guava   enum-map