关于形参数组的扩容问题

re_root02 2012-10-25 09:46:36
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()方法没有达到扩容效果,为什么?求大虾帮帮忙,谢谢!
...全文
47 点赞 收藏 4
写回复
4 条回复
print_er 2012年10月26日
抛开逻辑上的问题, 实现功能的代码应该这样写
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然后添加完对象之后再转回数组
回复 点赞
print_er 2012年10月25日
[Quote=引用 2 楼 的回复:]
数组在java里不是对象么?add()方法中,形参和实参数组同时指向同一引用数组对象,方法执行完,实参数组应该也扩容了? 为什么没扩容呢
[/Quote]
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出来的对象 不是原来形参传入的对象
回复 点赞
re_root02 2012年10月25日
数组在java里不是对象么?add()方法中,形参和实参数组同时指向同一引用数组对象,方法执行完,实参数组应该也扩容了? 为什么没扩容呢
回复 点赞
名字到底多长 2012年10月25日
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;
}
}
执行下吧,就知道问题在哪了。
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告