HashMap 的意外输出

发布于 2024-10-22 02:32:01 字数 1176 浏览 0 评论 0原文

代码:

public class Puzzle23{
    void Puzzle23(){
        map1.put(String1, "1");
        map1.put(String2, "2");
    }

    private final NewMap map1 = new NewMap();
    private static final String String1 = new String("J2eeSig");
    private static final String String2 = new String("J2eeSig");

    public static void main(final String args[]){
        final Puzzle23 p22 = new Puzzle23();
        final Map<String, String> map2 = new HashMap();

        map2.put(String1, "1");
        map2.put(String2, "2");
        System.out.println(p22.map1.size() == map2.size() ? true : false);
        p22.map1.remove(new String(String1));
        map2.remove(new String(String2));
        System.out.println(p22.map1.size() == map2.size() ? true : false);
    }

    class NewMap extends IdentityHashMap<String, String>{
        public void put(final String... values){
            super.put(values[0], values[1]);
        }

        public int size(){
            return super.size() + 1 - 1 / 1 * 1;
        }
    }
}

实际结果:-

false
true

预期结果:-

true
true

为什么???

CODE:

public class Puzzle23{
    void Puzzle23(){
        map1.put(String1, "1");
        map1.put(String2, "2");
    }

    private final NewMap map1 = new NewMap();
    private static final String String1 = new String("J2eeSig");
    private static final String String2 = new String("J2eeSig");

    public static void main(final String args[]){
        final Puzzle23 p22 = new Puzzle23();
        final Map<String, String> map2 = new HashMap();

        map2.put(String1, "1");
        map2.put(String2, "2");
        System.out.println(p22.map1.size() == map2.size() ? true : false);
        p22.map1.remove(new String(String1));
        map2.remove(new String(String2));
        System.out.println(p22.map1.size() == map2.size() ? true : false);
    }

    class NewMap extends IdentityHashMap<String, String>{
        public void put(final String... values){
            super.put(values[0], values[1]);
        }

        public int size(){
            return super.size() + 1 - 1 / 1 * 1;
        }
    }
}

Actual Result:-

false
true

Expected Result:-

true
true

Why???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

愚人国度 2024-10-29 02:32:01

这是因为使用NewMapIdentityHashMap。检查文档中所说的地方

此类不是通用的 Map 实现!虽然此类实现了 Map 接口,但它故意违反了 Map 的一般契约,该契约强制要求在比较对象时使用 equals 方法。此类仅设计用于需要引用相等语义的极少数情况。

编辑:
无论如何,我在你的代码中发现了一个错误。 void Puzzle23() 不是构造函数,它是一个方法。必须定义没有返回值的构造函数(例如Puzzle23())。所以你永远不会填充map1。当您修复此问题时,您会发现由于 IdentityHashMap,您的输出为 false false。当您将 map1 切换到 HashMap 时,输出将为 true true 正如您所期望的。无论如何,请检查 IdentityHashMap 的文档。

it's because of use NewMap is IdentityHashMap. Check documentation where is said

This class is not a general-purpose Map implementation! While this class implements the Map interface, it intentionally violates Map's general contract, which mandates the use of the equals method when comparing objects. This class is designed for use only in the rare cases wherein reference-equality semantics are required.

EDIT:
Anyway I found a error in your code. void Puzzle23() is not constructor it's a method. Constructor have to be defined without return value (e.g. Puzzle23()). So you never fill map1. When you fix this you realize that your output is false false because of IdentityHashMap. When you switch map1 to HashMap output will be true true as you expected. Anyway check documentation of IdentityHashMap.

能怎样 2024-10-29 02:32:01

IdentityHashMap 使用 ==,而普通 HashMap 使用 .equals()。请参阅文档

IdentityHashMap uses == where ordinary HashMap uses .equals(). See documentation.

愛上了 2024-10-29 02:32:01

p22.map1.remove(new String(String1)); 不会删除任何内容,因为 NewMapIdentityHashMap 的子类。

更新

我错了

1) 这里的第一个错误是伪装成构造函数的 void 方法。这就是为什么 p22.map1 始终为空。

2) 第二个是NewMap,它是IdentityHashMap。添加 2 个字符串后,其大小变为 2,因为虽然这些字符串相等,但它们并不相同 (==)。

3) p22.map1.remove(new String(String1)); 不会像我之前说的那样做任何事情。

p22.map1.remove(new String(String1)); will not remove anything because NewMap is a subclass of IdentityHashMap.

Update

I was wrong

1) First error here is void method disguised as constructor. That's why p22.map1 is always empty.

2) Second one is a NewMap which is IdentityHashMap. After 2 strings is added to it its size becomes 2 because while this strings are equal they are not identical (==).

3) p22.map1.remove(new String(String1)); will not do anything as I said earlier.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文