import java.util.Arrays;
public class AnimalsDemo{
  public static void main(String[] args){
     Animal[] animals = new Animal[2];
     animals[0] = new Animal("dog");
     animals[1] = new Animal("cat");     add(animals,new Animal("bird"));
     System.out.println(Arrays.toString(animals));
  }
  public static void add(Animal[] animals,Animal animal){
     if(animals!=null){
        animals=Arrays.copyOf(animals,animals.length+1);
        animals[animals.length-1] = animal;
     }else{
        System.out.println("数组为空");
     }
  }
}
class Animal{
    String name;
    public Animal(String name){
       this.name = name;
    }
    public String toString(){
       return this.name;
    }
}
最后输出的结果是[dog,cat],调用add()方法没有达到扩容效果,为什么?求大虾帮帮忙,谢谢!

解决方案 »

  1.   

    import java.util.Arrays;
    public class AnimalsDemo{
      public static void main(String[] args){
      Animal[] animals = new Animal[2];
      animals[0] = new Animal("dog");
      animals[1] = new Animal("cat");  add(animals,new Animal("bird"));
      System.out.println(Arrays.toString(animals)+":"+animals.length);
      }
      public static void add(Animal[] animals,Animal animal){
      if(animals!=null){
      animals=Arrays.copyOf(animals,animals.length+1);
      animals[animals.length-1] = animal;
      System.out.println(animals.length+"----------");
      }else{
      System.out.println("数组为空");
      }
      }
    }
    class Animal{
      String name;
      public Animal(String name){
      this.name = name;
      }
      public String toString(){
      return this.name;
      }
    }
    执行下吧,就知道问题在哪了。
      

  2.   

    数组在java里不是对象么?add()方法中,形参和实参数组同时指向同一引用数组对象,方法执行完,实参数组应该也扩容了? 为什么没扩容呢
      

  3.   

    Arrays.copyOf底层用System.arrayCopy实现的,具体代码public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
            T[] copy = ((Object)newType == (Object)Object[].class)
                ? (T[]) new Object[newLength]
                : (T[]) Array.newInstance(newType.getComponentType(), newLength);
            System.arraycopy(original, 0, copy, 0,
                             Math.min(original.length, newLength));
            return copy;
    }这个代码说明了2个问题
    1 Arrays.copyOf(animals,animals.length+1) 并不能实现扩容
    2 方法返回的是新new出来的对象 不是原来形参传入的对象
      

  4.   

    抛开逻辑上的问题, 实现功能的代码应该这样写
    add方法需要有Animal[]类型的返回值,用来获得新生成的数组Animal[] copy = new Animal[animals.length+1];
    System.arraycopy(animals, 0, copy, 0, animals.length);
    copy[copy.length-1] = animal;
    return copy;还有很多奇葩的方法,比如说可以把数组转换成List然后添加完对象之后再转回数组