参照文章:
https://www.cnblogs.com/hpyg/p/8005599.html
https://www.cnblogs.com/jiangxin007/p/9076696.html
最近在刷 leetcode 的一个回溯问题时需要同时使用 int 和 List 来作为函数参数进行递归操作,碰见了一个问题就是 list 需要进行回溯操作,而 int 却不需要,对此很困惑。查询了资料才发现 int 值作为参数不会改变原值,而 list 是引用类型,每次进行修改都影响到了内存中的原值。具体为以下规则。
leetcode原题:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/
1.基本类型(int、short、float、double、long、boolean、byte、char)作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。
2、引用类型(包括数组,对象以及接口)作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数,函数体中改变参数会改变原值。
3、注意:String 以及8个基本数据类型的包装类Integer、Short、Float、Double、Long、Boolean、Byte、Character虽然是引用类型,但它们在作为参数传递时,也和基本数据类型一样,类似于值传递原值不改变。(其实是新创建了对象,具体查看参考文章第二篇)
大学时候在写C语言的时候,可以通过操作指针将常量的地址传入函数,而java中无法显式的去定义指针操作,就应该符合上述规则。在使用参数时,对于引用类型,修改其值就会使得内存中的值修改,而基本类型以及列举的几种特殊情况,修改值不会影响到内存中的原值。