LinkedList
一、LinkedList基本使用
public static void main(String[] args) {
/**
* 使用LinkedList常用方法
*/
//创建集合对象 - 泛型规定该集合只能存储String类型的数据
LinkedList<String> list = new LinkedList<>();
//添加元素
list.add("麻生希");
list.add("椎名空");
list.add("三上悠亚");
list.add("深田咏美");
list.add("波多野结衣");
list.add("明日花绮罗");
list.add("铃原爱蜜莉");
list.add("小西满里惠");
list.add("杨晨");
list.add("陈希");
//往指定的下标上插入元素
list.add(2, "北条麻衣");
//添加集合
// LinkedList<String> newList1 = new LinkedList<>();
// Collections.addAll(newList1, "aaa","bbb","ccc","ddd");//使用集合工具类批量添加元素
// list.addAll(newList1);//把newList1集合中所有的元素添加到list集合中
//在指定下标上添加集合
LinkedList<String> newList1 = new LinkedList<>();
Collections.addAll(newList1, "aaa","bbb","ccc","ddd");//使用集合工具类批量添加元素
list.addAll(2, newList1);//在指定下标把newList1集合中所有的元素添加到list集合中
//删除
list.remove(4);//根据下标删除元素
list.remove("ddd");//根据元素删除元素
list.removeIf(new Predicate<String>() {//根据条件删除元素
@Override
public boolean test(String t) {
if(t.length() >= 5){
return true;
}
return false;
}
});
//删除交集
LinkedList<String> newList2 = new LinkedList<>();
Collections.addAll(newList2, "aaa","xxx","yyy");
list.removeAll(newList2);
//设置指定下标上的元素
list.set(1, "爱田奈奈");
//保留交集
LinkedList<String> newList3 = new LinkedList<>();
Collections.addAll(newList3, "bbb","北条麻衣","yyy","杨晨","陈希");
list.retainAll(newList3);
//获取指定下标上的元素
System.out.println("获取指定下标上的元素:" + list.get(1));
//获取长度
System.out.println("获取集合中元素的个数:" + list.size());
//清空集合中所有的元素
//list.clear();
System.out.println("查询集合中是否包含某个元素:" + list.contains("aaa"));
System.out.println("查询该元素在集合中的下标:" + list.indexOf("aaa"));
System.out.println("判断该集合中是否没有元素:" + list.isEmpty());//没有元素-true 有元素-false
//获取指定下标区间的元素
List<String> newList4 = list.subList(1, 3);
System.out.println(Arrays.toString(newList4.toArray()));//集合->数组->字符串
System.out.println("---------------------------");
//遍历集合
//1.for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("---------------------------");
//2.foreach
for (String e : list) {
System.out.println(e);
}
System.out.println("---------------------------");
//3.Iterator
Iterator<String> it = list.iterator();
while(it.hasNext()){//判断是否有可迭代的数据
String next = it.next();//返回下一个数据
System.out.println(next);
}
System.out.println("---------------------------");
//4.ListIterator
ListIterator<String> listIterator = list.listIterator();
while(listIterator.hasNext()){//判断是否有可迭代的数据
String next = listIterator.next();//返回下一个数据
System.out.println(next);
}
}
二、LinkedList源码分析
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>{
transient Node<E> first;
transient Node<E> last;
public LinkedList() {
}
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
//节点类
private static class Node<E> {
E item; --------- 元素
Node<E> next; --- 下一个节点地址
Node<E> prev; --- 上一个节点地址
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
}
ArrayList 与 LinkedList 效率的区别:
添加,不扩容的情况:ArrayList快
添加,扩容的情况:LinkedList快
插入:LinkedList快
查询:ArrayListk快
结论:在工作中使用更多的是ArrayList,因为查询功能使用的是最多的