第四章 数据类型与类型检验
第四章 数据类型与类型检验
数据类型
-
类型:一组值,以及可以对这些值执行的操作。
-
变量:存储一种特定类型值的命名位置
Java类型
-
基本数据类型
- 小写
-
对象数据类型
- 首字母大写
-
对比
静态类型检测和动态类型检测
静态类型语言
在编译阶段进行类型检查(对类型的检查)(例如:Java)
- 语法错误
- 类名 / 函数名错误
- 参数数目错误
- 参数类型错误
- 返回值类型错误
动态类型语言
在运行阶段进行类型检查(对值的检查)
-
非法的参数值
- 例如除法函数,除数传了一个0
-
非法的返回值
- 当特定的返回值无法在类型中表示时
-
越界
-
空指针
动态>静态>无检查
Mutability and Immutability
改变一个变量和一个变量的值的区别
- 改变一个变量:将该变 量指向另一个值的存储空间
- 改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。
Immutability
-
不变性:重要设计原则
-
不变数据类型:一旦被创建,其值不能改变
-
final
- final修饰的变量也是不变的:一旦确定其指向的对象,不能再被改变,但对象的属性可变
- 如果编译器无法确定 final 变量不会改变,就提示错误,这也是静态类型检查的一部分。
- 尽量使用final 变量作为方法的输入参数、作为局部变量。
- final 表明了程序员的一种“设计决策”
- final类无法派生子类
- final变量无法改变值/引用
- final方法无法被子类重写
Mutable types 和 Immutable types
-
mutable types
-
Mutable type 拥有方法可以修改自己的值/引用
-
好处
- 使用 不可变类型,对其频繁修改会产生大量的临时拷贝 ( 需要垃圾回收)
- 可变类型最少化拷贝以提高效率
- 使用可变数据类型,可获得更好的性能
- 也适合于在多个模块之间共享数据
- Global variables
-
不安全时,修改代码的方法
- 防御式拷贝
- 使用不可变类型
-
安全的使用mutable类型
- 局部变量,不会涉及共享,只有一个引用
-
-
Immutable types
-
没有任何方法改变属性值
-
好处
- 使用mutable类型时,可能需要防御式拷贝,这时如果使用不可变类型,则节省了频繁复制的代价,相较之下,不可变类型效率反而更高。
- 不可变类型更"安全", 在其他质量指标上表现更好
-
Snapshot diagram
用于描述程序运行时的内部状态
画法
-
Primitive values 基本类型的值
-
Object values 对象类型的值
-
可变对象
-
不可变对象
-
-
final
- 双线箭头
-
注意:所有的箭头都会指向内存中的对象,而不是指向对象的变量
Arrays and Collections
Array
- 定长数组
List
- 变长数组
Set
- 无序集合
- 无重复
Map
- 键值对
Iteration
-
Iterator迭代器
- 迭代器是一个对象,它遍历元素集合并一个一个地返回元素。
- for each时自动使用
- mutable类型
- hasNext()和next()
-
用迭代器删除元素可能出现问题
-
for each不允许执行删除操作
-
list删除特定元素
- removeIf()
- 使用迭代器的remove代替list的remove
有用的immutable类型
Collections
-
获取列表,集合和图的不可变类型
- Collections.unmodifiableList
- Collections.unmodifiableSet
- Collections.unmodifiableMap
-
得到结果不可变
-
这种不可变是在运行阶段获得,编译阶段无法据此进行静态检查,也就是说改变时编译不会报错,运行报错,可以理解成它封闭了更改的方法,调用这个方法时报错
-
Collections包装的对象改变时,会影响包装后的结果,即使改变发生在包装后。