snapshot diagram的画法小结

小伙伴们是不是经常遇到这样的情况,明明我们写的代码编译通过了,却得到不了我们想要的输出。其实在编写JAVA程序时,我们并不是拿着高级的编辑器编完代码然后没有报错就万事大吉了,这样会让我们的程序出现很多潜在的BUG。只有深入了解运行时内存的情况,才能让我们真正了解我们所写的代码逻辑是否符合我们的需要。而怎样才能让我们更加直观的掌握代码运行时在内存中的逻辑呢?这就用到了一个叫snapshot diagram(内存快照图)的东西。

优点

它具有以下的优点:便于程序员之间的交流,它是一种程序员之间刻画程序的语言之一,简单而清晰的内存快照图使得程序员之间的交流变得快捷;它有利于刻画各变量随时间的变化,我们的程序是一步步执行的,某些变量,指针的变化和指向也随着时间一步步变化,我么能在内存快照图中动态的了解我们程序的执行情况;它还有利于解释设计思路,一行行代码可能会降低我们程序的可读性,而快照图清晰明了的解释了你的设计思路。

那么我们进入正题:

我总结了常见的内存快照图画法情况,大概涵盖一下几点:

1.引用的画法:当你为你的new出来的对象创建一个引用时,他在图中就画成它本身的符号就行(一般是英文字母),不用使用一个椭圆形框把它框起来。它有个箭头直接指向它所指向的内存空间,如下图所示(如果是有final修饰则箭头改为双线):

2.基本类型如整形,浮点数等直接用数字标识即可:

3.String类型有两种表示法,第一种双引号中间加入所表示的字符串,第二种用一个双线椭圆标识出String所在的空间:

 

4.在这里先解释双线和单线的箭头以及椭圆框的区别:双线表示不能再修改,对箭头来说是表明引用不能再指向别的内存空间,而对于椭圆来说,则是表示这个内存空间是一个immutable(不可变类型)。

5.集合类的表示:

(1)ArrayList:mutable,故而是单线的椭圆框,框内有若干数字表示List的对应元素的引用,每个引用分别指向相应的内存空间,例如下图表示ArrayList<String>且含有三个元素:

(2)HashSet:  mutable,故而是单线的椭圆框,因为Set是无顺序的集合,所以集合内的引用无需显示的标明,例如下图  HashSet<Integer>:

 (3)HashMap: mutable,故而是单线的椭圆框,同Set一样无顺序,所以也无需显示的标明引用的顺序,但需要标明每个键值对,如下是一个HashMap<String,Turtle>:

 下面展示一个例题来具体说明怎么用snapshot来表明内存的变化:

 Poem类有如下的Field:

 首先先处理前三行画一个ArrayList<String>:

 

然后创建Poem对象,注意,该对象的构造方法采用防御是拷贝,所以它的lines指向的是和原来的List一样的不同内存:

 getSomeLines是从诗Poem里提取对应的行,存到some列表里:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值