一. Array 与 ArrayList 的区别,以及应用场景的不同之处
ArrayList 可以理解为能够自动扩容的 array ,也就是两者的第一个区别:
1. 存储空间大小的区别
- Array 的空间大小是固定的,空间不够时也不能再次申请,所以需要使用之前确定合适的空间大小。
- ArrayList 的空间是可以动态增长的,当空间不够时,ArrayList 的底层会生成一个新的数组,长度为原数组的 1.5 倍 + 1 ,也就是源码中 newLength = oldarrayLength + (oldarrayLengt >> 1) + 1 。
2. 存储内容的比较:
- Array 数组可以包含基本类型和对象类型,而且存放是的时候一定是同种类型的元素(除非类型是 Object ),
- 如 String [] list ={“a”,“b”}
那么此数组只能存储 String 类型的,而 ArrayList 存放的是对象类型,所以可以存储 Object,可以有所区别。 - ArrayList 数组 只能存放对象类型,比如
ArrayList list = new ArratList<>();
3.使用方法方面的比较
- ArrayList 是Array 的增强版,但是是有所取舍的增强,基本上 Array 的方法 ArrayList 也能用,继而增加了 addAll(),removeAll(),返回迭代器 iteratorAll()等,Array 是没有的。
4.效率方面的
- Array > Arraylist ,原因自然在于 ArrayList 的动态扩容造成的效率损耗。
- 二者在内存中都是连续存储的,所以通过索引查找元素的速度都非常快,赋值元素也比较简单。
- 但是,数组在插入/删除数据是很麻烦的,因为插入数据后,数组的其他元素要进行相对位置的移动,时间复杂度就是O(n),而LinkedList 是O(1)。
5.使用场景
- 如果想保存一些在整个程序 运行期间都会存在而且不变的数据,我们就可以适应 Array
,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据及逆行增加等操作(因为插入删除元素,ArrayList 的效率并不高 O(n),此处考虑选用LinkedList),只是方便查找的话,我们可以用 ArrayList。
6.Array 与 ArrayList 的相互转化
Array —> ArrayList
String [] list = {"a","b"};
List alist = Arrays.asList(list);
ArrayList --> Array
List list=new ArrayList();
list.add("a");
list.add("b");
list.add("c");
int len=list.size();
String[] array = (String[])list.toArray(new String[len]);
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
注 :Array 的对象类型是 Obect 时,类型可不同
Object [] list = new Object[5];
list[0] = new Animal();
arr[1] = 2;
arr[2] = "ok?"
增加 List 相关知识点
- List 是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,继承自 Collection 。
- List 是一个接口,ArrayList 是一个类,ListArray 继承并实现了 List, List 是不能被构造,但可以为 List 创建一个引用,而 ListArray 可以被构造,举例如下:
List list = new List(); //错误的用法
List list; //只是构建引用,list = null,正确用法
List list = new ArrayList();
/**构建了一个ArrayList 对象后上溯到了List。
此时它是一个List 对象了,
有些ArrayList 有的但是 List 没有的方法,它就不能使用了。
而 ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
**/
二 .ArrayList 与 LinkedList 的区别,以及应用场景的不同
-
ArrayList 和 LinkedList 都是实现了 List
的接口,用于存储一系列的对象引用,都可以对元素的增删改查进行操作。 -
对于 ArrayList
,它在集合的末尾删除和添加元素的所用时间是一样的,但是在列表中间添加或删除元素所用时间就会大大增加,但是根据索引查找元素的时候速度很快。 -
对于 LinkedList 则相反,它在插入删除集合中任何位置的元素的所花费的时间是一样的,但是它根据索引查询一个元素的时候却比较慢。
ArrayList 与 LinkedList 二者的区别
- 构成结构的不同
ArrayList 基于动态数据的数据结构,而 LinkedList 是基于链表结构。 - 对于随机访问 get 和 set 方法,ArrayList 是优于 LinkedList,因为LinkedList 要移动指针。
- 对于新增/删除数据add /remove,优先选择 LinkedList,因为 ArrayList 操作后要移动数据。
性能上的缺点
-
对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。
-
在ArrayList集合中添加或者删除一个元素时,当前的列表所所有的元素都会被移动。而LinkedList集合中添加或者删除一个元素的开销是固定的。
-
LinkedList集合不支持 高效的随机随机访问(RandomAccess),因为可能产生二次项的行为。
-
ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间