ArrayList与Array使用上的区别封装容器与原生容器

     ArrayList和Array是我们在实际编程中经常使用的容器,而且因为ArrayList相当于动态化的数组,所以它们之间有太多的相似,以至于我们在选择哪种来存储元素的时候,会有小小的迷惑。

      那么,这两者的区别和适用场合分别是什么呢?

一存放的内容

      数组,存放的一定是同种类型的元素,而ArrayList不一定,因为它可以存储Object,但数组也可以是一个Object数组,然后再提取出我们想要的类型,这种做法是不会丢失信息的(Object不能转化为基本类型,但是基本类型都有相对应的包装类),况且我们ArrayList本身内部封装的数组就是Object数组,所以,它的实质就是一个Object数组。

二ArrayList的优缺点

      使用ArraList的最大优点就是方便,因为我们可以使用它的方法来进行操作,但是,因为ArrayList是内部封装了Array的容器,所以,它的很多方法,像是IndexOf,Contains等等,其实都是以简单的算法在内部数组中进行遍历,所以效率会有影响(但是这部分的影响真的是不用太过于在意)。

      使用ArrayList的最大缺点就是当我们添加新的元素的时候,它是先检查内部数组的容量是否足够,如果不够,它会创建一个容量为原来数组两倍的新数组,然后将所有元素复制到新数组里,接着抛掉旧数组。这点真的很麻烦,因为每次都要这么搞,尤其是元素足够多的时候,这就真的是既影响内存又影响效率的问题,但通过单独测试它们的运行时间,发现其实差不多,最大的影响就是如果是有其他代码也需要使用到内存,那么Array依然不变,但是ArrayList就会变得慢多,相同情况下所花的时间是Array的四倍多(实际情况是远远不止)。

三ArrayList与Array的相互转化

        ArrayList因为内部是一个数组,所以它是可以转化为数组的。方法如下:

      

 List<Integer> list = new ArrayList<Integer>();
 Integer[] marray = list.toArray(new Integer[list.getSize()]);

这样就能将对应的list转化为数组。我们的toArray()还有不带参数的方法,但是这个方法的使用必须注意,因为我们的toArray()其实返回的是Object数组,所以,如果是像这样调用: 

Integer[] marray = (Integer)list.toArray();

是要出错的。前面带参数的toArray()之所以可以,是因为它的内部实现是根据传进来的数组的元素类型再返回相应类型的数组,但是我们还是可以将marray中的每个元素强制转化为对应的类型。所以,从使用的方便来看,我更倾向于使用带参数的toArray(),而且上面是惯用法,我们在参数里面传进一个长度为list长度的相对应数组,就能返回一个我们想要长度的数组。

四两者的适用场合

       使用list的惯用声明方式就是我们开头的那样:   

List<Integer> list = new ArrayList<Integer>();

虽然我们想要的确实是ArrayList而不是list,但是我们知道,父类是可以获得子类的引用并且使用子类的方法,所以这样我们就能同时使用List和ArrayList的方法而不用害怕出错了。说了这么多区别,我们到底该如何使用它们呢?首先,一个重要的约束就是,List的声明区域一般是在main方法里(当然静态list也可以,但是我们一般使用的时候都只是当做存储元素的临时容器),而Array是可以在外部进行声明的,这时它就是全局数组。所以,就着这点,它们的使用已经有区别,如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要以数组的形式保存数据,方便我们进行查找,那么,我们就选择ArrayList。而且还有一个地方是必须知道的,就是如果我们需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,那么,使用ArrayList就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择LinkedList。

原文地址:https://www.cnblogs.com/wenjiang/p/2732974.html