接着上一部分的Collection的知识
一.List接口
List接口是存储有序,可重复的数据
List接口的子类 | 概述 |
---|---|
ArrayList | 是作为List的主要实现类;效率高,但是不安全;底层使用的是Object[] 数组存储的 |
LinkedList | 是对于频繁的插入和删除操作,使用LinkedList的效率比ArrayList的效率高;底层使用的是双向链表存储的 |
Vector | 作为List接口的古老实现类,线程是安全的,效率低,底层使用的Object[]类 |
1.ArrayList
在JDK7.0的时候,ArrayList在底层创建了一个长度为10的Object[]数组。在添加的数组容量不够的时候,就会进行扩容,并且扩容为原来的1.5倍,同时复制到一个新的数组中去.但是在JDK8.0之后并没有在初始化的时候创建数组的长度而是在第一次调用的时候才创建的数组
JDK8.0比JDK7.0的时候优点是:延迟数组的创建,节省内存
2.LinkedList
LinkedList list= new Listedlist();内部声明为Node类型的first和last属性,默认值为null.其所有的操作都是按照双重链表的形式执行的
3.Vector
底层创建的是长度为10的数组,在扩容方面是扩容为原来的2倍.
4.ArrayList和LinkedList之间的效率比较
public static void main(String[] args) {
// 创建集合
ArrayList<String> arrayList = new ArrayList<String>();
LinkedList<String> linkedList = new LinkedList<String>();
// 调用方法存储数据
long startTime = System.currentTimeMillis();
insertData(linkedList, 100000);
Long endTime = System.currentTimeMillis();
System.out.println("linkedList插入数据所消耗的时间是:" + (endTime - startTime));
// 调用方法存储数据
long startTime1 = System.currentTimeMillis();
insertData(arrayList, 100000);
Long endTime1 = System.currentTimeMillis();
System.out.println("arrayList插入数据所消耗的时间是:" + (endTime1 - startTime1));
// 调用方法存储数据
long startTime2 = System.currentTimeMillis();
selectData(linkedList, 10000);
Long endTime2 = System.currentTimeMillis();
System.out.println("linkedList查询数据所消耗的时间是:" + (endTime2 - startTime2));
// 调用方法存储数据
long startTime3 = System.currentTimeMillis();
selectData(linkedList, 10000);
Long endTime3 = System.currentTimeMillis();
System.out.println("arrayList查询数据所消耗的时间是:" + (endTime3 - startTime3));
}
/**
* 向List集合中添加数据
*
* @param list 目标集合
* @param count 数据量
*/
public static void insertData(List<String> list, int count) {
for (int i = 0; i < count; i++) {
// 每一次都把数组插入到集合的中间
list.add(0, "张三" + i);
}
}
/**
* 从List集合中查询数据
* @param list 目标集合
* @param count 查询量
*/
public static void selectData(List<String> list, int count) {
for (int i = 0; i < count; i++) {
// 每一次查询中间的元素
list.get(list.size() / 2);
}
}
简答题
1.ArrayList,LinkedList,和Vector三者之间的异同
相同点:三个类都实现了List接口,存储数据的特点相同,有序 ,可重复的数据
不同点:将上面的表格
2.区分remove(int index)和remove(Object obj)两者之间的区别
remove(int index)移除列表中指定位置的元素
remove(Object obj)移除列表中第一次出现的指定元素,如果数据存在的话