本章主要内容:数据类型、静态\动态类型检查、可变\不可变的数据类型、Snapshot图、集合类表示复杂数据类型
数据类型
java分为基本数据类型(int、long、boolean、char、float等,小写字母开头)和对象数据类型(String、BigInteger等,大写字母开头)。
对象类型之间可以构成超类和子类的层次结构,可以将基本数据类型包装为对象数据类型,要在定义集合类型的时候使用,但会影响效率。
静态\动态类型检查(考试重点)
静态类型语言:在程序运行之前所有变量的类型已知,编译阶段进行类型检查。
动态类型语言:编写代码不指定数据类型,在运行阶段进行类型检查。
静态类型检查:语法错误、类名\函数名错误、参数数目错误、参数类型错误、返回值类型错误
检查类型,不检查值
动态类型检查:非法的参数值、非法的返回值、越界访问、空指针 检查值
两种类型的语言都会进行静态\动态类型检查,只不过动态类型语言在静态类型检查时不检查类型是否符合。
可变\不可变的数据类型
尽量使用不变性,使用final变量作为方法的输入参数和局部变量,此时无法修改值或引用。
String是不可变的,StringBuilder是可变的
当只有一个引用指向这个值时,两者没有区别,有多个引用时就会导致问题,类似于全局变量。
不可变数据类型的修改会产生大量的拷贝,降低程序的性能,会导致效率降低,但更安全。
为使可变数据类型安全,可以采用防御性拷贝,但对其修改可能很少,会造成大量的内存浪费。
存在别名使用时,使用不可变类型为上,对两种类型的抉择是要找到效率与安全的统一。
Snapshot
用于描述程序运行时的内部状态
基本数据类型不加任何额外标识,对象数据类型加一个圈和类名,不可变类型用双线椭圆表示,不可变引用用双线箭头表示。
有引用不可变值可变(final StringBuilder)和引用可变值不可变(String)两种类型。
复杂数据类型
1.数组
Array定长数组,长度不能改变,其长度是magic number,难以确定
List变长数组,List只是一个接口,只规定了定义和要实现的方法,需要有一个具体的实现形式来完成功能,这样实现了抽象定义与具体实现的分离。
2.集合
集合内元素无序的、非重复的,Set也是接口,有HashSet和SortedSet等实现方法。
3.字典:Map也是接口
注意遍历时使用的三种写法,推荐使用for循环(底层也是用迭代器实现的)。
不可变封装
在不同方法间传递不可变参数时,可以使用防御性编程或不可变封装。
无需耗费额外内存,只是进行封装,在修改时会抛出异常。