关于Map<*,String>的

本文通过两个示例探讨了Java中String与List对象作为Map值时的行为差异。第一个示例展示了当String对象被更新时,Map中的对应值不会改变的现象及原因。第二个示例则说明了List对象的变化如何能反映到Map中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

上面的代码的执行结果:

[img]http://dl.iteye.com/upload/attachment/370819/e88007e9-a4b3-3458-8a36-5c8a32f8277a.bmp[/img]

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

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());
}


执行结果为:

[img]http://dl.iteye.com/upload/attachment/455551/95bb0997-bdcb-336b-bb96-d338c03fe682.bmp[/img]
================================
在此, 对看过修改之前的博文的朋友说一声对不起, 由于当时考虑不周, 此博文内容存在极大错误, 现已改正.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值