一、关于ADT
- AF:抽象函数
AF表示值到其对应的抽象值的映射,即该ADT给出的是多种值的抽象化表示。 - RI:表示不变量
RI表示值到布尔值的映射,说明某个值必须满足怎样的条件。 - safety from rep expose:安全保证
safety from rep expose描述ADT如何确保表示是安全的。 - checkRep():检查表示不变量
checkRep检查表示不变量是否始终满足。
二、关于迭代器Iterator
1 构建
Iterator<Edge> it = edges.iterator();
使用Collections的某个子类的iterator()方法创建。
2 迭代过程
while (it.hasNext()) {
Edge e = it.next();
……
}
hasNext():判断迭代器是否仍有下一个可迭代的元素。
next():返回下一个元素,其返回值是可变的(即可以同时在被迭代的集合类中修改)。
3 删除
it.remove();
只有采用这种删除方法,才既可以将该元素从被迭代的集合类中删除,且不会抛出异常ConcurrentModificationException。
4 一些补充
遍历时默认调用迭代器,包括foreach。因此在foreach中不能直接删除元素。
有时,在迭代器中多次修改未必能真正实现,最好的方法仍是记录待修改的位置,在迭代结束后再根据记录进行修改。
三、可变与不可变
-
改变变量和改变值
对变量赋值是在改变变量的指向
改变可变变量的内容,是在改变变量内部内容的引用 -
不可变类型
一旦创建,只表示同一个值 -
不可变引用
一旦指定引用位置,不可再次指定
final关键字对不可变引用提供了静态检查的支持
补充:
final声明的类不可被继承;
final声明的变量,其值和引用不可被修改;
final声明的方法不能被子类重写; -
可变类型
提供修改对象值的方法 -
可变类型的风险
传递过程中具有潜在风险,采用防御式复制保护可变类型。
四、快照snapshot
- 基本类型和对象类型
基本类型:箭头指向值
对象类型:箭头指向一个内容,内容里的基本类型指向值
- 不可变类型重赋值
指向新的内容。
- 可变类型重赋值
修改原有内容。
- 不可变引用
双线箭头说明引用不可变。