从一道没人能答对的面试题聊聊Java的值传递
这是一道我们公司的面试题,从招第二个Java以来就一直存在了。但是面试了这么长的时间还没有一个人可以全部答对,让我们一度以为是这题出的不对。首先请看面试题。
以下运算的输出分别是多少:
```java
public static void main(String[] args) {
int i = 0;
change(i);
System.out.println(i);
}
private static void change(int i2) {
i2 = 1;
}
```
```java
public static void main(String[] args) {
Integer i = 0;
change(i);
System.out.println(i);
}
private static void change(Integer i2) {
i2 = 1;
}
```
```java
public static void main(String[] args) {
StringBuilder s = new StringBuilder("0");
change(s);
System.out.println(s);
}
private static void change(StringBuilder s2) {
s2 = new StringBuilder("1");
}
```
看完题之后你是不是已经有了自己的答案,记下你的答案,不介意的话评论区留言看看有没有人能全对。
------
首先需要明确几个概念。
实参与形参:
如下图所示,形式参数是在定义函数名和函数体的时候使用的参数,目的是接收调用该函数时传入的参数。
实际参数是在调用有参函数时传入的参数。

堆和栈:
- 栈
存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
- 堆
存放所有new出来的对象。
- 常量池
存放字符串常量和基本类型常量。
值传递和引用传递:
1. 需要明确一点Java中只有值传递。
2. 值传递和引用传递,不是传递的内容是值是值传递,传递的是引用就是引用传递;也不是传递的参数是普通类型就是值传递,是对象就是引用传递。
拿第三个题目进行分析。先看看在程序运行时堆栈中都发生了些什么。

如上图所示。
- 第一步在栈中存放引用`s`,并且在堆中开辟空间存放对象并且值为`0`;
- 第二步调用方法会在栈中再声明一个引用`s2`,并且指向第一步中对象地址;
- 第三步中修改s2的值,实际上会在堆中再开辟一个新空间,并且`s2`指向新的地址。
从上图中可以看出,`s`的指向并没有发生变化,因此第三题得出的答案为0。
继续看第二题,第二题与第三题的区别在于,`Integer`的值会放在常量池中,因此将上图中的堆改为常量池其他的完全一样,所以第二题的答案也是0。
对于第一题,由于涉及到的形参和实参都是基本类型,因此`i`和`i2`完全是在栈中操作,此时打印出的结果依旧是0。
转评赞就是最大的鼓励
从一道没人能答对的面试题聊聊Java的值传递的更多相关文章
- 面试题:Java中值传递和引用传递的问题
随便写写留着自己看. 首先,Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递! 当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本.指向同 ...
- 没人能阻止你,除了你自己——Keep up the good work!
今天在网上搜索一些关于计算机专业的论坛或者博客,于是发现了博客园,就进来了.我想把我的一些关于计算机科学与技术领域的学习经历纪录在此,以便于能和大家一起分享,一起努力,一起进步.说实话我是临床医学专业 ...
- 一道笔试题来理顺Java中的值传递和引用传递
题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...
- 试题 C: 数列求值 蓝桥杯
试题 C: 数列求值本题总分: 10 分[问题描述]给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和.求第 20190324 项的最后 4 位数字.[ ...
- 面试题-关于Java线程池一篇文章就够了
在Java面试中,线程池相关知识,虽不能说是必问提,但出现的频次也是非常高的.同时又鉴于公众号"程序新视界"的读者后台留言让写一篇关于Java线程池的文章,于是就有本篇内容,本篇将 ...
- 面试题_ Java EE 相关的面试题
为了做 Java EE 的朋友,这里列出了一些 web 开发的特定问题,你们可以用来准备 JEE 部分的面试: 10 大 Spring 框架面试题及答案(参见)10 个非常好的 XML 面试问题(Ja ...
- 【笔试题】Java 易错题精选
笔试题 Java 易错题精选 1.写出下列程序的运行结果( )String 不变性Java 值传递 public class Test { public static void main(String ...
- 【笔试题】Java笔试题知识点
Java高概率笔试题知识点 Java语法基础部分 [解析]java命令程序执行字节码文件是,不能跟文件的后缀名! 1.包的名字都应该是由小写单词组成,它们全都是小写字母,即便中间的单词亦是如此 2.类 ...
- 是的 你没看错!!!用JAVA为MCU开发物联网程序?
是的 你没看错!!!用JAVA为MCU开发物联网程序? 一直以来,物联网设备这种嵌入式硬件,对于Java软件开发者来说,就是Black Magic Box,什么中断.寄存器,什么 ...
随机推荐
- SpringMVC面试题:什么是Servlet?
一.什么是servlet? servlet是一个Java编写的程序,此程序是基于http协议的,在服务器端(如Tomcat)运行的,是按照servlet规范编写的一个Java类.客户端发送请求至服务器 ...
- TensorFlow笔记-组件
张量 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通.其实张量更代表的就是一种 ...
- [PTA] 数据结构与算法题目集 6-3 求链式表的表长
Length( List L ){ int res=0; while(L!=NULL){ res++; L=L->Next; } return res; }
- 每日一问:Android 消息机制,我有必要再讲一次!
坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 我 17 年的 面试系列,曾写过一篇名为:Android 面试(五):探 ...
- SPC 数据分析工具
趁着公司在做QMS软件,自己实现一个简易版,类似minitab的工具. 环境:.net framework 4.0 目前提供功能: 数据存储,载入 计量型控制图:单值移动极差图.均值极差图.均值标准差 ...
- mysql查看视图用户
select `DEFINER` from information_schema.VIEWS;
- 在工作中常用到的SQL
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 最近在公司做了几张报表,还记得刚开始要做报表的时候都 ...
- 搭建PowerDNS+LAP+NFS+MySQL主从半节点同步实现LAMP架构
实验环境:(共7台机器) PowerDNS: 192.168.99.110 两台LAP: 192.168.99.120 和 192.168.99.130 NFS服务器:192.168.99.14 ...
- Angular JS 中的内置方法之$watch
在$apply方法中存在脏检查,首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法. $watch(watchFn,watc ...
- 【SVN】SVN Working copy is too old
前天在使用 SVN 客户端 CornerStone 的时候遇到了这个问题,代码不能提交了…… 遇到这个问题的时候怎么办? 解决办法: 找到报错对应的文件夹,里面有个 .svn 的文件夹,去掉再 com ...