期末总结(二):数据类型与类型检验

1. 编程语言中的数据类型

变量:用特定数据类型定义,可存储满足类型约束的值

Java数据类型包括:
基本数据类型:int, long, boolean, double, char, etc.类型名均为小写字母
对象数据类型:例如,字符串类型String表示一个字符序列;大整数BigInteger类型表示一个任意大小的整数。类型名以一个大小字母开头
关于两种数据类型的比较如下:
在这里插入图片描述
对象类型形成层次结构:所有非基本数据类型都是类,除了Object类,每个类都继承自一个父类,用extends块标识。如果省略extends,默认继承Object。每个类都是其父类的一个实例,继承其父类的可访问属性和方法,能够重写方法改变其行为。

2. 静态与动态类型检查

语言提供的类型检查分三种类型:静态类型检查,动态类型检查,无检查。

静态类型检查:可在编译阶段发现错误,避免将错误带入到运行阶段,可提高程序正确性、健壮性。Java是静态类型语言

静态类型检查内容:语法错误,类名/函数名错误,参数数目错误,参数类型错误,返回值类型错误。
动态类型检查内容:非法的参数值,非法的返回值,越界,空指针
静态检查:关于“类型”的检查,不考虑值
动态检查:关于“值”的检查

静态类型检查>>动态>>无检查

3. 可变性与不可变性

改变一个变量:将该变量指向另一个值得存储空间
改变一个变量的值:将改变量当前指向的值的存储空间中写入一个新的值

Immutabillity不变性
不变数据类型:一旦被创建,其值不能改变
如果是引用类型,也可以是不变的:一旦确定其指向的对象,不能再被改变
使用关键字final声明一个不可变引用
如果Java编译器无法确定final变量不会改变,就提示错误,这也是静态类型检查的一部分。
所以,尽量使用final变量作为方法的输入参数、作为局部变量。
final表明了程序员的一种“设计决策”

关于final的使用
final类无法派生字类
final变量无法该改变值/引用
final方法无法被子类重写

不变对象:一旦被创建,始终指向同一个值/引用
可变对象:拥有方法可以修改自己的值/引用

使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收)
可变类型最少化拷贝以提高效率
使用可变数据类型,可获得更好的性能,也适合于在多个模块之间共享数据,但不可变类型更“安全”,在其他质量指标上表现更好

返回可变类型的对象:通过防御式拷贝,给客户端返回一个全新的对象。
大部分时候该拷贝不会被客户端修改,可能造成大量的内存浪费。如果使用不可变类型,则节省了频繁复制的代价。
不可变类型比可变类型更高效,因为不可变类型不需要防御式拷贝

安全地使用可变类型:局部变量,不会涉及共享,只有一个引用;如果有多个引用(别名),使用可变类型就非常不安全

4. 快照图

快照图用于描述程序运行时的内部状态,便于程序员之间的交流,便于刻画各类变量随时间变化,便于解释思路

基本类型的值用单线箭头指向变量标识的值来表示
对象类型的值用一个标识有其类型的椭圆表示,内部可以包含其属性的更多细节,属性也可以通过箭头指向更多的细节
在这里插入图片描述
不可变对象:用双线椭圆
在这里插入图片描述
不可变的引用用双线箭头
在这里插入图片描述
对一个可变值的不可变引用:引用是不可变的,但指向的值却是可变的
对不可变值得可变引用:可变的引用,也可指向不可变的值

5. 复杂数据型:数组与集合类

5.1 Array

Array是类型T的定长序列。一个Array数组一旦创建,长度不能改变。声明方式:
在这里插入图片描述
常用操作如下:
索引(indexing):a[2]
赋值(assignment):a[2]=0;
获得长度(length):a.length

5.2 List

Lists是类型T的变长序列。声明方式:
在这里插入图片描述
常用操作:
索引(indexing)list.get(2)
赋值(assignmengt):list.set(2,0)
求长度(length):list.size()

注:List是接口类型;List中的元素必须是一个类
在这里插入图片描述

5.3 Set

Set是0或多个不同类的无序集合,一个类不能在一个set中出现多次。常用操作:
s1.contains(e) 测试set是否包含一个特定元素
s1.containsAll(s2) 测试s2是否包含于s1
s1.removeAll(s2) 将s2中元素从s1中移除

Set是一个抽象接口:在这里插入图片描述

5.4 Map

Map类型对象与字典相似,包含(key-value)键值对。常用操作:
map.put(key, val) 添加映射key -> val
map.get(key) 获得key对应的值
amp.containsKey(key) 测试map是否包含一个key键
map.remove(key) 删除以key为键的映射

Map是一个抽象接口
在这里插入图片描述

5.5 迭代器Interation

在这里插入图片描述
迭代器用于逐个遍历集合类中的元素
对List或arary的for(… : …)循环遍历实际上封装了迭代器
在这里插入图片描述

一个iterator有两个方法:
next():返回集合中的下一个元素——该方法为mutator方法
haxNext():测试迭代器iterator是否已经遍历到集合的边界
ArrayList<String>中的迭代器:
在这里插入图片描述
注意:尽量在循环中使用迭代器的删除方法,以防发生意料之外的并发错误
在这里插入图片描述

6. 实用不可变类型

基本类型及其封装对象类型都是不可变的:大整数类BigInteger, BigDecimal类是不可变的
不要使用可变的Date,尽量用java.time中具有所需要的计时粒度的不可变类型
常用Java集合类List,Set,Map的实现ArrayList,HasnMap等都是可变的

Collections公共类中包含维护可变集合不可修改特性的方法,可用于包装list/set/map类型为不可变类型
Collections.unmodifiableList
Collections.unmodifiableSet
Collections.unmodifiableMap
这种包装器得到的结果是不可变的,只能看,但这种“不可变”是在运行阶段获得的,编译阶段无法据此进行静态检查
如果在程序中尝试使用sort()方法对此类不可修改list进行排序,Java不会在编译阶段发出警告,但会在运行时抛出exception

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值