一个随意list引发的惨案(java到底是值传递还是引用 传递?)
前两天写了一个递归,因为太年轻,把一个递归方法需要用到的list定义该递归方法外了,结果开始断点测试的时候有点小问题 ,然后上线之后因为数据量太多导致了一个java.util.ConcurrentModificationException异常,然后就debug。然后一顿操作因为单元测试的时候马虎出了点问题,以为新写的方法有问题,然后又一顿操作才发现在单元测试出了问题。最后成功解决问题,提交之后领导给我说:“你这个递归看起来还有问题哦?”,然后我心里一凉。然后领导再问:“你这个是值传递还是引用传递啊”我心中大惊,虽然我是一个新手,但是我看了几篇文章说java只有值传递的呀,但是大佬这么问我,我也不敢回答,害怕的一匹。然后偷偷查阅资料冷静分析java值传递还是引用传递。
先总结:
java中方法参数传递方式是按值传递。
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。
因为在平常使用中,我们在传递一个对象之后并不会在new一次该对象,如下图第三行所示,

所以方法内的对象和方法外的对象所指的内存是同一个地址(对象和list存放在堆中,方法内的数据存放在栈帧中,栈帧属于某个方法所有,方法结束后就销毁,而堆属于类),如果我们在方法内修改了该对象,在外面获取该对象也会改变,所以会被误认为是应用传递。如果在操作之前new一下,方法的对象指向和传递过来的对象指向就不是同一个地址了,所以我们在方法里面 操作了对象,方法外的对象也不会改变。如下图

那么问题来了,string类型是一个引用类型,然而我们操作他的时候和基础类是一样的,并没有引用传递的那种幻觉是为什么呢?
因为string不是基础类,它比较特殊,它是不可变类,每次我们操作它的时候就相当于new了一次。
其实会在java值传递和引用传递上不清楚的原因是基础不牢固。基础不牢固有两重一次,第一重是学的不牢固。第二重是基础原理(不懂jvm)不牢固。所以路漫漫其修远兮,吾将上下而求索呀。
如果想要详情了解值传递,就看下面这个文章,写的挺不错的。
https://blog.csdn.net/bntx2jsqfehy7/article/details/83508006
一个随意list引发的惨案(java到底是值传递还是引用 传递?)的更多相关文章
- Java 到底是值传递还是引用传递?
关于这个问题,引发过很多广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的.还有的人可能知道Java中的参数传递是值传递,但是说不出来为什么. 在开始深入讲解之前,有必要 ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- Java 到底是值传递还是引用传递
作者:Intopass链接:https://www.zhihu.com/question/31203609/answer/50992895来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- Java调用函数传递参数到底是值传递还是引用传递
今天翻看微信上有关Java技术的公众号时,看到了一篇关于Java中值传递的问题,文章讨论了在Java中调用函数进行传参的时候到底是值传递还是引用传递这个面试时会问到的问题.之前也接触过类似的问题,但只 ...
- Java中到底是值传递还是引用传递?
Java中到底是值传递还是引用传递? 我们先回顾一下基本概念 实参和形参 参数在编程语言中是执行程序需要的数据,这个数据一般保存在变量中.在Java中定义一个方法时,可以定义一些参数, 举个例子: p ...
- 188W+程序员关注过的问题:Java到底是值传递还是引用传递?
在逛 Stack Overflow 的时候,发现了一些访问量像阿尔卑斯山一样高的问题,比如说这个:Java 到底是值传递还是引用传递?访问量足足有 188万+,这不得了啊!说明有很多很多的程序员被这个 ...
- [转帖]Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递?
Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递? http://www.itpub.net/2019/12/03/4567/ 在逛 Stack Overfl ...
- JAVA方法中参数到底是值传递还是引用传递
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...
- 面试官:兄弟,说说Java到底是值传递还是引用传递
二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催.我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经 ...
随机推荐
- 【管理学】PDCA
- selenium webdriver (python)第三版.pdf
转载自:http://download.csdn.net/detail/waiwaijsj/7214035 是原作者根据自己的经验整理的,很实用.
- codeforces Round #389(Div.2)C Santa Claus and Robot(思维题)
题目链接:http://codeforces.com/contest/752/problem/C 题意:给出一系列机器人的行动方向(机器人会走任意一条最短路径),问最少标记几个点能让机器人按这个 路径 ...
- POJ 3083 Children of the Candy Corn (DFS + BFS)
POJ-3083 题意: 给一个h*w的地图. '#'表示墙: '.'表示空地: 'S'表示起点: 'E'表示终点: 1)在地图中仅有一个'S'和一个'E',他们为位于地图的边墙,不在墙角: 2)地图 ...
- 【Offer】[68] 【树中两个结点的最低公共祖先】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个树结点,求它们的最低公共祖先. [牛客网刷题地址]无 思路分析 该题首先要确定是否为二叉树,还要确定是否为二叉搜索树,是否有父指 ...
- 15 个有用的 MySQL/MariaDB 性能调整和优化技巧
MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...
- java对象与json字符串的互相转换
java对象与json字符串的互相转换 1.采用 net.sf.json.JSONObject maven依赖包: <dependency> <groupId>net.sf.j ...
- spring boot日志logback输出
logback是spring boot的官方推荐日志. 1.在代码中使用logback日志: import org.slf4j.Logger; import org.slf4j.LoggerFacto ...
- CF979C Kuro and Walking Route(简单的dfs/树形dp)
题意:给出一个$n$个点,$n-1$条边的无向连通图,给出两个点$x,y$,经过$x$后的路径上就不能经过$y$,问可以走的路径$(u,v)$有多少条,($(u,v)$和$(v,u)$考虑为两条不同的 ...
- 增删改查——Statement接口
1.增加数据表中的元组 package pers.datebase.zsgc; import java.sql.Connection; import java.sql.DriverManager; i ...