Java传参数的一个问题
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数值,为什么在处理的方法中也没有能改变原来的参数,
请问这是什么原因?
------解决方案--------------------首先java里参数传递都是传值
第一个list,生成了list副本,两个list指向了同一段内存(包括size方法),对副本list的size修改,原来的list里面的size会改变。
第二个integer,生成了integer副本,对副本修改,原来的integer不会改变
第三个同样如此。
------解决方案--------------------list 传入 的是引用 相当与操作同一个对象 当然改变
integer num = num + 1; 相当与产生一个新的对象 num这个引用 指向 num+1 而原先引用 指向没改变
int传的是值
------解决方案--------------------参数传值与传引用的区别,百度狗狗一下很多
基本类型变量都是传值(传递一个副本)
对象类型变量都是传递引用(指向对象的指针--可以理解为)所以操作的还是同一对象
------解决方案--------------------String类和所有基本类型的容器类都是不可变的。
这与引用类型的性质无关,是这几个类的内部实现决定的。
------解决方案--------------------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参与的运算重载实现的吧,还没得到确认。