欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

week06_day04

程序员文章站 2022-05-09 13:50:13
...

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吧。
week06_day04
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);
        }
    }
}

········································································································································································································

栈和队列:
week06_day04
········································································································································································································

LinkedList
LinkedList实现了Deque接口。
关于Deque(双端队列)
week06_day04
addFirst表示插入时队列为空会抛出异常。
removeFirst和getFirst表示取队列元素或移除队列元素时队空会抛出异常。
offerFirst表示插入队头时,队满会返回一个特殊值null。
pollFirst和peekFirst表示取队列元素或移除队列元素时队空会返回一个特殊值null。
后面两列和前面一样,只不过是在队尾进行操作。
week06_day04
week06_day04
我们发现,一个双端队列可以模拟栈和队列,可是竟然发现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时就有了,在很早以前设计的。
应当少用继承,多用组合。

为什么?

···························································································································································································

推荐阅读