黑马程序员技术交流社区

标题: 关于java引用一个容易犯错的地方 有兴趣的来难看 [打印本页]

作者: 杨卓儒    时间: 2012-9-12 15:56
标题: 关于java引用一个容易犯错的地方 有兴趣的来难看

      List<Map<String,String>> list = new ArrayList<Map<String,String>>();
        Map<String,String> m =new HashMap<String,String>();
        m.put("k","0");
        list.add(m);
        m.put("k","1");
        list.add(m);
        System.out.println(list.toString());   


大家觉的最后的结果是什么,是[{k=0}, {k=1}]   还是[{k=1}, {k=1}],不要做实验啊,直接想
作者: 何明辉    时间: 2012-9-12 16:19
我是这样理解的,不知道符不符合你说的意思。
其实你的程序里面无非不就是想表达用无序,重复集合来存放有序,重复集合到底是什么样一个概念。
当你每次调用list.add(m)的时候m集合里面的数据其实已经放生了变化,而你调用的这次变化后的集合m存储到List集合中时是不会影响到上一次存储到集合List中的m的值。
所以我认为结果是第一种,而不是第二种。当让我没有做实验,哈哈
作者: 杨卓儒    时间: 2012-9-12 16:27
何明辉 发表于 2012-9-12 16:19
我是这样理解的,不知道符不符合你说的意思。
其实你的程序里面无非不就是想表达用无序,重复集合来存放有 ...

嗯 是发生了变化  但你要知道List添加的m添加的是什么 怎么来判断他变与不变  再想想
作者: 何明辉    时间: 2012-9-12 18:00
杨卓儒 发表于 2012-9-12 16:27
嗯 是发生了变化  但你要知道List添加的m添加的是什么 怎么来判断他变与不变  再想想 ...

刚才我做练习总结了一下:
对于装的是容器这样的类型数据,也就是这样的变量本身的值能在自身的基础上通过增删发生变化。对于这样的数据m的值是以最终存储的为准,其他的类型都以每次存储的m的值为准。我总结的对吗?
你要是知道容器里面是怎么存储数据的最好能给我讲讲。
容器里面放的应该是Object类型的数组,那么链表结构有是怎么回事了?
这里我也举了个列子:
import java.util.*;
class UtilDemo
{
  public static void main(String[] args)
{
      List<StringBuffer> list = new ArrayList<StringBuffer>();
   StringBuffer bf=new StringBuffer();
       bf.append("adadaxx");
        list.add(bf);
  bf.append("1111222");
        list.add(bf);//以最终存储的bf为准。
        System.out.println(list.toString());   
}
}


作者: 杨卓儒    时间: 2012-9-12 19:13
何明辉 发表于 2012-9-12 18:00
刚才我做练习总结了一下:
对于装的是容器这样的类型数据,也就是这样的变量本身的值能在自身的基础上通 ...

m的值一经创建就没有变过,对于ArrayList添加了两次m,要知道m是一个HashMap对象,因此添加进去的是m对象的引用,而m中装的东西因为是HashMap元素,因此最终只有k=1这一个键值对,因为HashMap中存储数据的特点像函数,要一一映射,一个k只能对应一个值,因此最终m中的键值对是k=1,而ArrayList添加了两次m,就是2个相同的引用,但是ArrayList不会判断两个引用是否相同,毕竟不是HashSet。所以最终结果是 {(k=1),(k=1)}




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