我们先说下值传递和引用传递java官方解释:值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。通俗的来说值传递其实就是一传递一些具体数据,也就是基本类型的数据(1,2,"哈哈"....),引用传递是你传递的你自己分装的对象,或者是数据集合,list,array,set。。。我遇到的整好事对于list数据处理的问题,一言不合就上代码(测试代码):1.下面的代码是我从我自己写的一个demo,详细的表述了值传递和引用传递:@Test public void ck(){ bean b = new bean("王","1"); bean b2 = new bean("王","2"); List<bean> list = new ArrayList<bean>(); List<bean> list2 = new ArrayList<bean>(); list.add(b); list.add(b2);
list2.addAll(list); list2.get(0).setName("哈哈哈");
for (bean bean : list2) { System.out.println(bean.getName()+"ssss"+bean.getAge()); } for (bean bean1 : list) { System.out.println(bean1.getName()+"jjjjj"+bean1.getAge()); }
}bean类public class bean { private String name ; private String age;
public bean() { super(); } public bean(String name, String age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }按我们正常思路来说,list应该输出俩个list:王ssss1 王ssss2list2:哈哈哈ssss1 王ssss2但是:看我的运行结果哈哈哈ssss1 王ssss2 哈哈哈jjjjj1 王jjjjj2 可以看到虽然只是修改了list2中的一个元素,但是list中的元素数据也被修改了,有同学可能就会说了list.addAll的问题,其实不是,重点就是bean这个,list2.addAll(list)这个方法其实是给list2赋值的bean的内存指针而不是把值拷贝到了list2的内存块中,也就是我们说的这里发生了引用传递而不是值传递,所以修改了list2中元素的值,也就修改了bean对象元素的值,list输出元素的值当然会改变,后来我是这样解决的:@Test public void ck(){ bean b = new bean("王","1"); bean b2 = new bean("王","2"); List<bean> list = new ArrayList<bean>(); List<bean> list2 = new ArrayList<bean>(); list.add(b); list.add(b2);