对于这两个的概念一直模模糊糊的,面试也经常被问到,写下这篇博客就是加深记忆也方便以后查看
首先先说之前我理解的值传递和引用传递,值传递就是基本数据类型,存在栈中。引用传递就是引用数据类型,存在堆中。
其实基本数据类型在程序中也分成员变量和局部变量,在引用传递中也包含String,而且面试题也总是不放过String。
首先确认一点:引用传递的本质就是传值,只是传递的是地址值
1.在基本数据类型中,成员变量是放在堆中,局部变量放在栈中。
2.在String中,其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份,因为String值在创建后就不可更改,所以每次的修改都是在创建新的String