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——底层是链表(双向链表),线程不安全
双向链表的特点:
  1. 插入数据很快。先是在双向链表中找到要插入节点的位置index,找到之后,再插入一个新节点。 双向链表查找index位置的节点时,有一个加速动作:若index < 双向链表长度的1/2,则从前向后查找; 否则,从后向前查找(双向链表相对单向链表优势)。
  2. 删除数据很快。先是在双向链表中找到要插入节点的位置index,找到之后,进行如下操作:node.previous.next = node.next;node.next.previous = node.previous;node = null 。查找节点过程和插入一样。
  3. 获取数据很慢,需要从Head节点进行查找。
  4. 遍历数据很慢,每次获取数据都需要从头开始。
 

 

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(访问队头元素并移除)
 

遍历

  1. 快速随机访问
for (int size = linkedList.size(), i = 0; i < size; i++) {
System.out.println(linkedList.get(i));
}
  1. 自动增强的for循环
for (String str: linkedList) {
System.out.println(str);
}
  1. 迭代器
Iterator iter = linkedList.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
 

 

posted @ 2020-02-22 20:02  BeeeenWei  阅读(124)  评论(0)    收藏  举报