对于非对象类型,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 到底是引用传递还是值传递?相关推荐

  1. java还值_Java到底是引用传递还是值传递

    前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test(){ String str = "hello"; change(str); S ...

  2. Java到底是引用传递还是值传递

    前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test() {String str = "hello";change(str);Sys ...

  3. java包装和引用_回顾值传递和引用传递关于Java是值传递还是引用传递,网上有不一样的说法。1、基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递。2...

    回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递. 2.Java中只有值传递. 关于这个问题应该 ...

  4. java引用传递_理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...

  5. java int 传引用吗_Java值传递还是引用传递?

    从我实习面试开始就有在面试中遇到过这个问题:Java是值传递还是引用传递? 当时的我只会背背面试题,但是网上的答案有些还是错的,导致我决心写这一篇文章. 虽然网上已经有很多文章珠玉在前,但是我还是想写 ...

  6. java是引用传递还是值传递_流言终结者:Java是引用传递还是值传递?

    前言 今天聊一个很小的话题,引用传递和值传递.为什么拉出这个话题呢?因为自己太菜吧-在这上边栽了跟头.所以今天就聊一聊Java中是引用传递还是值传递. 正文 小A:MDove,我有一个疑问:Java的 ...

  7. java中是引用传递还是值传递....

    刚才与Z师兄聊天,他提问: 你说java中是引用传递还是值传递啊? 当时俺搞混了这个"传递"的意思, 本来以为是对象的实例化比如: abc a=new abc(); 这个a 是引用 ...

  8. Java中两数交换引发的值传递问题及解决方案

    Java中两数交换引发的值传递问题及解决方案 今天导师分享了一个有趣的代码,记录一下,让我们一起看看~ //交换两个整数 private static void swap(int i, int j) ...

  9. go slice获取唯一值_Go语言引用传递与值传递

    先说结论 GO中只有值传递,没有引用传递 所谓值传递,就是实参通过拷贝将自身内容传递给形参.也就是将传递的内容拷贝一份,给函数.所以函数外和函数里对这个参数地址求值,应该是不一样的. 证明如下: fu ...

最新文章

  1. 组合搜索(combinatorial search)在算法求解中的应用
  2. apachebench ab.exe压力测试
  3. 微信小程序实现支付功能
  4. 当session会话结束时,重定向到登录页显示在iframe框内的问题
  5. 在硒中查找具有链接文本和部分链接文本的元素
  6. Luogu3702 SDOI2017 序列计数 矩阵DP
  7. 实现Modbus ASCII多主站应用
  8. class类初始化之后调用赋值问题记录
  9. 一双木棋chess[九省联考2018]
  10. 分布式事务解决方案,Seata的基本配置和使用
  11. 什么是git_什么是Git?
  12. ul在Firefox和IE下的不同表现
  13. 自动make工具--CMake
  14. 微信发布2018年各年龄段用户使用数据报告
  15. android gpio 驱动,[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】
  16. c语言用光标键控制图形,C语言图形设计参考资料.ppt
  17. 查征信 查婚姻状况 查公开的个人信息 学信网学历学位查询 中国执行信息公开网执行人查询 民办院校学位学历查询 国外学历学位查询方法 征信中心 中国裁判文书查询 查询全国的莆田系医院 企查查 天眼查
  18. android+动态光圈效果,三星S9评测:安卓机皇是你,960帧拍摄+可变光圈
  19. 中国消费者偏爱,复古游戏机与相机成为时代新宠,你会喜欢吗?
  20. ffmpeg 图片序列转视频

热门文章

  1. php内存缓存设计,求选择哪个缓存设计好一些?
  2. JAVA移慎_谨慎使用Java8的默认方法
  3. oracle 越南字符,ORACLE 12.2RAC之问题 ora.chad OFFLINE
  4. matlab神经网络的简单程序设计,BP神经网络设计的matlab简单实现
  5. 3d旋转相册代码源码_实现可旋转的Reflection Probe(原创)
  6. python经典题库和答案_吐血总结,Python经典面试题及答案
  7. python学习总目录
  8. java实现遍历树形菜单方法——service层
  9. CSS || 三栏布局,两边固定,中间自适应
  10. shell脚本参数$10问题