实例化 Map 时使用 Wrapper 类 作为 key 和 value

Use Wrapper classes as key and value when instantiating a Map

我对实例化 Map 时的某些语义有疑问。具体来说,我应该在分配键和值类型时使用 Wrapper class,还是可以使用原始类型?

示例:

Map<int, String> map = new TreeMap<int, String>();

Map<Integer, String> map = new TreeMap<Integer, String>();

示例:

Map<int[], String> map = new TreeMap<int[], String>();

Map<Integer[], String> map = new TreeMap<Integer[], String>();

这两个实例化在约定和含义上有什么区别吗?我知道使用原始类型会在读取或写入对象时调用自动装箱。

Primitives 不能在泛型中使用。所以你使用Wrapper Types

但是使用原始数组是可以的,因为Java-数组总是objects.

如果您想使用基元,请查看 Project Valhalla。想要摆脱 java 中的大量垃圾并实现 Value Types(类似于 primitives

您不能在泛型类型规范中使用基本类型(例如上面建议的 Map<int, String>),因此您必须使用包装器 classes(即 Map<Integer, String> 对于这个用例)。当然,当 调用 这样的 class' 方法时,您仍然可以使用原语,因为原语将被自动装箱(例如,myMap.put(7, 'Some String').

数组是一个不同的问题。基本数组实际上是对象,因此您可以在通用规范中使用它们。但是,数组不会覆盖 equals(Object)hashCode() 方法(无论它们是基元数组还是对象数组),这使得它们成为映射键的一个非常糟糕的选择。

地图不允许 primitive 键入 keyvalueint[] 有效,因为根据 Java doc arrayObject.

如果您想将自定义对象用作 key/value,您应该使 class 不可变,或者必须覆盖 hashCode()equals() 方法。