java list引用传递_java的值传递和引用传递

昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释:

值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

通俗的来说值传递其实就是一传递一些具体数据,也就是基本类型的数据(1,2,"哈哈"....),引用传递是你传递的你自己分装的对象,或者是数据集合,list,array,set。。。

我遇到的整好事对于list数据处理的问题,一言不合就上代码(测试代码):

1.下面的代码是我从我自己写的一个demo,详细的表述了值传递和引用传递:

1 @Test2 public voidck(){3 bean b = new bean("王","1");4 bean b2 = new bean("王","2");5 List list = new ArrayList();6 List list2 = new ArrayList();7 list.add(b);8 list.add(b2);9

10 list2.addAll(list);11 list2.get(0).setName("哈哈哈");12

13 for(bean bean : list2) {14 System.out.println(bean.getName()+"ssss"+bean.getAge());15 }16 for(bean bean1 : list) {17 System.out.println(bean1.getName()+"jjjjj"+bean1.getAge());18 }19

20 }

bean类

1 public classbean {2

3 privateString name ;4 privateString age;5

6

7

8

9

10

11 publicbean() {12 super();13 }14 publicbean(String name, String age) {15 super();16 this.name =name;17 this.age =age;18 }19 publicString getName() {20 returnname;21 }22 public voidsetName(String name) {23 this.name =name;24 }25 publicString getAge() {26 returnage;27 }28 public voidsetAge(String age) {29 this.age =age;30 }

31 }

按我们正常思路来说,list应该输出俩个

list:

王ssss1

王ssss2

list2:

哈哈哈ssss1

王ssss2

但是:看我的运行结果

1 哈哈哈ssss12 王ssss23 哈哈哈jjjjj14 王jjjjj2

可以看到虽然只是修改了list2中的一个元素,但是list中的元素数据也被修改了,有同学可能就会说了list.addAll的问题,其实不是,重点就是bean这个,list2.addAll(list)

这个方法其实是给list2赋值的bean的内存指针而不是把值拷贝到了list2的内存块中,也就是我们说的这里发生了引用传递而不是值传递,所以修改了list2中元素的值,也就修改

了bean对象元素的值,list输出元素的值当然会改变,后来我是这样解决的:

1 @Test2 public voidck(){3 bean b = new bean("王","1");4 bean b2 = new bean("王","2");5 List list = new ArrayList();6 List list2 = new ArrayList();7 list.add(b);8 list.add(b2);9

10 for(int i=0;i

18 for(bean bean : list2) {19 System.out.println(bean.getName()+"ssss"+bean.getAge());20 }21 for(bean bean1 : list) {22 System.out.println(bean1.getName()+"jjjjj"+bean1.getAge());23 }24

25 }26

在在list赋值给list2的时候,我把bean对象新new了一个并且遍历list中的bean属性值给新new的这个bean对象,这样传递的是基本类型数据也就是copy到新new的bena内存块中,这样list2在怎么修改也不会影响到list中的值,因为他们包涵的bean对象是两不同指针的对象,这是修改后的输出结果:

1 list2:2 哈哈哈ssss13 王ssss24 list:5 王jjjjj16 王jjjjj2

我的个人理解哈,大家有什么其他更加简便的方法和理解留言哈,互相学习

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值