由 toArray( )方法想到的

为什么要使用ArrayList里面的 toArray()方法。看下面代码就知道了:

		List list=new ArrayList();
		list.add("a");
		System.out.println(list.size());    //输出1
		List l1=list;
		l1.remove(0);
		System.out.println(list.size());  //输出0
		System.out.println(l1.size());    //输出0

可以看出来如果直接通过赋值语句传递List类型变量的话,更改一个List会对别的List产生一样的后果。这通常不是我们希望看到的。即使将上面的代码改为下面,也依然得到相同的结果!

List l1=new ArrayList();  
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                                

你可能感兴趣的:(java历程)