Java编程思想第四版第十一章学习——持有对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Muc_hui/article/details/51581879

1、基本概念

Java容器类类库的作用是“保存对象”,分为
1)Collection.一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与他们被插入的顺序相同)。
2)Map.一组成对的“键值对”对象。

2、List

List 将元素维护在特定的序列中,有两种类型
(1)基本的ArrayList,它长于随机访问元素,但是在List中间插入和移除元素时较慢。
(2)LinkedList,在List中间进行插入和删除操作代价较低,但是在随机访问方面相对较慢,但是它的特性集较ArrayList更大。

在List中,一些函数的用法:
(1)contains()方法来确定某个对象是否在对象中。
(2)remove()方法用来移除某个对象。
(3)如果你有一个对象的引用,可以使用indexOf()来确定该对象在List中所处的位置的索引编号。
(4)subList()方法用来从较大的列表中创建出一个片段。
(5)retainAll()方法用来求交集。
(6)removeAll()方法用来移除在参数List中的所有元素。
(7)addAll()方法用来在初始List的中间插入新的列表。

迭代器
迭代器是一个对象,它的工作是遍历并选择序列中的对象。从而做到了只是使用容器而不关心容器的类型。
在我看来,Java中的Iterator类似于数据结构中的单向链表,只能单向移动。只能用来:
(1)使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
(2)使用next()获得序列中的下一个元素。
(3)使用hasNext()检查序列中是否还有元素。
(4)使用remove()将迭代器新近返回的元素删除。
这里写图片描述

ListIterator

ListIterator是一个更强大的Iterator的子类型。只能用于各种List类的访问,但是可以双向移动。
(1)nextIndex()用来指向当前位置的后一个元素的指引。
(2)previousIndex()用来指向当前位置的前一个元素的指引。
(3)listIterator()方法产生一个指向List开始处的ListIterator。
(4)listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。

LinkedList
LinkedList中添加了可以用作栈、队列或双端队列的方法。
(1)getFirst()和element()返回列表的头(第一个元素),如果为空,提示NoSuchElementException。peek()方法类似,不过在列表为空时返回null。
(2)addFirst()将某个元素插入到列表的头部。而offer()、add()和addLast()作用类似,将某个元素插入到列表的尾部。
(3)remove()、removeFirst()和poll()都是将某个元素从列表的头部移除。

Stack
LinkedList具有能够直接实现栈的所有功能的方法。如下所示。

public class Stack<T>{
    private LinkedList<T> storage = new LinkedList<T>();
    public void push(T v) {storage.addFirst(v);}
    public T peek() {return storage.getFirst();}
    public T pop() {return storage.removeFirst();}
    public boolean empty() {return storage.isEmpty();}
    public String toString() {return storage.toString();}  
}

类名之后的告诉编译器这将是一个参数化类型,而其中的类型参数,即在类被使用时将会被实际类型替换的参数,就是T。

3、Set

TreeSet将元素存储在红-黑树数据结构中,而HashSet使用的是散列函数,LinkedHashList因为查询速度的原因也使用了散列,但是看起来它使用了链表来维护元素的插入顺序。

如果想按照字母序排序,可以向TreeSet的构造器传入String.CASE_INSENSITIVE_ORDER比较器(比较器就是建立排序顺序的对象)

Set<String> words = new TreeSet<String>       (String.CASE_INSENSITIVE_ORDER); 

4、Map

containsKey()和constainsValue()方法分别测试是否包含某个键或某个值。
keySet()方法产生一个由在某个Map中的所有键组成的Set。

5、Queue

LinkedList提供了方法以支持队列的行为,并且实现了Queue接口。

public class QueueDemo{
    public static void printQ(Queue queue) {
    while(queue.peek() != null)
     System.out.print(queue.remove() + " ");
    System.out.println();
    }
    public static void main (String[] args){
        Queue<Integer>  queue = new LinkedList<Integer>();
        Random rand = new Random(47);
        for(int i = 0; i < 10; i++)
            queue.offer(rand.nextInt(i + 10));
        printQ(queue);
        Queue<Character> qc = new LinkedList<Charactor>();
        for(char c: "Brontosaurus".toCharArray())
             qc.offer(c);
        printQ(qc);
    }
}/*Output
8 1 1 1 5 14 3 1 0 1
B r o n t o s a u r u s 
*///

offer()方法在允许的情况下,将一个元素插入到队尾,或者返回false。
peek()和element()都将在不移除的情况下返回对头,但是peek()方法在队列为空时返回null,而element()会抛出NoSuchElementException异常。
poll()和remove()方法将移除并返回队头,但是poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。

阅读更多

没有更多推荐了,返回首页