为什么要使用ArrayList里面的 toArray()方法。看下面代码就知道了:
List<String> list=new ArrayList<String>();
list.add("a");
System.out.println(list.size()); //输出1
List<String> l1=list;
l1.remove(0);
System.out.println(list.size()); //输出0
System.out.println(l1.size()); //输出0
可以看出来如果直接通过赋值语句传递List类型变量的话,更改一个List会对别的List产生一样的后果。这通常不是我们希望看到的。即使将上面的代码改为下面,也依然得到相同的结果!
List<String> l1=new ArrayList<String>();
l1=list
至于原因,稍微延伸一下。假设有一个Student类,我们都知道如果
Student student1=new Student(3,"zhangsan");
Student student2=s1;
那么,s1和s2将同时指向同一个内存地址。说得更详细点是student1,student2变量中存储的东西是一样的,这个东西就是一个Student对象的地址。此时,如果我们让对象s2调用类Student里set()方法改变s2里面的一些属性,同时也会更改对象s1里面的属性。
ArrayList也是一个类。和Student没啥大的区别,唯一的区别就是ArrayList是已经写好包装好的类,本质上两者还是一样的。这样的话,就不难解释为什么出现上面的情况。
这就是我们需要用到 toArray()方法的原因。对于这个方法,API是这样解释的:
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。
由于此列表不维护对返回数组的任何引用,,因而它将是“安全的”。(换句话说,此方法必须分配一个新的数组)。因此,调用者可以自由地修改返回的数组。
但是在用到toArray()方法的时候需要注意:它的返回值是一个Object型的数组。如果还想继续得到String类型的数组,需要这样做:
String []s=list.toArray(new String[0]);
刚才从ArrayList延伸到了普通的类,我们都知道如果想把上面提到的student2=student1,改变一下,使student2既得到student1的属性,又可以自由改变这些属性而不影响到student1。恩,那就是clone()方法。要想使用clone( )方法,必须实现Cloneable接口。在这里就不多说了。
还是回到ArrayList上面来,我们利用toArray()的原因是向得到一个与原来数组相同的数组,但是又想新开辟内存地址,想与原来的数组划清界线。这不就是类Object里面clone()方法的功能吗?本来还担心,使用clone()方法得实现Cloneable接口,那不就是得重写ArrayList吗?好麻烦。。。不过后来竟然在API中看到ArrayList中自带了clone()方法。。欣喜啊~这样的话,我们其实就可以抛弃toArray()方法了。两者实现的是相同的功能,但是clone()方法返回的是ArrayList,而toArray()得到的只能是普通数组。。ArrayList当然比普通数组强大得多了。
总结一下:这次从 toArray()方法出发,到最后把它给抛弃了。。(或许还有别的好处,望赐教。。)
欢迎转载,相互学习。请注明出处:http://blog.csdn.net/xtj332