List学习
元素可以重复(可变长)
有序(存入和取出顺序一样),通过下标查找

1.ArrayList——底层是数组,线程不安全(基于Object[] array)

-
构造函数有两种,一种是传入参数,可以指定容量。一种是不传入参数
-
Add(E e)在数组尾加(需要扩展数组)
-
Add(int index,E e)在对应位置添加
-
get(int index)返回角标对应的元素
-
indexOf(Object o) 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回-1。
-
set(int index,E e)把指定角标的元素进行替换
-
remove(int index)删除指定角标的元素,并返回这个元素
-
contains(Object object)是否存在这个元素
-
ArrayList是基于动态数组实现的,在插入元素时候,需要数组的拷贝复制。
-
ArrayList的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为原来的1.5倍
-
删除元素时不会减少容量,若希望减少容量则调用trimToSize()
-
它不是线程安全的。它能存放null值
2.Vector——底层是数组,线程安全(基于Object[] array)
于ArrayList的三点不同
-
一个线程安全,一个线程不安全
-
如果ArrayList想要实现线程安全,可以用Collections方法 List list = Collections.synchronizedList(new ArrayList(...));实现同步
-
ArrayList在数组不够用的时候扩展1.5倍,Vector扩展2倍
3.Linkedlist——底层是链表(双向链表),线程不安全

双向链表的特点:
-
插入数据很快。先是在双向链表中找到要插入节点的位置index,找到之后,再插入一个新节点。 双向链表查找index位置的节点时,有一个加速动作:若index < 双向链表长度的1/2,则从前向后查找; 否则,从后向前查找(双向链表相对单向链表优势)。
-
删除数据很快。先是在双向链表中找到要插入节点的位置index,找到之后,进行如下操作:node.previous.next = node.next;node.next.previous = node.previous;node = null 。查找节点过程和插入一样。
-
获取数据很慢,需要从Head节点进行查找。
-
遍历数据很慢,每次获取数据都需要从头开始。
增
public boolean add(E e),链表末尾添加元素,返回是否成功;
public void add(int index, E element),向指定位置插入元素;
public boolean addAll(Collection<? extends E> c),将一个集合的所有元素添加到链表后面,返回是否成功;
public boolean addAll(int index, Collection<? extends E> c),将一个集合的所有元素添加到链表的指定位置后面,返回是否成功;
public void addFirst(E e),添加到第一个元素;
public void addLast(E e),添加到最后一个元素;
public boolean offer(E e),向链表末尾添加元素,返回是否成功;
public boolean offerFirst(E e),头部插入元素,返回是否成功;
public boolean offerLast(E e),尾部插入元素,返回是否成功;
删
public void clear(),清空链表;
public E removeFirst(),删除并返回第一个元素;
public E removeLast(),删除并返回最后一个元素;
public boolean remove(Object o),删除某一元素,返回是否成功;
public E remove(int index),删除指定位置的元素;
public E poll(),删除并返回第一个元素;
public E remove(),删除并返回第一个元素;
查
public boolean contains(Object o),判断是否含有某一元素;
public E get(int index),返回指定位置的元素;
public E getFirst(), 返回第一个元素;
public E getLast(),返回最后一个元素;
public int indexOf(Object o),查找指定元素从前往后第一次出现的索引;
public int lastIndexOf(Object o),查找指定元素最后一次出现的索引;
public E peek(),返回第一个元素,但不移除;
public E pool(),返回第一个元素,并移除;
public E element(),返回第一个元素;
public E peekFirst(),返回头部元素;
public E peekLast(),返回尾部元素;
改
public E set(int index, E element),设置指定位置的元素;
其他
public Object clone(),克隆该列表;
public Iterator<E> descendingIterator(),返回倒序迭代器;
public int size(),返回链表元素个数;
public ListIterator<E> listIterator(int index),返回从指定位置开始到末尾的迭代器;
public Object[] toArray(),返回一个由链表元素组成的数组;
public <T> T[] toArray(T[] a),返回一个由链表元素转换类型而成的数组;
-
容量不够或队列为空时不会抛异常:offer(添加队尾元素)、peek(访问队头元素)、poll(访问队头元素并移除)
-
容量不够或队列为空时抛异常:add、element(访问队列元素)、remove(访问队头元素并移除)
遍历
-
快速随机访问
for (int size = linkedList.size(), i = 0; i < size; i++) {
System.out.println(linkedList.get(i));
}
-
自动增强的for循环
for (String str: linkedList) {
System.out.println(str);
}
-
迭代器
Iterator iter = linkedList.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
作为码农中的一员,需要不断的学习,我学习之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。
本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

浙公网安备 33010602011771号