在java开发中,频繁的会用到参数传递的时候,有时候发现值发生了变化,有时候发现值却没有改变,究其原因原来java中参数传递虽然是值传递,
但值传递也分两种的:
1、按值传递(by value)
适用范围:8种基本数据类型、String对象
特点:在内存中复制一份数据,把复制后的数据传递到方法内部
作用:在方法内改变参数的值,外部的数据不会跟着发生改变
2、按引用地址传递(by address)
适应范围:数组、Object对象(除String以外)
特点:将对象的引用地址传递到方法的内部
作用:在方法内部修改对象的内容后,外部的数据也会跟着发生变化
示例代码:
package test;
/***
* 测试JAVA中参数传递的变化:
* JAVA的参数传递总是传"值",
* 但是传值方式也分为两种方式,它们是靠传递参数的类型区分的。
* 这两种类型分别为:JAVA的基础类型和Object(对象)类型;
* 基础类型包括boolean,byte,short,char,int,long,float,double,而Object就是对象
* @author harver
*
*/
public class ParameterPass {
public static void main(String[] args) {
int[] a = {1, 2};
test(a[0], a[1]);
System.out.println("a[0]:" + a[0] + ",a[1]:" + a[1]);//a[0]:1,a[1]:2
test2(a);
System.out.println("a[0]:" + a[0] + ",a[1]:" + a[1]);//a[0]:2,a[1]:1
int[] b = new int[1];
b[0] = 3;
test3(b);
System.out.println("b[0]:" + b[0]);//b[0]:2
int[] c = new int[1];
c[0] = 3;
test4(c);
System.out.println("c[0]:" + c[0]);//c[0]:3
test5(c);
System.out.println("c[0]:" + c[0]);//c[0]:4
}
private static void test(int i, int j) {
int temp = i;
i = j;
j = temp;
}
private static void test2(int[] a) {
int temp = a[0];
a[0] = a[1];
a[1] = temp;
}
private static void test3(int[] b) {
b[0]--;
}
//hashCode不一致,代表所引用堆中的地址值发生了变化.
private static void test4(int[] c) {
//System.out.println(c.hashCode());
c = new int[1];
//System.out.println(c.hashCode());
c[0] = 4;
}
//hashCode一致,代表所引用堆中的地址值是同一地址.
private static void test5(int[] c) {
//System.out.println(c.hashCode());
c[0] = 4;
//System.out.println(c.hashCode());
}
}
对于是不是同一个对象,可以在方法内部比较下传递进来的对象的hashcode值与修改数据之后的hashcode值是否相等,
如果相等,说明是引用的同一个对象。不相等,则方法内部修改的数据内容就不会影响到了外部的数据