![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
新学java ,问一个关于数组的问题
public static void main(String[] args){
int[] a={2,3,4,7,8,9};
int[] b;
b=a;
for(int i=0;i<a.length;i++){
b[i]++;
System.out.println("a["+i+"]="+a[i]);
//System.out.println("b["+i+"]="+b[i]);
}
}
}
为什么结果输出是:a[0]=3;
b[0]=3;
a[1]=4;
b[1]=4;
a[2]=5;
b[2]=5;
a[3]=8;
b[3]=8;
a[4]=9;
b[4]=9;
a[5]=10;
b[5]=10;
b数组输出结果我到知道没有错。但是为什么a数组与b数组是一样结果?for循环语句中b[i]++会影响到a数组值吗? 展开
= 是赋值的意思,但如果被赋的值是一个对象,那么,被赋值的变量和赋值的变量拥有同样的引用(在C++中为指针)。在JAVA中除了基本类型赋值(byte, short, int, long, float, double, boolean)外,全部都是对象。所以,b被改动后,a也一样,因为 a == b。如果想b != a(即改动a或者b时,互不影响,拥有不同的引用),不能简单的使用 “=”。
你有很多种方法实现:
1、使用 java.util.Arrays 数组工具类中的 copyOf 方法:
int[] b = Arrays.copyOf(a, a.length);
2、自己使用 for 循环实现(实际上就是上面的方法):
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
但又出现一个问题,如果数组中的元素是对象呢?有办法,如果是 Byte, Short, Integer, Long, Boolean, Float, Double, String,只要使用相应的 valueOf() 方法重新构造一个对象就可以了,如果是其他对象,那么需要对象实现 Cloneable 接口,并且重写 clone 方法,实现深度克隆,才能完成实现非引用拷贝 。
b=a;这一句,并不是说吧a数组中的每个元素都复制了一份,然后赋值给b,而是将a数组的指针赋值给b,也就是a和b指向的是同一个数组,是同一个数组的两个名字。
举例来说,
Double d1 = new Double();
Double d2 = d1;
这个时候,d1和d2是同一个对象的两个引用(或者两个名字)。
如果想是两个不同的对象,应该这么写:
Double d1 = new Double();
Double d2 = new Double();
更深入的java的内存的只是,建议你去看下:http://www.cnblogs.com/xwdreamer/archive/2012/04/01/2428857.html
如果你学的是C或者C++,这些问题是一开始就要懂得。java语言简化了这些,但是也逃不过这个坎。
多谢
2014-08-03
java中变量如a,b是存放在栈里的,而实际数据是存放在堆里的。