java snapshot图史上最详细手把手教学

本文详细介绍了Snapshot图的概念,用于描绘程序运行时的内存状态,包括栈、堆和代码层面的信息。文章阐述了对象、引用、数据类型的区分,特别是不可变与可变的特性,并提供了画法示例。此外,还讨论了复杂数据类型如List、Set、Map的表示方式以及对象状态的变化。最后,强调了不可变引用和不可变对象的重要性。
摘要由CSDN通过智能技术生成

前言:

在复习期间,复习snapshot图时,课件没有详细的总结,网络上也没有很好的教程,因此本人总结了snapshot图的基本概念以及相关示例,可以帮助学习理解。

一、什么是snapshot图?

snapshot图用于描述程序运行时的内部状态:如栈(方法和局部变量),堆(当前存在的对象)

在八维度三视图中属于:运行(Run-time)、时刻(Moment)、代码(Code-level)
构成要素为:带箭头的线、圈、字符

二、基本概念:
(一)对象、引用、数据类型

String s = new String(“logan”);

在这句代码中,s是引用,"logan"是对象,第一个String是数据类型

(二)可变与不可变

(1)数据类型

数据类型分为:基本数据类型和对象数据类型。
区分两者的技巧就是首字母,首字母大写的就是对象数据类型
如int,long,char等等基本数据类型,全都是不可变的数据类型;
如Double,Integer,String等等对象数据类型,是不可变的数据类型;
如Date,StringBuilder,List等等对象数据类型,是可变的数据类型

(2)对象

对于某一个不是引用的对象,如果它的数据类型是不可变的,那么他就是不可变的对象;如果它的数据类型是可变的,那么他就是可变的对象

如果这个对象是一个引用,则只有保证b是绝对不可变(不可变引用+不可变对象),才能认为b是不可变的对象

(3)引用

没有加任何修饰符的引用默认是可变的引用。
如果想让引用不可变,可以加final,static等等修饰词


三、基本画法:

(一)带箭头的线与圈

带箭头的线从【引用】指向【对象】,引用只需给出名称即可,对象的画法分为以下三种:

(1)基本数据类型的对象

对象无需用圈包围,并且不必注明数据类型,只需要给出对象的值即可

(2)对象数据类型的对象

需要用圈包围并注明对象的数据类型、值

(3)抽象数据类型的对象

需要用圈包围并注明抽象数据类型(下称ADT)的名称,以及该ADT的属性——包括属性的名称以及属性的数据类型,并根据上述(1)(2)画出每个属性引用的对象

(二)可变与不可变

对于可变的引用,画单线箭头
对于不可变的引用,画双线箭头
对于可变的对象,如果需要用圈包围,使用单圈包围
对于不可变的对象,如果需要用圈包围,使用双线椭圆包围


下面看四种引用与对象的组合:

(1)可变引用、不可变对象

String s = new String(“a”);

例子:

 

(2)可变引用、可变对象

StringBuilder t = new StringBuilder(“ab”);

StringBuilder 是一个可变对象代表者一个字母字符串,并且它有方法改变它的对象值
(3)不可变引用、可变对象

final StringBuilder st = new StringBuilder(“abc”);

(4)不可变引用、不可变对象

final String P = new String(“p”);

注:不可变引用进行静态检查

(三)复杂数据类型

除了上述的画法,还有一些典型的复杂数据类型,如List、Map、Set,接下来将介绍它们如何画:

(1)List

List是一个接口

List中的成员必须是一个对象

List< String > cities = new LinkedList< String >();
cities.add(“Boston”);
cities.add(“Bogotá”);
cities.add(“Barcelona”);


(2)Set

 Set是一个抽象接口

Set< Integer > numbers = new HashSet< Integer >();
numbers.add("-7");
numbers.add(“42”);
numbers.add(“1024”);


(3)Map

 

Map< String, Integer > scores = new HashMap< String, Integer >();
scores.add(“James”, 100);
scores.add(“Bob”, 99);
scores.add(“Alex”, 98);

(四)变化

对于可变来说,望文生义,是可以变化的,下面介绍两种变化:

(1)引用可变但对象不可变

String s = new String(“a”);
s = “b”;

(2)对象可变但引用不可变

final StringBuilder st = new StringBuilder(“a”);
st.replace(0, 1, “b”);

(五)注意

从上述内容中,我们不难发现:
①可变引用可以指向不可变的对象
②引用虽不可变,但指向的值可以变化
③如果引用不可变且对象不可变,那么就绝对不可变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值