实例化 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
键入 key
或 value
。 int[]
有效,因为根据 Java doc array
是 Object
.
如果您想将自定义对象用作 key/value
,您应该使 class 不可变,或者必须覆盖 hashCode()
和 equals()
方法。
我对实例化 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
键入 key
或 value
。 int[]
有效,因为根据 Java doc array
是 Object
.
如果您想将自定义对象用作 key/value
,您应该使 class 不可变,或者必须覆盖 hashCode()
和 equals()
方法。