java的值传递和引用传递
昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递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
王ssss2
list2:
哈哈哈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); for(int i=0;i<list.size();i++){
bean bn = new bean();
bn.setAge(list.get(i).getAge());
bn.setName(list.get(i).getName());
list2.add(bn);
}
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());
} }
在在list赋值给list2的时候,我把bean对象新new了一个并且遍历list中的bean属性值给新new的这个bean对象,这样传递的是基本类型数据也就是copy到新new的bena内存块中,这样list2在怎么修改也不会影响到list中的值,因为他们包涵的bean对象是两不同指针的对象,这是修改后的输出结果:
list2:
哈哈哈ssss1
王ssss2
list:
王jjjjj1
王jjjjj2
我的个人理解哈,大家有什么其他更加简便的方法和理解留言哈,互相学习
java的值传递和引用传递的更多相关文章
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
- java 对象传递 是 值传递 还是 引用传递?
这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- Java面向对象-方法的值传递和引用传递
Java面向对象-方法的值传递和引用传递 0 发布时间:『 2016-08-21 14:21』 博客类别:Java核心基础 阅读(197) 评论(0) Java面向对象-方法的值传递和引用传递 方 ...
- Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结
这个话题一直是Java程序员的一个热议话题,争论不断,但是不论是你百度搜也好还是去看官方的文档中所标明的也好,得到的都只有一个结论:Java只有值传递. 在这里就不贴代码细致解释了,让我们来看看一些论 ...
- Java值传递和引用传递
Java总是在讨论是传递还是引用传递,Java没有像C语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量 ...
随机推荐
- 关于MySQL的CRUD操作
一.清除mysql表中数据 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也 ...
- highcharts曲线图
在做项目时,用highcharts做过曲线图,X轴是从后台获取的时间数据,Y轴是从后台获取的Int型数据 1.我的后台数据封装成json格式,数据较多,展示部分数据 2.曲线图的展示 3.前端jsp页 ...
- poj1087 A Plug for UNIX(网络流最大流)
http://poj.org/problem?id=1087 好久没遇见过这么坑的题了这个题真是挫的够可以的.题目大意:你作为某高管去住宿了,然后宾馆里有几种插座,分别有其对应型号,你携带了几种用电器 ...
- WCF通过SVCUtil.exe生成客户端代理类和配置文件(转)
WCF服务调用通过两种常用的方式: 1:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式. 2:一种是通过ChannelFactory直接创建服务代理对象进行服务调用. 本文只针对通 ...
- lamp php的ssl,ssh支持
Php支持ssl,ssh扩展: 准备:可以成功解析php 1.curl的安装 [root@localhost~]# cd /usr/local/src/ [root@localhost~]# wget ...
- sql模糊匹配中%、_的处理
防sql注入之模糊匹配中%._处理: StringBuilder sbSql = new StringBuilder(); sbSql.Append(@"SELECT * from tabl ...
- Oracle 表空间
表空间 编辑 本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 表空间是数据库的逻辑划分,一个表空间只能属于一个数据库.所有的数据库对象都存放在指定的表空间中.但主要存放的是表 ...
- Linux系统编程温故知新系列 --- 01
1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...
- Java程序员必须熟知的十项技术
1.语法 Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令 必须熟悉JDK带的一些常用命令及其常用选项,命 ...
- 说说C#的async和await 解决卡顿问题 转
C# 5.0中引入了async 和 await.这两个关键字可以让你更方便的写出异步代码. 看个例子: 可以看到,async和await关键字只是把上面的代码变得更简单易懂而已. public cla ...