小伙伴们是不是经常遇到这样的情况,明明我们写的代码编译通过了,却得到不了我们想要的输出。其实在编写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列表里:

snapshot diagram的画法小结相关推荐

  1. Snapshot Diagram画法小结

    Snapshot Diagram可以描述程序运行时的内部状态. 画Snapshot Diagram不仅能够让我们对程序的运行有所了解,而且还能加强我们对一些基本概念的认识和理解,如:基本数据类型.对象 ...

  2. 两种重要的图——Snapshot diagram UML diagram

    Snapshot diagram (代码快照图) 用于描述程序运行时的内部状态,包括堆和栈的调用. 刻画各类变化随时间的变化,描述各类概念如:原始类型/对象类型,不可变对象/可变对象,引用别名 刻画基 ...

  3. markdown流程图画法小结

    markdown流程图画法小结 markdown 画图 流程图 最简单的流程图为例 ```mermaid! graph TD  A --> B //在没有(),[].{}等括号的情况之下,图标默 ...

  4. snapshot画法小结

    snapshot体现了程序中数据的类型及依赖关系. 简单的说: 对于基本类型的值,使用单线箭头指向实际值,不需要表明数据类型. 对于对象的值: 如果是可变对象,使用单线椭圆,椭圆内写明对象的类型及对象 ...

  5. 哈工大软件构造课程知识点总结(二)

    系列文章目录 哈工大软件构造课程知识点总结(一) 哈工大软件构造课程知识点总结(二) 哈工大软件构造课程知识点总结(三) 哈工大软件构造课程知识点总结(四) 哈工大软件构造课程知识点总结(五) 哈工大 ...

  6. 从零开始的软件构造复习[上篇]

    第一章 1.1 软件构造的多维度视图(Multi-dimensional software views) Build-time, moment, code-level 代码如何在逻辑上被组织为基本的程 ...

  7. 软件构造复习笔记(四)数据类型与类型检验

    目录链接 Part I Data type in programming languages 1.1Primitive types基本数据类型 1.2Object types对象数据类型 1.3一些注 ...

  8. HIT Software Construction Review Notes (chapter three)

    1. 基本数据类型,对象数据类型 Java有几种基本数据类型,其中包括: - int(对于像5和-200这样的整数,但是限制于±2^31或大约±20亿的范围). - long(对于上下限为±2^63的 ...

  9. 哈工大软件构造期末知识点总结

    哈工大软件构造试题构成: 1.30-45分的选择题,10-20题 2.55-70分的简答与设计题,5-6题 考试知识点(不全面): 1.git工具的知识点 2.Java设计模式(一共有23个,主要考察 ...

最新文章

  1. 关于 智能指针 的线程安全问题
  2. 前端JS调用微信扫一扫二维码
  3. IOS上传代码到CocoaPods并通过Pod下载
  4. 源码 linux下编译_Linux云服务器软硬链接及源码编译安装python3.8的一些备注
  5. UART_SEND详细设计方案
  6. mysql查看触发器_在mysql中如何查看和修改触发器的代码?请问各位大师,小弟先谢谢了!!!!!!!!!...
  7. 二叉树的迭代遍历(JavaScript)
  8. 现在是 RSS 复兴的时候了!
  9. 关闭rlogin服务linux,Linux rlogin命令
  10. [短评] 技术研发向市场运营让步
  11. px2rem 第三方库实践
  12. 计算机基础达 打字训练视频,「跟着八戒学电脑」快速打字必须掌握的基本功:指法练习...
  13. 不可不会的「反转链表」问题
  14. win2008R2 像CA证书服务器(Linux)申请CA证书
  15. Matlab中将横纵坐标改为自定义标签(set(gca,xtick)set(gca,xticklabel))
  16. 小米笔记本电脑的SN码如何查找?
  17. 数学规划模型(二):线性规划模型
  18. 用antd实现番茄钟
  19. c++读取倍福PLC中轴状态
  20. comsol学习中心:定义与材料选择

热门文章

  1. 查看vue版本,cli版本,npm以及node版本
  2. cocos creator基础-碰撞检测系统
  3. php连接mysql 1045_连接mysql报1045错误怎么办
  4. CatBoost:如何通过CatBoost作为模型分布式的技术
  5. 医咖会免费SPSS教程学习笔记—多重线性回归
  6. 连接oracle数据库 ip,oracle 设置ip连接数据库
  7. sql判断Email和用户名
  8. ubuntu 内存扩容
  9. C++ 常见设计模式
  10. 企业微信接入自有应用实现免登录