【问题标题】:How null element is treated by list and map in JavaJava中的list和map如何处理null元素
【发布时间】:2012-03-21 06:39:32
【问题描述】:

以下输出的合理性是什么? null 元素被 list 和 map 区别对待。

List<Object> hoo = new ArrayList<Object>() {
    {
        add(null);
        add(null);
    }
};

Map<Object, Object> bar = new HashMap<Object, Object>() {
    {
        put(null, null);
        put(null, null);
        put(null, null);

    }
};
System.err.println("hoo:" + hoo.size());
System.err.println("bar:" + bar.size());

输出:

hoo:2
bar:1

【问题讨论】:

  • 您期望什么?对于任何单个非空对象,您也会看到相同的结果。相同的值(显然)被列表和映射区别对待,仅此而已。

标签: java list map


【解决方案1】:

具体来说:列表可以有重复项,但映射不能有重复键,这就是为什么我们可以在列表中有 2 个空值,而在映射中只有一个空值。

对于您更一般的问题(这些接口如何处理重复项的逻辑)的答案是,没有任何一种“更多”或“更少”的逻辑方式来实现地图中的空约束。

当然,没有通用的规则:例如 - 最初,java 的 Hashtables不允许空值。
但后来,HashMap 实现了不同的行为(允许空值)。

由于现实世界当然有我们可以有空值的实例,但很少有实例我们会/应该有一个空键,你可能会问自己为什么你有多个具有空键和空值的条目在相同的数据结构中 - 这些值是否真的代表任何有意义的东西?

【讨论】:

    【解决方案2】:

    因为Map 只能有唯一键。在这种情况下,它是null

    put(null, null);
    put(null, null);
    put(null, null);
    

    之前的语句实际上是在第一次调用后覆盖了值。这就是为什么大小保持为 1

    【讨论】:

    • +1。与 null 无关,真的。 add("a") 也会发生同样的事情
    【解决方案3】:

    Java documentation 状态:

    如果映射先前包含键的映射,则旧值 被替换了

    bar:1 完全正确。

    【讨论】:

      【解决方案4】:

      HashMap 不允许您存储具有重复键的值(在这种情况下您的值为 null)。这就是第二种情况下大小为“1”的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多