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

首先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);
}
}

结果异常
原因:这个新集合是由数组转换过来的,那么该集合就表示原来的数组,所以对集合的操作就是对数组的操作。那么添加元素会导致原数组扩容,那么就不能表示原来的数组了。所以不允许向该集合添加新元素了。
另一种解释:这不是最好的,因为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就比较快
在这里插入图片描述
总结 使用ArrayList 存储和读取的总时间较快!
如果想要数据安全性可以使用List!!!

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

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

发布了27 篇原创文章 · 获赞 7 · 访问量 2695

猜你喜欢

转载自blog.csdn.net/weixin_43571920/article/details/102952662