Java集合Framewok映射输出问题

时间:2019-04-01 15:15:34

标签: java

    String A="A";
    String B="A";
    String C= new String("A");
    Map m1=new HashMap<String,String>();
    m1.put(A,"A");
    m1.put(B,"A");
    m1.put(C,"A");
    System.out.println(m1.size());

为什么地图大小为1,谁能解释工作原理,也可以解释地图大小如何为1 ??

2 个答案:

答案 0 :(得分:0)

Map的键必须唯一。

因此,通过执行m1.put(B, "anything");,由于B = "A"您将替换与键"A"关联的先前值。密钥通过equals()方法进行检查,如果实现是HashMap,则在确认等效性之前,它将首先通过hashcode()查找密钥。

还有一点需要注意的地方,与Map无关。 Java尝试对包含相同内容的字符串进行重复数据删除(因为String是不可变的,因此可以安全地做到这一点)。因此,String A = "A"String B = "A"实际上也可能指向相同的对象(尽管这取决于JVM)。

String C = new String("A");将迫使它创建一个新的String对象,尽管最新的垃圾收集器也将deduplicate这样做,尽管它将是一个不同的包装对象,但内部的缓冲区将是替换为与其他相同。

答案 1 :(得分:0)

Java字符串是不可变的,并且字符串的行为无法更改。每次进行任何更改时,它都会创建新的String而不是更新值。因此,在这里,所有String对象的值“ A”都相同,而哈希码对于所有三个对象也都相同。哈希图中的所有三个值都指向相同的哈希码。