小弟最近遇到一个很2的问题,希望各位帮忙解决下...
先看代码:
private static List<String> list=new ArrayList<String>();public static void main(String[] args){
                  List<String> lis=new ArrayList<String>();
lis=getList();
lis.add("dddd");
System.out.println(lis.size()+"  "+list.size());
}public static List<String> getList(){
list.add("aaa");
list.add("bbb");
list.add("ccc");
return list;
}输出的结果为:4   4
我很是郁闷,后来,我把
List<String> lis=new ArrayList<String>();
lis=getList();
lis.add("dddd");
System.out.println(lis.size()+"  "+list.size());
改成
List<String> lis=new ArrayList<String>();
lis=getList();
list.add("dddd");
System.out.println(lis.size()+"  "+list.size());
结果还是:4   4
我更郁闷了。
问了下高手,说引用的是同一个对象,这样说来,还真说得通...但是我想要的结果只是取list的值,不要它整个对象;
就是输出来的结果是:4   3
这个该怎么搞啊?
谢谢 各位啦...

解决方案 »

  1.   

    修改这个方法试试
    public static List<String> getList(){
    List lis=new ArrayList();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    lis.addAll(list);
    return lis;
    }
    这样应该就能解决你的问题
      

  2.   

    先弄清楚static 
    在来改你的代码
      

  3.   

    lis=getList();
    这句你把lis 和list 2个引用指向了同一个对象 
    2个引用对应的实际是同一个对象 这样肯定是4,4
    你的操作是不正确的,假如你确实想用list中的值 克隆一个就是了
      

  4.   

    TO 1楼
    那如果我是在一个实体类里面写的一个集合类型的属性呢!
    好像set、get方法都是直接将值返回的呀!
    那是不是也会造成我开始的那种效果...
      

  5.   


    哦,那如果这样呢!
    我有个类objA,里面有个集合listA,然后在classB里面调用了listA并且赋值,在classC里面也调用了listA并且赋值,两次赋值不相同,那么现在listA的值就是在classC里面赋的值吧,但是我在classB里面进行其他操作的时候,使用的是classC赋的值啊..会不会造成这种影响?
      

  6.   

    你的那个方法getList相当于把前面list指向的东西传给了lis这个引用
    所以执行过这个方法之后,你的lis和list指向的其实是同一个东西
    所以结果会是4 4
    如果想得到你要的那个结果
    你可以把函数改为
    public static List<String> getList(ArrayList list){
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    return list;
    }
    然后main里 对list和lis分别调用getList方法
    再对你的lis.add("ddd");就可以得到你想要的答案了
    不知道我理解到你的意思没有 
    你出现那个问题的原因就是 两个引用指向了同一个东西 改变哪个都一样。。
      

  7.   

    额 我建议你把一份原始数据保存就别动了,你要更改就克隆一份去改,你这样来回去改哪一份肯定有问题的,或者你把同步锁加上
    克隆很简单例如:
    ArrayList arrayList = new ArrayList();
    ArrayList arrayList1 =(ArrayList) arrayList.clone();
    不过克隆等于重新生成一份数据,如果数据量很大的话,谨慎使用
      

  8.   

    public static List<String> getList(){
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    return new ArrayList<String>(list);
    }
      

  9.   

    一样的,不要直接返回该实体类的该集合对象就行了。主要看你返回的集合对象的目的是什么,如果只是读取而不想增加删除,可以 return Collections.unmodifiableList(list);
      

  10.   

    List<String> lis=new ArrayList<String>();
    lis.addAll(getList());
    lis.add("dddd");