关于Map<*,String>的

Map<String, String> map = new HashMap<String,String>();
String key = "1";
String value = map.get(key);
if(value == null || "".equals(value)) {
    value = new String("");
    map.put(key, value);
}
System.out.println("before change ::" + map.toString());	//output_a
value = "value";
System.out.println("after change ::" + map.toString());	//output_b

        上面的代码的执行结果:



        这个问题是我在写代码时遇到的一个问题. 我的想法是改变了value的值, 那么map中"1"对应的值也跟着改变了. 但是,其结果是没有变化.
        原因可能如下:
        String对象在java中是一个特殊的存在, java为String对象建立了一个缓存池, 当String的发生变化时, 实际上是重新构建了一个String对象, 并将对象的引用赋值给引用.
        当上边的value被重新赋值时, 一个新的String对象("value")被构建出来并将其引用赋值给value. 而原来的那个值为""的String对象被保存在String的缓存池中.仍然被map所引用.故, map没有变化. 变化的只是value.

        上面下划线的解释是错误的, 真正的原因是
if(value == null || "".equals(value)) {
    value = new String("");
    map.put(key, value);
}

         变量value在此段代码中被赋值为长度为0的字符串(""), 然后又在map.put(key, value)中作为键值对中的值放入map中,因为java是值传递的, 此时, value的值是指向""的引用,  传递给map.put的也是指向""的引用, 见第一条输出.
value = "value";

         这句中value指向""的引用被替换为指向"value"的引用, 而map中字符串"1"对应的值仍是指向""的引用, 并没有发生变化, 见第二条输出.
        另, 有如下代码:
public static void test1() {
    Map<String, List> map = new HashMap<String,List>();   
    String key = "1";   
    List value = map.get(key);   
    if(value == null ) {   
        value = new ArrayList();   
        map.put(key, value);   
    }  
    System.out.println("before change ::" + map.toString());        
    value.add("1");
    System.out.println("after add ::" + map.toString());         
    value = new ArrayList();   
    System.out.println("after new ::" + map.toString());
}


执行结果为:


================================
在此, 对看过修改之前的博文的朋友说一声对不起, 由于当时考虑不周, 此博文内容存在极大错误, 现已改正.

你可能感兴趣的:(String)