这里是测试代码   /**
    * 填充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;
    }

解决方案 »

  1.   

    arrr arrr1虽然不相等,但是他们的arrr[1]指向的是同一个地址
      

  2.   

    为什么他们指向同一个地址啊?if(arrr == arrr1) {
        System.out.println("同一指针");
    }
    else {
        System.out.println("不同指针");
    }
    如果指向同一个地址的话,这里应该输出"同一指针"才对啊..
      

  3.   

    代码好长...
    是这样的,主要是在于这里:
    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中的数据拷贝依然不变啊
      

  4.   

    arrr[1]==arrr1[1],你修改了arrr[1]里item的value,arrr1[1]的值肯定会变啊
      

  5.   

    补充:至于为什么一个值变了另一个也变是因为arrr[1]和arrr1[1]是指向同一个指针的,不信你用这两个比较在打印
      

  6.   

    如果他们的属性引用同一个对象的话,那么你有没有发现这两个数组中不是所有的对象都相等的呢?
    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;
        }
      

  7.   

    其实并没有那么的复杂
    .....                               //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
      

  8.   

    11楼正解,他们引用的同一个Item对象