【问题标题】:HashMap can store only object key and value [closed]HashMap 只能存储对象键和值
【发布时间】:2014-12-22 11:52:23
【问题描述】:

HashMap 不采用原始类型作为键和值,但我们仍然可以轻松存储原始类型的值,如下所示:

HashMap h = new HashMap();

h.put(1,1);

这怎么可能?

【问题讨论】:

  • 了解泛型和接口。你的代码应该是Map<Integer, Integer> h = new HashMap<Integer, Integer>();
  • 是的,java 通过使用自动装箱和收件箱将int 转换为Integer,您期待什么?
  • 您的问题非常不清楚(也可以使用更好的格式)。请阅读tinyurl.com/stack-hints 并编辑您的问题以澄清它。

标签: java hashmap


【解决方案1】:

这是因为1自动装箱Integer(实际上与此相同:Integer.valueOf(1))。查找有关autoboxing here 的更多信息。

  • int 被装箱到 Integer
  • long 被装箱到 Long
  • double 被装箱到 Double
  • float 被装箱到 Float
  • boolean 被装箱到 Boolean

在您的示例中,您使用的是Map原始类型。您声明的 Map-object 很可能应该这样声明:

Map<Integer, Integer> h = new HashMap<>();
h.put(1, 1);

SO-question 中了解有关原始类型的更多信息。

【讨论】:

    【解决方案2】:

    当您将原语存储在HashMap(或任何Collection)中时,它们会被装箱到它们的引用类型中。 int 被装箱到 Integer

    【讨论】:

    • 不问问题就被否决了。
    • 我们可以在几秒钟内回答这类问题吗?
    【解决方案3】:

    原语由编译器自动装箱并作为包装对象插入。因此,在您的情况下,它将自动装箱为 Integer 对象。有关详细信息,请参阅this。每个原始类型都有对应的包装对象,其中一些像:

    primitive - Object  
       byte   -  Byte
       char   -  Character
       short  -  Short
       int    -  Integer
       long   -  Long
       double -  Double
       float  -  Float
       boolean - Boolean
    

    【讨论】:

      【解决方案4】:

      正如任何 Java 程序员都知道的那样,您不能将 int(或其他原语 值)到一个集合中。

      集合只能保存对象引用, 所以你必须将原始值装箱到适当的包装类中 (在 int 的情况下是整数)。

      当你把物体从 集合,你得到你放入的整数;如果你需要一个 int,您必须使用 intValue 方法拆箱 Integer。所有这些 装箱和拆箱是一件痛苦的事,而且会弄乱你的代码。

      autoboxingunboxing 功能使过程自动化,消除了 痛苦和混乱。

      refer java docs for more details

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 2021-07-31
        • 2012-06-18
        • 1970-01-01
        • 2012-08-30
        • 1970-01-01
        相关资源
        最近更新 更多