List
–ArrayList 线性表中的顺序表在 内存中分配连续的空间 查 效率高 增 删效率低
–LinkedList 线性表中的双向链表 内存中分配离散的空间 查 效率低 增 删效率高
一 ArrayList
class ArrayList<E> extends AbstractList<E> implements List<E>
·size 和 capacity 的区别:
size 指的是ArrayList数组元素的个数,是成员变量,在增删的时候记得维护
capacity 指的是ArrayList开辟的内存空间
·常用方法
boolean isEmpty()
int size()
boolean add(Object obj)
boolean addAll(Collection c)
boolean remove(Object obj)
set()
get()
indexOf()
代码示例,一些简单的方法就不写了
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class TestArrayList {
public static void main(String[] args) {
//这里使用了泛型,有两个好处:1 解决了繁琐的强制转换 2 锁定了数据类型,更加安全
List<Integer> list = new ArrayList<>(); //声明一个ArrayList并申请空间,且用到了Java对象的多态,接口的引用指向实现类对象.
System.out.println(list.size());
list.add(43); // 这里其实进行了自动装箱,因为add()的参数是Object,这里自动转成Interger
list.add(35);
list.add(43);
System.out.println(list.get(0));
System.out.println(list.get(0).getClass()); // getClass() 是Object的方法,返回数据类型
ArrayList<Integer> list2 = new ArrayList<>();
list2.add(9);
list2.add(22);
list.addAll(2,list2); //可以在某个位置添加一个Collection
System.out.println(list);
//遍历
//1 for 循环
for (int i = 0; i < list.size(); i++) {
int elem = list.get(i);
System.out.println(i + " " + elem);
}
//2 foreach 循环 JDK1.5特性
for (int elem: list) {
System.out.println(elem);
}
//3 Iterator迭代器
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
int elem = it.next();
System.out.println(elem);
}
}
}
二 LinkedList
java.lang.Object
↳ java.util.AbstractCollection<E>
↳ java.util.AbstractList<E>
↳ java.util.AbstractSequentialList<E>
↳ java.util.LinkedList<E>
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable {}
可以看到LinkedList不仅实现了List接口,有List的方法,还实现了Deque接口(双端队列),有双端队列的方法,(Deque implements queue).实际上Java中的队列就是靠LinkedList实现的.如:
Queue q = new LinkedList();
LinkedList的本质是双向链表。
(01) LinkedList继承于AbstractSequentialList,并且实现了Dequeue接口。
(02) LinkedList包含两个重要的成员:header 和 size。
header是双向链表的表头,它是双向链表节点所对应的类Entry的实例。Entry中包含成员变量: previous, next, element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。
size是双向链表中节点的个数。
常用方法比ArrayList多了一些
使用时要注意如果是作为队列就不能使用下面部分方法
boolean add(E object)
void add(int location, E object)
boolean addAll(Collection<? extends E> collection)
boolean addAll(int location, Collection<? extends E> collection)
void addFirst(E object)
void addLast(E object)
boolean contains(Object object)
Iterator<E> descendingIterator()
E element()
E get(int location)
E getFirst()
E getLast()
int indexOf(Object object)
boolean offer(E o)
E peek()
E poll()
E pop()
void push(E e)
E remove()
E remove(int location)
boolean remove(Object object)
int size()
<T> T[] toArray(T[] contents)