关于Vector类中的toArray()方法返回的对象数组问题.百思不得其解.望高人指点

耳朵最威风 2008-12-09 11:40:37
这里是测试代码

/**
* 填充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;
}

...全文
258 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxlzanjie 2011-02-10
  • 打赏
  • 举报
回复
11楼正解,他们引用的同一个Item对象
duhongltz 2008-12-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 danielzhan 的回复:]
其实并没有那么的复杂
..... //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)Ar…
[/Quote]
就是这么回事。
duhongltz 2008-12-12
  • 打赏
  • 举报
回复
期待高人解答关注
danielzhan 2008-12-12
  • 打赏
  • 举报
回复
其实并没有那么的复杂
..... //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
时光瞄 2008-12-10
  • 打赏
  • 举报
回复
好长...
耳朵最威风 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 sabird 的帖子:]
这里是测试代码

Java code
/**
* 填充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[]
*/
publi…
[/Quote]
为什么他们指向同一个地址啊?

if(arrr == arrr1) {
System.out.println("同一指针");
}
else {
System.out.println("不同指针");
}


如果指向同一个地址的话,这里应该输出"同一指针"才对啊..
lihan6415151528 2008-12-09
  • 打赏
  • 举报
回复
学习
Johnson_Hong 2008-12-09
  • 打赏
  • 举报
回复
arrr arrr1虽然不相等,但是他们的arrr[1]指向的是同一个地址
耳朵最威风 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Johnson_Hong 的回复:]
2个不同的对象,但是,为什么我修改其中的一个的时候,另一个里面的值,也同时的修改了呢?
----------------------------------------------------------------------
2个不同的对象,但是他们的属性可以引用同一个对象啊。
[/Quote]
如果他们的属性引用同一个对象的话,那么你有没有发现这两个数组中不是所有的对象都相等的呢?
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;
}

耳朵最威风 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yanhan0615 的回复:]
代码好长...
是这样的,主要是在于这里:
Java code
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,此时再做…
[/Quote]
哥们...好好看看提问中的程序,我可能写的不是特别清楚.所以一定要好好看清楚...呵呵...
Johnson_Hong 2008-12-09
  • 打赏
  • 举报
回复
2个不同的对象,但是,为什么我修改其中的一个的时候,另一个里面的值,也同时的修改了呢?
----------------------------------------------------------------------
2个不同的对象,但是他们的属性可以引用同一个对象啊。
yanhan0615 2008-12-09
  • 打赏
  • 举报
回复
补充:至于为什么一个值变了另一个也变是因为arrr[1]和arrr1[1]是指向同一个指针的,不信你用这两个比较在打印
Johnson_Hong 2008-12-09
  • 打赏
  • 举报
回复
arrr[1]==arrr1[1],你修改了arrr[1]里item的value,arrr1[1]的值肯定会变啊
yanhan0615 2008-12-09
  • 打赏
  • 举报
回复
代码好长...
是这样的,主要是在于这里:

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中的数据拷贝依然不变啊

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧