week06_day04
List的子类
下面我们所讲的每个方法都是某个类所特有的方法,如继承自父类的add、remove这种方法,都不讲。
ArrayList
特性:
底层数据结构是数组,增删慢,查找快。
不同步, 线程不安全, 效率高。
存储null元素
容量会自动扩容
构造方法:
ArrayList(): 默认初始大小为10
ArrayList(int initialCapacity): 可以指定数组的初始大小
ArrayList(Collection c):将集合c中的元素传入ArrayList中
API:
void ensureCapacity(int minCapacity):
作用:避免频繁扩容。
如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。
应用场景是刚开始我们不知道存储多少元素,用ArrayList():的构造方法去初始化了一个ArrayList,但到了某个时候,知道应该存多少元素了,就用这种方法。
void trimToSize():
将此 ArrayList 实例的容量调整为底层数组的实际存储元素的大小。
慎用,确保元素不会在添加的情况下用。
········································································································································································································
Vector在Collection提出之前就有了
Vector
特性:
底层是数组,增删慢,查找快
同步, 线程安全, 效率比较低
存储null元素
API:
Vector的很多API名字起得都很繁琐,它的API其实就类似于右侧—>后的collection中的API
void addElement(E obj) --> void add(E e)
void copyInto(Object[] anArray) --> Object[] toArray()
E elementAt(int index) --> E get(int index)
void insertElementAt(E obj, int index) --> void add(int index, E e)
void removeAllElements() --> void clear()
boolean removeElement(Object obj) --> boolean remove(Object obj)
void removeElementAt(int index) --> E remove(int index)
void setElementAt(E obj, int index) --> E set(int index)
Enumeration<E> elements() --> Iterator iterator()
int capacity() //返回此向量的当前容量。默认也是10
void setSize(int newSize) //设置此向量的大小。
capacity和size不一样,capacity是Vector占用的总空间的大小,而size是Vector中真正存储元素的总空间的大小
E firstElement()
E lastElement()
//返回第一个和最后一个元素,如果Vector为空,报错:NoSuchElement
int indexOf(Object o, int index)
//从index开始向后查找元素o,返回查到的第一个o的索引下标
int lastIndexOf(Object o, int index)
//从index开始向前查找元素o,返回查到的第一个o的索引下标
Enumeration<E> elements()
接下来重点看一下 Enumeration elements()这个方法,Enumeration是一个接口,这是一个古老的接口。其实可以类比Iterator这个接口。但是实际开发中还是用Iterator遍历Vector吧。
Enumeration: --> Iterator
boolean hasMoreElements() --> boolean hasNext()
E nextElement() --> E next()
public class VectorDemo2 {
public static void main(String[] args) {
Vector vector = new Vector();
vector.add("hello");
vector.add("world");
vector.add("java");
for(Enumeration e = vector.elements(); e.hasMoreElements(); ) {
String s = (String) e.nextElement();
System.out.println(s);
}
for(Iterator it = vector.iterator(); it.hasNext(); ) {
String s = (String) it.next();
System.out.println(s);
}
}
}
········································································································································································································
栈和队列:
········································································································································································································
LinkedList
LinkedList实现了Deque接口。
关于Deque(双端队列)
addFirst表示插入时队列为空会抛出异常。
removeFirst和getFirst表示取队列元素或移除队列元素时队空会抛出异常。
offerFirst表示插入队头时,队满会返回一个特殊值null。
pollFirst和peekFirst表示取队列元素或移除队列元素时队空会返回一个特殊值null。
后面两列和前面一样,只不过是在队尾进行操作。
我们发现,一个双端队列可以模拟栈和队列,可是竟然发现Deque没有isEmpty方法。
发现Deque继承自Queue接口,Queue接口继承自Collection接口,而Collection接口中有isEmpty方法。
Deque接口
概述:双端队列,可以在两端插入和删除
它包含了栈和队列的API,当你在一端插入一端删除时,就是队列
当你在一端进行插入删除时,就是队列。
LinkedList implements List, Deque
特性:
底层数据结构是链表,增删快,查找慢
不同步, 线程不安全, 效率高
允许null元素
实现了Deque这个接口,可以当作栈,队列和双端队列来使用
构造方法:
LinkedList() //默认初始大小为10
LinkedList(Collection c) //将集合c中的元素复制到LinkedList中
API:
Iterator descendingIterator() //逆向遍历LinkedList中的元素
boolean removeFirstOccurrence(Object o)
//从此双端队列移除第一次出现的指定元素。
boolean removeLastOccurrence(Object o)
//从此双端队列移除最后一次出现的指定元素。
在两端的操作
boolean offerFirst
boolean pollFirst
boolean peekFirst
栈的API:
void push(E e)
E pop()
E peek()
注意事项:Java中提供了Stack类,但是我们应该优先使用Deque, 而不应该使用Stack
为什么?
a. Stack同步的, 效率相对来说比较低。
b. Stack继承了Vector, 所以Stack拥有Vector中所有的方法, 使用起来不安全。
Stack extends Vector
Stack extends Vector,所以Stack不仅有自己的API,还有继承自Stack的API,那Stack就可以在任意指定的位置删除和插入元素了。
而Deque只能在两端进行操作,会比Stack安全很多。
Stack和Vector在java1.0时就有了,在很早以前设计的。
应当少用继承,多用组合。
为什么?
···························································································································································································
推荐阅读