黑马程序员技术交流社区

标题: 集合的一些问题 [打印本页]

作者: 唐溪永    时间: 2012-2-23 23:31
标题: 集合的一些问题
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
这样为什么就可以改变呢?
急呀
作者: H07000223    时间: 2012-2-23 23:44
本帖最后由 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的引用已经发生变化了。对于字符串这种类型的对象一旦产生了就不能改变了。
拼接的结果就是产生了新的字符串对象




作者: 张建银    时间: 2012-2-24 00:01
你可以简单认为new出的对象是可变对象,而“123”是常量对象,常量对象在栈中没有引用变量来保存该对象在堆中值的地址
作者: tanlei200620    时间: 2012-2-24 01:11
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 ";  将引用的地址里存放的值进行了改变




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2