为什么从java.util.HashMap [Long,Long]中获取缺少的键返回0L?

时间:2014-04-27 02:18:15

标签: java scala hashmap

我在scala repl中玩,发现了这个:

scala> new java.util.HashMap[Long, Long]().get(1L)
res2: Long = 0

为什么会回归呢? Java哈希映射应该为缺失的密钥返回null。

3 个答案:

答案 0 :(得分:4)

找到机制并不太难。

scala> new java.util.HashMap[Long, Long]().get(1L)
res0: Long = 0

scala> :javap -prv -
Binary file res0 contains $line3.$read$$iw$$iw$
[snip]
        17: invokestatic  #30                 // Method scala/runtime/BoxesRunTime.boxToLong:(J)Ljava/lang/Long;
        20: invokevirtual #34                 // Method java/util/HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
        23: invokestatic  #38                 // Method scala/runtime/BoxesRunTime.unboxToLong:(Ljava/lang/Object;)J

public static long unboxToLong(Object l) {
    return l == null ? 0 : ((java.lang.Long)l).longValue();
}

答案 1 :(得分:3)

你应该,

  1. 使用Scala map
  2. 使用Java时检查密钥是否与containsKey(Object)一样。

它不能像在Scala中那样工作。来自scala.Null documentation -

  

由于Null不是值类型的子类型,因此null不是任何此类型的成员。例如,无法将null赋给scala.Int类型的变量。

答案 2 :(得分:3)

在Scala中,LongAnyVal,因此它不能为空。