基础数据类型:都和对象的集合有关,操作:添加,删除或访问
1.3.1 API
泛型
自动装箱和自动拆箱
可迭代的集合类型
1、背包 不支持从里面删除元素的集合类型
2、队列(FIFO)
3、栈(LIFO)后进先出
栈的应用:算数表达式求值P128
Dijkstra的双栈算数表达式求值算法
操作数栈+运算符栈
大话数据结构中的逆波兰表示法—>后缀表达式,与此类似。使用单栈
1.3.2 集合类数据类型的实现
1.3.2.1 定容栈
使用泛型数组,在Java中是不允许的,这样是合理的:
Item[] a = (Item[]) new Object[cap];
对象游离:Java垃圾收集策略是回收所有无法被访问的对象的内存。保存着一个不需要的对象的引用就称为游离。要避免对象游离只要将引用设为null即可。
迭代 p86
实现了Iterable接口,就要实现iterator() 方法,该方法必须返回一个Iterator对象
Iterator类必须有两个方法 hasNext()、next()
1.3.3 链表
链表:泛型元素+指向下一个链表的引用
对链表的各种操作:表头插入节点、表头删除节点、表尾插入节点
—>栈的实现
—>队列的实现
—>背包的实现
双向链表:实现任意插入和删除的标准解决方案,每个节点都有两个链接,指向向前和向后两个方向
链表达到了最优化设计目标
- 他可以处理任意类型的数据
- 所需空间总是和集合的大小成正比
- 所需时间总是和集合的大小无关,常数时间
1.3.4 综述
a static nested class 静态内部类
a non-static nested class 非静态内部类
基础数据结构:
1数组 易访问,调整顺序慢,需要预定义空间
- 优点 通过索引任意访问元素
- 缺点 初始化时需要提前知道元素数量
2链表 易修改,调整顺序快,不需要预定义空间,访问慢
- 使用空间大小与元素个数成正比
- 需要通过引用访问元素。
答疑:
1、泛型的优势:在编译时就能发现类型不匹配的错误
2、Java不允许泛型数组
3、Private的嵌套类(内部类),只有包含她的外部类,才能直接访问该内部类的实例变量
4、foreach,是for语句和Iterator机制的语法糖。
使用条件:数组或者是实现了Iterable的集合
5、宽接口,比如java.util.stack ,这个还多了很多不属于栈的方法,也可以被用作队列。本书坚持窄接口