【问题标题】:Use Wrapper classes as key and value when instantiating a Map [duplicate]实例化 Map 时使用 Wrapper 类作为键和值 [重复]
【发布时间】:2018-04-07 11:30:51
【问题描述】:

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

示例:

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>();

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

【问题讨论】:

  • 您是否尝试过这些选项中的任何一个以查看哪些选项实际编译?
  • 欢迎来到 SO。您至少可以检查发布的任何代码 sn-ps 是否编译。
  • 实现编译后只允许Wrapper类。

标签: java generics primitive


【解决方案1】:

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

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

【讨论】:

  • 为第二段点赞。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 主要类型是指原始类型?
    • @c0der 哦,是的,谢谢,已解决
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2014-05-25
    • 2012-11-24
    • 1970-01-01
    • 2023-02-12
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多