List
- 特点:有序、有下标、元素可以重复
- 继承可父接口提供的共性方法,同时定义了一些独有的与下标相关的操作方法
- List实现类:ArrayList、LinkedList、Vector(用得少)
ArrayList
-
List中的元素是有序的,且允许重复
-
JDK8的ArrayList,实际初始长度是0
-
首次添加元素时,需要实际分配数组空间,执行数组扩容操作;真正向数组中插入数据,用的时候再创建,或再加载,有效的降低无用内存的占用
-
使用动态数组原理,查询快,增删慢
-
JDK 1.2发布,执行效率快,线程不安全
-
ArrayList相比数组的区别:容量的可扩展性,数据类型只要是Object类型就行,存储的必须是对象,不能存储基础数据类型
使用方法
package com.qianfeng.xqc.day0305;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 测试ArraysList 有序(添加到集合里面的顺序) ≠ 排序(对集合里面的元素进行排序)
* 增list.add("xqc");
* list.remove(1);// 根据指定的下标去移除
* list.clear();// 清空集合里面的元素
* list = null;// 将当前集合的引用置空
* list.set(0, "tony");//根据指定下标,修改该元素
* iterator.hasNext() ; //判断迭代器是否还有下一个元素;
* iterator.next();//返回指针指的当前的元素;并且把指针往下移动一个单位;
*/
public class DemoArraysList {
public static void main(String[] args) {
// List<Object> ls = new ArrayList<Object>();//用泛型指定ls只能存放Object类型
List list = new ArrayList();// 创建了一个空数组,长度是0
// 增 List没有指定数据类型可以存放所有对象
list.add("xqc");
list.add(new Per());
list.add("rose");
list.add(5);
list.add("qf");
// 删 只会删除第一个匹配到的元素
list.remove(1);// 根据指定的下标去移除
// list.removeAll(list);
// list.clear();// 清空集合里面的元素
// list = null;// 将当前集合的引用置空
// 改
list.set(0, "tony");//根据指定下标,修改该元素
// 查:for,foreach,迭代器
/*
//for
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//foreach
for (Object o : list) {
System.out.println(o);
}
*/
// Iterator迭代器
for (Iterator it = list.iterator(); it.hasNext();) {// 判断是否还有下一个元素
System.out.println(it.next());// 返回指针指的当前的元素
}
// test(list);
// test1(list);
}
public static void test(List list) {
//增强循环
for(Object obj : list) {
//使用增强循环的时候,不能移除我们的元素;
//移除后,结束循环,否则报错
if("rose".equals(obj)) { //如果在集合里面找到了rose,就把rose给干掉
list.remove(obj);
break;//移除了以后,就要停止循环
}
System.out.println(obj);
}
}
public static void test1(List list) {
// for(int i = 0;i < list.size();i++) {//每次循环size都会随之改变,size每次都会减1
// list.remove(i);
// }
//
// for(int i = 1;i < list.size();i+=2) {//等同于上方循环,隔着打印
// System.out.println(list.get(i));
// }
//
for(int i = 0;i < list.size();) {//全部删除
list.remove(i);
}
for (Iterator it = list.iterator(); it.hasNext();) {
System.out.println(it.next());
}
}
}
class Per {
}
LinkedList
-
与ArrayList用法一样
-
使用双向链表原理,查询慢、增删快
使用方法
package com.qianfeng.xqc.day0305;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 测试LinkedList
* LinkedList的使用,和ArrayList一模一样
* 唯一的区别是底层实现不一样
*/
public class DemoLinkedList {
public static void main(String[] args) {
List list = new ArrayList();
// 增
list.add("xqc");
list.add("rose");
list.add(5);
list.add("qf");
// 删
list.remove(1);
// 改
list.set(0, "tony");//根据指定下标,修改该元素
// 查:for,foreach,迭代器
// Iterator迭代器
for (Iterator it = list.iterator(); it.hasNext();) {// 判断是否还有下一个元素
System.out.println(it.next());// 返回指针指的当前的元素
}
}
}
Vector(不常用)
-
数组结构存储,查询快,增删慢
-
JDK 1.0发布,执行效率慢,线程安全
ArrayList与LinkedList性能比较
-
如果是顺序插入,ArrayList比较快
-
LinkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Entry的引用地址
-
ArrayList做插入、删除的时候,快在寻址,慢在数组元素的批量copy
-
如果插入删除的元素,是在前半段的时候,LinkedList速度大大快于ArrayList.
因为ArrayList会copy大量的元素,越往后,对于LinkedList来说速度是一样的,但是对于ArrayList来说,需要copy的元素越来越少
-
ArrayList底层数组扩容是一个既消耗时间又消耗空间的操作
-
使用各自遍历效率最高的方式,ArrayList的遍历效率会比LinkedList的遍历效率高一些