A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐溪永 黑马帝   /  2012-2-23 23:31  /  1613 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Map   df   =   new     HashMap();     
                df.put( "a ",new   int[24]);
                int[]   count1=(int[])(df.get( "a "));
                count1[1]=count1[1]+10;                 
                int[]   count2=(int[])(df.get( "a "));                 
                System.out.println( "count= "+count2[1]);
               
                Map   df1   =   new     HashMap();     
                df.put( "a ", "12345 ");
                String   count11=(String)(df.get( "a "));
                count11+= "yuiii ";                 
                String   count12=(String)(df.get( "a "));                 
                System.out.println( "count12= "+count12);
               
打印出来的结果是
count=10
count12=12345
为什么df里面的值可以改变而df1就没改变

但换成
                Map   df   =   new     HashMap();     
                df.put( "a ",new   int[24]);
                int[]   count1=(int[])(df.get( "a "));
                count1[1]=count1[1]+10;                 
                int[]   count2=(int[])(df.get( "a "));                 
                System.out.println( "count= "+count2[1]);
               
                Map   df1   =   new     HashMap();     
                df.put( "a ",new   String[24]);
                String[]   count11=(String[])(df.get( "a "));
                count11[1]= "yuiii ";                 
                String[]   count12=(String[])(df.get( "a "));                 
                System.out.println( "count12= "+count12[1]);

打印出来的结果是
count=10
count12=yuiii
这样为什么就可以改变呢?
急呀

3 个回复

倒序浏览
本帖最后由 H07000223 于 2012-2-24 00:06 编辑

总算看明白了:

对于第一个HashMap对象df:[key=>"a",value=>数组]

对于第二个HashMap对象df1:[key=>"a",value=>字符串]

我想可能是因为数组是对象的缘故:两次取得的数组对象来自同一内存空间吧。你可以打印试一下:System.out.println(count1==count2);

而count11和count12是指向两个对象的:count11 += "yuiii";count11的引用已经发生变化了。对于字符串这种类型的对象一旦产生了就不能改变了。
拼接的结果就是产生了新的字符串对象



回复 使用道具 举报
你可以简单认为new出的对象是可变对象,而“123”是常量对象,常量对象在栈中没有引用变量来保存该对象在堆中值的地址
回复 使用道具 举报
df.put( "a ",new   int[24]);      df.put( "a ",new   String[24]);     都是存放的  引用的地址,
而  df.put( "a ", "12345 ");   存放的是字符串“12345”的地址,
count1[1]=count1[1]+10;   和 count11[1]= "yuiii ";  将引用的地址里存放的值进行了改变
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马