package test;import java.util.ArrayList;
import java.util.List;public class TestList { public static void main(String[] args){
List<String> list = new ArrayList<String>();
testList(list);
System.out.println("list.size()="+list.size());

Integer num = new Integer(0);
testInteger(num);
System.out.println("num="+num);

int count = 0;
testInt(count);
System.out.println("count="+count);
}

public static void testInt(int count){
while(count < 10){
count = count + 1;
}
System.out.println(count);
}

public static void testInteger(Integer num){
while(num < 10){
num = num + 1;
}
System.out.println(num);
}

public static void testList(List<String> list){
while(list.size() < 10){
list.add("111111");
}
System.out.println(list.size());
}
}
最后的输出结果为:
10
list.size()=10
10
num=0
10
count=0请问:第一个传的是一个集合对象,在处理的方法中可以改变传入的参数,
第二个传的是一个Interger对象,为什么在处理的方法中没有改变原来的参数,
第三个传的是一个int数值,为什么在处理的方法中也没有能改变原来的参数,
请问这是什么原因?

解决方案 »

  1.   

    首先java里参数传递都是传值
    第一个list,生成了list副本,两个list指向了同一段内存(包括size方法),对副本list的size修改,原来的list里面的size会改变。
    第二个integer,生成了integer副本,对副本修改,原来的integer不会改变
    第三个同样如此。
      

  2.   

    list 传入 的是引用 相当与操作同一个对象 当然改变 
    integer num = num + 1; 相当与产生一个新的对象 num这个引用 指向 num+1 而原先引用 指向没改变
    int传的是值
      

  3.   

    我很欣慰,没有人拿immuatable说事。
      

  4.   


    如果是String类型,拿immuatable说事有什么问题?
      

  5.   

    其实Integer也是不可变的。关键在“赋值”(==)。
      

  6.   

    String类和所有基本类型的容器类都是不可变的。
    这与引用类型的性质无关,是这几个类的内部实现决定的。
      

  7.   

    是啊,我的理解String,Integer是不可变对象,在方法体内对String/Integer类型的形参用'='赋值都会将被拷贝以后的引用指向一个新的对象,因此没有改变原来的引用.
      

  8.   

    Integer immutable,代表其逻辑值的是其内部的value域private final int value;因此当Integer对象参与运算并结果值与原先有改变的话,表示此结果的Integer已是另外一个对象假设有Integer a 与 Integer b 那么a + b 相当于 new Integer(a+b);Integer(a+b)自然与Integer a不是同一个对象从原理上说Integer逻辑值不可改变,不得不通过其它对象表示,内部应该是jvm对Integer参与的运算重载实现的吧,还没得到确认。
      

  9.   

    编译器做了一些autoboxing之类的工作,jvm没做什么特殊处理。
      

  10.   

    Keeping one word, java methods just call by value.