Java String 到底是引用传递还是值传递?
对于非对象类型,java 参数传递都是值传递, 比如int.
java 会直接复制一份值到方法参数里面去使用。
而对于对象类型,其实也是值传递,java 参数传递值的是对象的引用,相当于对象在堆里面的内存地址。
我们分析下以下代码:
public class StringTransactTest {public static void main(String[] args) {String a = "a";String b = new String("b");changeString(a);changeString(b);System.out.println(a);System.out.println(b);//输出是a b 因为调用changeString 的时候,我们传递的是String 对象在
// 内存中的应用,调用changeString方法的时候,会复制一份引用的值到参数栈里面,
// 在changeString方法里面,changeString 的参数变量又被重新赋值为另一个string 对象,
// 方法结束,方法外面的变量a指向的内存地址一直都没有改变过,所以,打印出来还是a.int number = 23;changeNum(number);System.out.println(number);
// 打印是23,因为java 是值传递,基本数据类型会复制一份到方法栈中,在方法里面改变局部变量的值
// 不会影响外面的值。int number1 = 10;Integer integer11 = 10;Integer integer12 = 10;System.out.println(number1 == integer11);System.out.println(integer11 == integer12);//第一个是true number1 是基本数据类型,而integer11 是对象类型。他们两个比较的时候,
// 会发生自动拆箱,integer11 拆箱之后为基本数据类型,然后比较,肯定是相等的。
// 第二个是true 是因为Integer 直接这样写,相当于Integer.valueOf(),而这个类有缓存机制的。
// -127-128之间的数字会被缓存 当是同一个数字的时候,会直接返回同一个对象,所以,两个比较是trueint number2 = 1000;Integer integer21 = 1000;Integer integer22 = 1000;System.out.println(number2 == integer21);System.out.println(integer21 == integer22);//第一个是true 和上面一样
// 第二个是false 是因为Integer 是因为1000已经超过了默认的缓存机制,就会去new 对象,new 的两个对象肯定会相当。Integer integer31 = new Integer(1000);Integer integer32 = new Integer(1000);System.out.println(integer31 == integer32);//两个new 的对象,在堆分配了不同的内存,所以内存地址不同 false}private static void changeString(String a) {a = new String("changed");}private static void changeNum(int number){number = 20;}}
关于Interger 的缓存机制,我们直接上源码:
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
我们看到,如果值在low 和 high 之间,那么会从缓存数组里面,直接返回,否则就调用new 方法。
/*** Cache to support the object identity semantics of autoboxing for values between* -128 and 127 (inclusive) as required by JLS.** The cache is initialized on first usage. The size of the cache* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.* During VM initialization, java.lang.Integer.IntegerCache.high property* may be set and saved in the private system properties in the* sun.misc.VM class.*/private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}
这个就是Integer 的缓存。默认是-127 到 128之间,初始化的时候会直接for 循环创建这些对象,使用的时候,就可以直接用了。
参考:https://blog.csdn.net/losetowin/article/details/49968365
Java String 到底是引用传递还是值传递?相关推荐
- java还值_Java到底是引用传递还是值传递
前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test(){ String str = "hello"; change(str); S ...
- Java到底是引用传递还是值传递
前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test() {String str = "hello";change(str);Sys ...
- java包装和引用_回顾值传递和引用传递关于Java是值传递还是引用传递,网上有不一样的说法。1、基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递。2...
回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递. 2.Java中只有值传递. 关于这个问题应该 ...
- java引用传递_理解Java中的引用传递和值传递
关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...
- java int 传引用吗_Java值传递还是引用传递?
从我实习面试开始就有在面试中遇到过这个问题:Java是值传递还是引用传递? 当时的我只会背背面试题,但是网上的答案有些还是错的,导致我决心写这一篇文章. 虽然网上已经有很多文章珠玉在前,但是我还是想写 ...
- java是引用传递还是值传递_流言终结者:Java是引用传递还是值传递?
前言 今天聊一个很小的话题,引用传递和值传递.为什么拉出这个话题呢?因为自己太菜吧-在这上边栽了跟头.所以今天就聊一聊Java中是引用传递还是值传递. 正文 小A:MDove,我有一个疑问:Java的 ...
- java中是引用传递还是值传递....
刚才与Z师兄聊天,他提问: 你说java中是引用传递还是值传递啊? 当时俺搞混了这个"传递"的意思, 本来以为是对象的实例化比如: abc a=new abc(); 这个a 是引用 ...
- Java中两数交换引发的值传递问题及解决方案
Java中两数交换引发的值传递问题及解决方案 今天导师分享了一个有趣的代码,记录一下,让我们一起看看~ //交换两个整数 private static void swap(int i, int j) ...
- go slice获取唯一值_Go语言引用传递与值传递
先说结论 GO中只有值传递,没有引用传递 所谓值传递,就是实参通过拷贝将自身内容传递给形参.也就是将传递的内容拷贝一份,给函数.所以函数外和函数里对这个参数地址求值,应该是不一样的. 证明如下: fu ...
最新文章
- 组合搜索(combinatorial search)在算法求解中的应用
- apachebench ab.exe压力测试
- 微信小程序实现支付功能
- 当session会话结束时,重定向到登录页显示在iframe框内的问题
- 在硒中查找具有链接文本和部分链接文本的元素
- Luogu3702 SDOI2017 序列计数 矩阵DP
- 实现Modbus ASCII多主站应用
- class类初始化之后调用赋值问题记录
- 一双木棋chess[九省联考2018]
- 分布式事务解决方案,Seata的基本配置和使用
- 什么是git_什么是Git?
- ul在Firefox和IE下的不同表现
- 自动make工具--CMake
- 微信发布2018年各年龄段用户使用数据报告
- android gpio 驱动,[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】
- c语言用光标键控制图形,C语言图形设计参考资料.ppt
- 查征信 查婚姻状况 查公开的个人信息 学信网学历学位查询 中国执行信息公开网执行人查询 民办院校学位学历查询 国外学历学位查询方法 征信中心 中国裁判文书查询 查询全国的莆田系医院 企查查 天眼查
- android+动态光圈效果,三星S9评测:安卓机皇是你,960帧拍摄+可变光圈
- 中国消费者偏爱,复古游戏机与相机成为时代新宠,你会喜欢吗?
- ffmpeg 图片序列转视频
热门文章
- php内存缓存设计,求选择哪个缓存设计好一些?
- JAVA移慎_谨慎使用Java8的默认方法
- oracle 越南字符,ORACLE 12.2RAC之问题 ora.chad OFFLINE
- matlab神经网络的简单程序设计,BP神经网络设计的matlab简单实现
- 3d旋转相册代码源码_实现可旋转的Reflection Probe(原创)
- python经典题库和答案_吐血总结,Python经典面试题及答案
- python学习总目录
- java实现遍历树形菜单方法——service层
- CSS || 三栏布局,两边固定,中间自适应
- shell脚本参数$10问题