第十一章 持有对象
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的,这意味着很消耗性能。
相关文章推荐
- 第十章 内部类
- mpi学习日志(3):mpi4py与广播
- 18.错误处理
- ZOJ 2476 Total Amount
- HaProxy配置
- 分页控件代码逻辑(JS版本&PHP版本)
- 关于sz、rz的安装
- MySQL常用命令大全
- 第九章 接口
- 单例模式(Singleton) 的应用场景
- 多线程的基本概念
- 第八章 多态
- C语言指针与函数之三数比较大小并排序
- leetcode 151 Reverse Words in a String (python)
- 第七章 复用类
- hadoop eclipse 插件配置使用
- 死锁的产生与解除
- 第六章 访问控制权限
- 使用Eclipse构建Maven项目 (step-by-step)
- Pig安装及本地模式测试,体验