Snapshot diagram
为了理解微妙的问题,我们可以画出运行时发生的事情的图片。
快照图(Snapshot diagram)表示程序在运行时的内部状态—其堆栈(正在进行的方法及其局部变量)和堆(当前存在的对象)。
为什么我们使用快照图
–通过图片相互交谈。便于程序员之间的交流
–说明基本类型与对象类型、不可变值与不可变引用、指针别名、堆栈与堆、抽象与具体表示等概念。便于刻画各类变量随时间变化
–帮助解释团队项目的设计(与对方和TA)。便于解释设计思路
–为后续课程中更丰富的设计符号铺平道路。
基本类型的值和对象类型的值
1.原语值由裸常量表示。传入箭头是对变量或对象字段中的值的引用。
2.–对象值是按其类型标记的圆。
–当我们想显示更多细节时,我们会在里面写上字段名,箭头指向它们的值。更详细地,这些字段可以包括它们声明的类型。
再赋值和不可变值
例如:String s = “a”;
s = s + “b”;
String是不可变类型的一个例子,这种类型的值一旦被创建就永远不会改变。
不可变的对象(由它们的设计器设计为始终表示相同的值)在快照图中用双边框表示,就像我们的图中的字符串对象一样。
可变对象Mutable的值:
StringBuilder sb = new StringBuilder(“a”);
sb.append(“b”);
不可指定Unreassignable/不可更改Immutable的引用:
Java还提供了不可变的引用不可变的引用: 只分配一次而从不重新分配的变量。要使引用不可变,请使用关键字final声明它:
final int n = 5;
如果Java编译器不确信最终变量在运行时只分配一次,那么它将产生一个编译器错误。所以final给出了对不可变引用的静态检查。
在快照图中,不可访问的引用(final)由双箭头表示。
age可以改变,id不可以改变。
注意:引用是不可变的,但指向的值却可以是可变的
例如:final StringBuilder sb
可变的引用,也可指向不可变的值
例如:String s
练习题:
数组和集合
1.Array:定长
2.List:可变长度
List是一个接口。列表中的成员必须是对象。
3.Set:集合是零个或多个唯一对象的无序集合
一个对象不能在一个集合中出现多次。要么进去要么出去。
Set是一个抽象接口
4.Map地图类似于字典(键值)
5.Iterator——mutable type 迭代器
迭代器是一个逐步遍历元素集合并逐个返回元素的对象。
在Java中,当您使用for(…:…)时,迭代器被隐藏起来使用循环遍历列表或数组。
迭代器有两种方法:
–next()返回集合中的下一个元素——这是一个mutator方法!
–hasNext()测试迭代器是否已到达集合的末尾。
突变破坏迭代器:
ArrayList第一个移走后,剩下的都补位。