这里是测试代码 /**
* 填充Item数组
* @param arr Item[]
* @param top int
*/
public void putItemArr(Item[] arr,int top) {
if(arr == null) return;
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = new Item(r, top);
}
}
/**
* 输出arr数组
* @param arr Item[]
*/
public void printItemArr(Item[] arr) {
System.out.println("**********");
if (arr != null) {
for(int i=0 ; i < arr.length; i++){
if(arr[i] != null) {
System.out.println("Arr[" + i + "] = " + arr[i]);
}
else {
System.out.println("Arr[" + i + "] was Null!");
}
}
}
System.out.println("**********");
}
class Item implements Comparable {
public int value = 0; public void put(Random r, int top) {
value = r.nextInt(top);
}
/**
* @param v int
*/ Item(int v) {
this.value = v;
} Item(Random r, int top) {
put(r, top);
} public String toString() {
return Integer.toString(this.value);
} public int compareTo(Object o) {
if (!(o instanceof Item)) {
System.out.println("Wrong Type Input");
} else if (value < ((Item) o).value) {
return -1;
} else if (value > ((Item) o).value) {
return 1;
}
return 0;
}
}下面是运行代码Item[] arr = new Item[3];
Vector vt;
putItemArr(arr, 30);
System.out.println("arr");
printItemArr(arr);
vt = new Vector(6,2);
for(int i=0;i < arr.length ; i++){
vt.add(arr[i]);
}
Item[] arrr = new Item[0];
Item[] arrr1 = new Item[0];
arrr = (Item[]) vt.toArray(arrr);
vt.set(0,new Item(200));
arrr1 = (Item[]) vt.toArray(arrr1);
printItemArr(arrr);
System.out.println("arrr");
printItemArr(arrr);
System.out.println("arrr1");
printItemArr(arrr1);
if(arrr == arrr1) {
System.out.println("同一指针");
}
else {
System.out.println("不同指针");
}
arrr[1].value = 100;
System.out.println("arrr");
printItemArr(arrr);
System.out.println("arrr1");
printItemArr(arrr1);下面是运行结果:
arr
**********
Arr[0] = 24
Arr[1] = 14
Arr[2] = 25
**********
**********
Arr[0] = 24
Arr[1] = 14
Arr[2] = 25
**********
arrr
**********
Arr[0] = 24
Arr[1] = 14
Arr[2] = 25
**********
arrr1
**********
Arr[0] = 200
Arr[1] = 14
Arr[2] = 25
**********
不同指针
arrr
**********
Arr[0] = 24
Arr[1] = 100
Arr[2] = 25
**********
arrr1
**********
Arr[0] = 200
Arr[1] = 100
Arr[2] = 25
**********这个结果我想不明白了,明明arrr和arrr1是通过public synchronized <T> T[] toArray(T[] a)函数返回的2个不同的对象,但是,为什么我修改其中的一个的时候,另一个里面的值,也同时的修改了呢?
还有System.arrayCopy()的源代码我去哪里看?
下面是public synchronized <T> T[] toArray(T[] a)的源代码 public synchronized <T> T[] toArray(T[] a) {
if (a.length < elementCount)
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), elementCount); System.arraycopy(elementData, 0, a, 0, elementCount); if (a.length > elementCount)
a[elementCount] = null; return a;
}
* 填充Item数组
* @param arr Item[]
* @param top int
*/
public void putItemArr(Item[] arr,int top) {
if(arr == null) return;
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = new Item(r, top);
}
}
/**
* 输出arr数组
* @param arr Item[]
*/
public void printItemArr(Item[] arr) {
System.out.println("**********");
if (arr != null) {
for(int i=0 ; i < arr.length; i++){
if(arr[i] != null) {
System.out.println("Arr[" + i + "] = " + arr[i]);
}
else {
System.out.println("Arr[" + i + "] was Null!");
}
}
}
System.out.println("**********");
}
class Item implements Comparable {
public int value = 0; public void put(Random r, int top) {
value = r.nextInt(top);
}
/**
* @param v int
*/ Item(int v) {
this.value = v;
} Item(Random r, int top) {
put(r, top);
} public String toString() {
return Integer.toString(this.value);
} public int compareTo(Object o) {
if (!(o instanceof Item)) {
System.out.println("Wrong Type Input");
} else if (value < ((Item) o).value) {
return -1;
} else if (value > ((Item) o).value) {
return 1;
}
return 0;
}
}下面是运行代码Item[] arr = new Item[3];
Vector vt;
putItemArr(arr, 30);
System.out.println("arr");
printItemArr(arr);
vt = new Vector(6,2);
for(int i=0;i < arr.length ; i++){
vt.add(arr[i]);
}
Item[] arrr = new Item[0];
Item[] arrr1 = new Item[0];
arrr = (Item[]) vt.toArray(arrr);
vt.set(0,new Item(200));
arrr1 = (Item[]) vt.toArray(arrr1);
printItemArr(arrr);
System.out.println("arrr");
printItemArr(arrr);
System.out.println("arrr1");
printItemArr(arrr1);
if(arrr == arrr1) {
System.out.println("同一指针");
}
else {
System.out.println("不同指针");
}
arrr[1].value = 100;
System.out.println("arrr");
printItemArr(arrr);
System.out.println("arrr1");
printItemArr(arrr1);下面是运行结果:
arr
**********
Arr[0] = 24
Arr[1] = 14
Arr[2] = 25
**********
**********
Arr[0] = 24
Arr[1] = 14
Arr[2] = 25
**********
arrr
**********
Arr[0] = 24
Arr[1] = 14
Arr[2] = 25
**********
arrr1
**********
Arr[0] = 200
Arr[1] = 14
Arr[2] = 25
**********
不同指针
arrr
**********
Arr[0] = 24
Arr[1] = 100
Arr[2] = 25
**********
arrr1
**********
Arr[0] = 200
Arr[1] = 100
Arr[2] = 25
**********这个结果我想不明白了,明明arrr和arrr1是通过public synchronized <T> T[] toArray(T[] a)函数返回的2个不同的对象,但是,为什么我修改其中的一个的时候,另一个里面的值,也同时的修改了呢?
还有System.arrayCopy()的源代码我去哪里看?
下面是public synchronized <T> T[] toArray(T[] a)的源代码 public synchronized <T> T[] toArray(T[] a) {
if (a.length < elementCount)
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), elementCount); System.arraycopy(elementData, 0, a, 0, elementCount); if (a.length > elementCount)
a[elementCount] = null; return a;
}
System.out.println("同一指针");
}
else {
System.out.println("不同指针");
}
如果指向同一个地址的话,这里应该输出"同一指针"才对啊..
是这样的,主要是在于这里:
Item[] arrr = new Item[0];
Item[] arrr1 = new Item[0];
arrr = (Item[]) vt.toArray(arrr);
vt.set(0,new Item(200));
arrr1 = (Item[]) vt.toArray(arrr1);vt.toArray(arrr)中重新为arrr分配对象并进行了数据拷贝,arrr就是一个新的数据拷贝,相当于此时有两份,一份在arrr中,一份在vector中,然后在进行操作,vector中的0号元素变成了200,此时再做一个拷贝,就按照新的数据来了,arrr中的数据拷贝依然不变啊
arrr
**********
Arr[0] = 24 //不相等
Arr[1] = 100
Arr[2] = 25
**********
arrr1
**********
Arr[0] = 200 //不相等
Arr[1] = 100
Arr[2] = 25
**********
我觉得这个问题的答案应该在下面这个函数里或者是java虚拟机的优化的问题. public synchronized <T> T[] toArray(T[] a) {
if (a.length < elementCount)
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), elementCount); System.arraycopy(elementData, 0, a, 0, elementCount); if (a.length > elementCount)
a[elementCount] = null; return a;
}
..... //1)首先建立了3个Item A(24), B(14), C(25) 在Vector里面就有 A B C 的3个引用
Item[] arrr = new Item[0];
Item[] arrr1 = new Item[0];
arrr = (Item[]) vt.toArray(arrr); //2)Arrr现在有 A(24) B(14) C(25)
vt.set(0,new Item(200)); //3)第一个Item改变了 Vector 现在有 D(200), B(14), C(25)
arrr1 = (Item[]) vt.toArray(arrr1); //4)Arrr1也有 D(200), B(14), C(25)
printItemArr(arrr); // 见2)24,14,25 Arrr A B C
System.out.println("arrr");
printItemArr(arrr);
System.out.println("arrr1");
printItemArr(arrr1); // 见4)200, 14, 25 Arrr1 D B C
if(arrr == arrr1) {
System.out.println("同一指针");
}
else {
System.out.println("不同指针");
}
arrr[1].value = 100; // 5) Arrr[1] 也就是 B(14)变成了B(100),现在Arrr1 D(200), B(100), C(25)
System.out.println("arrr");
printItemArr(arrr); //24, 100, 25 Arrr A B(100) C
System.out.println("arrr1");
printItemArr(arrr1); // 见5) 200, 100, 25