关于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接口,可以很方便的进行数据的添加、插入和移除。
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进行效率测试
普通数组和集合效率谁更好又方便
推荐阅读
-
C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)
-
关于java数组与字符串相互转换的问题
-
关于java数组与ArrayList、List的浅谈
-
关于集合与数组的区别,Collection、List、Set接口的作用及相关的子类
-
java关于List数组和类数组中的Collections和Arrays的sort区别
-
C#中数组、ArrayList、List、Dictionary的用法与区别浅析(存取数据)
-
Java实现数组与list相互转换的实例分析
-
Java中关于二维数组简单的定义与使用详解
-
Java实现数组与list相互转换的实例分析
-
简单介绍C#中数组、ArrayList、List、Dictionary的用法与区别