您的位置:首页 > 其它

第十一章 持有对象

2016-07-18 18:34 190 查看

概要

所谓的持有对象,直白的说就是容器类。在本章中,介绍的是一些基本和常用容器类的一些用法以及基本原理和区别。他并没有深入到底层实现级别。本章主要介绍了容器类的粗略组成结构。如Collection、Iterator、Map。与此同时,还介绍了一些我们常用的这些类的子类,如ArrayList、LinkedList、HashMap、TreeSet等等。在后面的第十八章,还会注重介绍其每个类的原理和使用范围。我们首先上一张很重要的容器接口粗略图:



下面是记录的重点内容:

1.所有的容器类底层保存的 都是object类型的对象,只不过在取出的时候,我们将其转型成为了具体类。

2.Arrays.asList()他的输出是一个List类型的数据,但值得注意的是,它的底层是一个数组,他不能添加和删除元素

3.ArrayList和LinkedList的区别在于,ArrayList底层使用了数组,它在随机访问元素比较快,而插入和删除元素比较慢。LinkedList则相反,它使用了链表结构,随机访问慢,但插入和删除块。

4.List常用的方法有以下:

equals()他根据容器类所有的对象的equals()方法作比较,如果都返回true,就表示这两个容器类所持有的对象都想等。

subList()截取List的某个片段,并返回成一个新的List。

retainAll()返回两个List的交集

removeAll()从List移除在参数中List所有的值。

*set()替换下表的某个元素。

5.Iterator的使用:

使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。

使用next()将获得序列中的下一个元素。

*使用hasNext()检查序列中是否还有元素。

*使用remove()将迭代器新近返回的元素删除。

6.LinkedList的一些方法:

getFirst()、peek()和element()返回队头元素。

remove()、removeFirst()以及poll()删除队列头,并返回这个元素。

*addFirst()队头插入

offer()、add()、addLast()对尾插入。

removeLast()删除队尾

7.Stack是指后进先出(我们的打手枪子弹弹出逻辑)。一般情况下,我们使用LinkedList实现一个栈的结构。下面是一个栈的代码:

class Stack<T>{
private LinkedList<T> linkedList = new LinkedList<>();//这里使用一个LinkedList
public void push(T t){
linkedList.add(t);
}
public T peek(){
return linkedList.getFirst();

}
public T pop(){
return linkedList.removeFirst();
}
public boolean empty(){
return linkedList.isEmpty();
}
}


7.map.keySet()返回键的所有key值,map.values()返回所有的values值。

8.在我们的容器类图结构可以看到,LinkedList提供了Queue类的支持。我们的使用方法有以下几个值得我们注意:

peek()和element()都是在不移除元素的情况下返回队列的队头,但是peek()方法在队列为空的时候返回null,而element()抛出NoSuchElementException()异常。

pool()和remove()在移除元素后,返回对头元素。值得注意的是poll()在队列为空的时候返回null,而remove()和peek()一样,会抛出NoSuchElementException()异常。

9.priorityQueue是一个具有优先级的队列,当你调用peek()、pool()、remove()方法的时候,获取的元素都是队列中优先级最高的。但是值得注意的是,priorityQueue中的元素必须都实现了Comparator接口。

10.生成Iterator是将队列与消费队列的方法连接在一起耦合度最小的方式,并且与实现Collection相比,他在序列类上所施加的约束也少很多。

11.foreach语句的自动迭代依赖的是某个类实现了Iterable(不是Iterator类,Iterable是一个接口,他只有一个方法 :Iterator iterator();)接口或者数组。

12.容器类不能直接持有基本类型,但是我们在传入基本类型的时候,会自动转换成其包装类型。

13.总结:

Collection保存单一的元素,而Map保存相关的键值数。

像数组一样,List也建立数字索引与对象的关联,因此数组和List都是排好序的容器。

如果要大量进行随机访问,就用ArrayList,如果要经常插入删除,就选择LinkedList

各种Queue以及栈的行为,由LinkedList来提供支持。

HashMap用来设计快速访问,而TreeMap保持键使用处于排序状态,LinkedHashMap用来保持插入顺序,但是他也实现了散列的快速访问能力。

Set不能接受重复对象,HashSet提供最快的查询速度,TreeSet保持元素处于排序状态,,LinkedHashSet以插入顺序保存元素。

新程序中应该不使用过时的Vector、Hashtable和Stack个人认为,很大的原因是他们都是synchronized的,这意味着很消耗性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: