List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所以插入删除数据速度慢。
特征:有序列表,允许存放重复的元素,通过索引下标进行取值和删除;(是个接口)
1. List集合下面的实现类
有很多实现类,列举的是比较重要的,开发时用的比较多的
-
ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
-
LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
-
Vector:数组实现,重量级 (线程安全、使用少)
2. List集合下面的方法
package com.cjw.b_list;
import java.util.ArrayList;
import java.util.List;
public class Demo1 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("张三");
//有序的 可重复的
System.out.println(list);//[张三, 李四, 王五, 张三]
list.add(2, "狗蛋");
System.out.println(list);
List<String> list1 = new ArrayList<>();
list1.add("麻子");
list1.add("赵四");
list1.add("李武");
list.addAll(1, list1);
System.out.println(list);
System.out.println(list.remove(0));//在删除
System.out.println(list);//目的是删除以后的集合的数据展示一下
//[麻子, 赵四, 贝贝, 李四, 狗蛋, 王五, 张三]
System.out.println(list.set(2, "彩云"));//贝贝
System.out.println(list);//修改之后的集合
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
System.out.println(list.get(3));
//System.out.println(list.get(89));
System.out.println(list.indexOf("麻子"));//0
list.add(2, "张三");
System.out.println(list.lastIndexOf("张三"));//7
System.out.println(list);
List<String> strings = list.subList(3, 5);
System.out.println(strings);
}
}
3. 遍历List集合的三种方法
- for循环
- 增强for循环
- 迭代器
3.1for循环
package com.zjz.b_list;
import java.util.ArrayList;
import java.util.List;
public class Demo2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("张三");
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
//通过索引获取元素
System.out.println(list.get(i));
}
}
}
3.2增强for循环
package com.zjz.b_list;
import java.util.ArrayList;
import java.util.List;
public class Demo2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("张三");
System.out.println(list);
//for循环
// for (int i = 0; i < list.size(); i++) {
// //通过索引获取元素
// System.out.println(list.get(i));
// }
增强for循环
for (String s : list) {
System.out.println(s);
}
//迭代器
}
}
3.3迭代器
package com.zjz.b_list;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Demo3 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("张三");
System.out.println(list);
ListIterator<String> sli = list.listIterator();
while (sli.hasNext()) {
System.out.println(sli.next());
}
//此时光标已经在最下面了
while (sli.hasPrevious()) {
System.out.println(sli.previous());
}
}
}
4. ArrayList
ArrayList底层是数组,可以扩容的。
是构造一个初始容量为10的空列表,超过10以后会自动扩容,扩容1.5倍
ArrayList是按照添加的先后顺序排列,当然,他也提供了sort方法,如果需要对ArrayList进行排序,只需要调用这个方法,提供Comparator比较器即可
(ArrayList的方法和List下面的方法用处一致,开发时够用了)
特征:查询快,增删慢
5. LinkedList
LinkedList 类采用链表结构保存对象,这种结构的优点是便于向集合中插入或者删除元素。按照插入的先后顺序排序,不提供sort方法对内部元素排序。
(ArrayList的方法和List下面的方法用处一致,开发时够用了)
6.ArrayList、LinkedList和Vector的区别
ArrayList和Vector 底层是数组,但是Vector是线程安全的,所以效率低,开发中不用Vector
接下来介绍ArrayList和linkedList区别:
1.ArrayList底层是数组 LinkedList底层是双向链表
ArrayList 的特征:
查询快,底层是索引,有序的通过内存有序地址,直接找到 时间复杂度 O(1)增删慢: 增加数据和删除数据有可能扩容,每次扩1.5倍,扩容的话,浪费内存浪费时间O(n)
LinkedList的特征:
查询慢: 底层是二分法查找的算法 时间复杂度是log以2为底n的对数 增删快: 直接找前置结点 Node prev和后继结点 Node next 时间复杂度是O(1)