在实例化Map时使用Wrapper类作为键和值

时间:2017-10-26 07:31:46

标签: java generics primitive

我在实例化Map时遇到了一些关于语义的问题。具体来说,我应该在分配键和值类型时使用Wrapper类,还是可以使用原始类型?

示例:

tableView.separatorColor = UIColor.red

OR

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

示例:

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

OR

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

两种实例在约定和含义方面是否有任何区别?我知道使用原始类型在读取或写入对象时会调用Autoboxing。

3 个答案:

答案 0 :(得分:3)

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

阵列是一个不同的问题。原始数组实际上是对象,因此您可以在通用规范中使用它们。但是,数组不会覆盖equals(Object)hashCode()方法(无论它们是否是基元或对象的数组),这使得它们成为地图键的非常差的选择。 / p>

答案 1 :(得分:1)

Primitives不能用于泛型。因此, 使用Wrapper Types

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

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

答案 2 :(得分:1)

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

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