欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于java数组与ArrayList、List的浅谈

程序员文章站 2022-06-10 22:19:56
...

首先List是一个接口,ArrayList是继承了List并实现了List的一个类。
所以LIst不能被构造,但可以作为一个引用。
List a = new List();//错误的用法.
List list; //正确 list=null;

但我们可以用List作为一个引用:
List a = new ArrayList();
这句创建了一个ArrayList的对象后把上溯到了List。它就相当于一个List对象了,里面的一些未实现的方法是ArrayList里面的。有些ArrayList有但是List没有的属性和方法,它就不能再用了。
我们要保留ArrayList的所有属性,可以这样定义:
ArrayList a = new ArrayList();

开发中用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()的原因

问题就在于List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变这一行就行了:
List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。
假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。
地区用 List arr = new ArrayList();定义;行业用 ArrayListarr = new ArrayList();定义;则说明,行业里用到了ArrayList的特殊的方法.
另外的例子就是,在类的方法中,如下声明:
private void doMyAction(List list){}
这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.

对于数组跟ArrayList

数组:长度固定,不灵活,增加删除数据麻烦。但速度比较快
ArrayList:命名空间System.Collections下的一部分。大小是动态扩充与收缩的。在声明ArrayList对象时不需要指定它的长度。ArrayList继承了List接口,可以很方便的进行数据的添加、插入和移除。

如何将数组转换为ArrayList

Element[] array = {new Element(1),new Element(2),new Element(3)};

1.第一种方式,
调用Arrays的静态方法.asList();

ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array));

这种方法可以进行添加操作。同时修改数组的一个值,ArrayList的值不会改变,相反也满足

能进行添加操作的原因估计是这个ArrayList不依赖之前的数组了

转换为集合,这种方式相当于表示原来的数组,如果对其进行加入操作则会出现问题,

import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
	List<String> list = Arrays.asList(strArr);
	System.out.println(list);
	 list.add(1,"杨紫");
	 System.out.println(list);
}
}

关于java数组与ArrayList、List的浅谈
原因:这个新集合是由数组转换过来的,那么该集合就表示原来的数组,所以对集合的操作就是对数组的操作。那么添加元素会导致原数组扩容,那么就不能表示原来的数组了。所以不允许向该集合添加新元素了。
另一种解释:这不是最好的,因为asList()返回的列表的大小是固定的。事实上,返回的列表不是java.util.ArrayList,而是定义在java.util.Arrays中一个私有静态类。我们知道ArrayList的实现本质上是一个数组,而asList()返回的列表是由原始数组支持的固定大小的列表。这种情况下,如果添加或删除列表中的元素,程序会抛出异常UnsupportedOperationException

这样就可以添加元素


import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
		//List<String> list = Arrays.asList(strArr);
		List<String> list2 = new ArrayList<>(Arrays.asList(strArr));
		//System.out.println(list);
		System.out.println(list2);
		 //list.add(1,"杨紫");
		 list2.add(1,"sss");
		 //System.out.println(list);
		 System.out.println(list2);
}
}

同时对该List的数据修改也会改变原数组的数据,但ArrayList不会

import java.util.Arrays;
import java.util.List;

public class Test1 {
	public static void main(String[] args) {
		String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};//原数组元素
		List<String> list = Arrays.asList(strArr);
		System.out.println(list); 
		list.set(3, "杨紫");//将集合中下标为3的元素替换为“杨紫”
		System.out.println(list);//修改后的集合打印结果:[刘雯, 胡歌, 杜鹃, 杨紫]
		//下面打印数组中的元素,检测数组元素是否改变
		for (String Arr : strArr) {
			System.out.println(Arr);
			/*
				打印结果:刘雯
                         胡歌
                         杜鹃
                         杨紫
			*/
	//结果说明:对这个由数组转化过来的集合进行操作会导致原数组的改变。	
		}
	}
}

要像List添加数据,可以用空集合调用addAll把方法将转化后的集合全部添加新集合就可以进行操作了。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	String [] strArr = {"刘雯","胡歌","杜鹃","邓伦"};
		/*list.add(1,"杨紫");这样直接调用add方法会出现运行异常。
		 *可以利用空集合调用addAll方法将转化后的集合全部添加新集合就可以进行操作了。
		 */
		 List<String> newList = new ArrayList<>(Arrays.asList(strArr));
		 /*
		  * tips:为什么右边这个尖括号中不写String呢?
		  * 原因:从JDK1.7开始,右侧的尖括号内部可以不写内容,但是<>还是要写的。
		  */
		 newList.add(1,"杨紫");
		 System.out.println(newList);
}
}

将集合转化为数组:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class testArrayToList {
   public static void main(String[] args) {
	List<String> a = new ArrayList<>();
		a.add("1");
		a.add("2");
		String s[] = a.toArray(new String[] {});
		System.out.println(Arrays.toString(s));
}
}

要多说几句的就是,java.util包里面有一个Arrays类,它包括了一组可以用于数组的static的工具方法,其中最基本的是四个方法:用来比较两个数组是否相等的equals();用来填充数组的fill();用来对数组进行排序的sort();以及用于在一个已经排序的数组中查找元素的binarySearch()。所有这些方法都对primitives和Object进行了重载。此外还有一个asList()方法,它接受一个数组,然后把它转成一个List容器。JAVA标准类库还提供了一个System.arraycopy()的静态方法,它能以较快的速度拷贝数组,对primitive和Object都进行了重载,但是注意当对Object数组进行拷贝时,进行的是浅拷贝(shallow copy)

时间效率问题

ArrayList数组结构的,插入和删除耗时长,get(index)耗时短。
LinkedList是链表结构的,插入和删除耗时短,get(index)耗时长

关于ArrayList与LinkedList的比较分析
a) ArrayList底层采用数组实现,LinkedList底层采用双向链表实现。
b) 当执行插入或者删除操作时,采用LinkedList比较好。
c) 当执行搜索操作时,采用ArrayList比较好。

LinkList的查询慢的可怕,ArrayList就比较快
关于java数组与ArrayList、List的浅谈
总结 使用ArrayList 存储和读取的总时间较快!
如果想要数据安全性可以使用List!!!

关于其他sort的效率有待实现。

参考资料:
Java中List和ArrayList之间的区别
ArrayList 和 List 的区别
为什么Java中数组的效率比集合高
java-集合处理数据的效率差异
Java 数组和集合list [array,arrayList,linkedList]的效率, 几种for循环[for,for each, lambda] 使用JProfiler进行效率测试
普通数组和集合效率谁更好又方便

相关标签: 实践