List实现类
1.Arraylist:数组结构实现,查询快,增删慢,运行效率快,线程不安全
2.Vector:数组结构实现,查询快,增删慢,运行效率慢,线程安全
3.LinkedList:链表结构实现,增删快,查询慢
LinkedList
双向链表
LinkedList linkedList = new LinkedList<>();
Student s1 = new Student("A",20);
Student s1 = new Student("B",21);
Student s1 = new Student("C",22);
//增
linkedList.add(s1);
linkedList.add(s2);
linkedList.add(s3);
sout(linkedList.size());//→ 3
sout(linkedList.toString());//→ [Student[name=A,age=20],[name=B,age=21],[name=C,age=22]]
//删
//linkedList.remove(s1);
//sout(linkedList.size());//→ 2
//linkedList.clear();
//遍历
for(int i=0;i<linkedList.size();i++)
sout(linkedList.get(i));
//→ Student [name="A",20] \n Student [name="B",21] \n Student [name="C",22]
for(Object object:linkedList){
Student s = (Student)object;
sout(s.toString());
}
//→ Student [name="A",20] \n Student [name="B",21] \n Student [name="C",22]
Iterator it = linkedList.iterator();
while(it.hasNext()){
Student s = (Student)it.next();
sout(s.toString());
}
//→ Student [name="A",20] \n Student [name="B",21] \n Student [name="C",22]
ListIterator lit = linkedList.listIterator();
while(lst.hasNext()){
Student s = (Student)lit.next();
sout(s.toString());
}
//→ Student [name="A",20] \n Student [name="B",21] \n Student [name="C",22]
//判断
sout(linkedList.contains(s1));//→ true
sout(linkedList.isEmpty());//→ false
//获取
sout(linkedList.indexOf(s2));//→ 1
LinkedList 源码分析
transient int size = 0;//集合大小,初始为空
transient Node<E> first;//头节点
transient Node<E> last;//尾节点
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);//②新建节点 newNode,头指向尾结点l,尾指向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:双向链表,无需开辟连续空间,查询慢,增删快