第四章 数据类型与类型检验

第四章 数据类型与类型检验

数据类型

  • 类型:一组值,以及可以对这些值执行的操作。

  • 变量:存储一种特定类型值的命名位置

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包装的对象改变时,会影响包装后的结果,即使改变发生在包装后。在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值