软件构造笔记——Java基本数据类型和对象数据类型

一、基本数据类型(primitive types)与对象数据类型(object types)

        Java是双类型的系统,也就是基本数据类型和对象数据类型,简称基本类型和对象。 其中,Java中有8个预定义的基本类型,分别是:

byte, short, int, long, float, double, boolean, char

        他们只有值,没有ID (与其他值无法区分)。他们的代价很低,在栈(stack)中分配内存。最重要的一点:他们是不可变的(immutable)。

        Java也有对象数据类型,例如:

Classes, interfaces, arrays, enums, annotations

        对象类型数据既有ID,也有值。他们代价昂贵,在堆(heap)中分配内存。他们有些是可变的,有些是不可变的。

二、可变类型(mutable type)与不可变类型(immutable type)

        在Java中,对象的类型可以分为可变类型与不可变类型。在实际项目的构建中,对于数据类型的调用与返回是项目安全中非常重要的一部分。

        不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。

        不可变对象的类即为不可变类(Immutable Class)。Java平台类库中包含许多不可变类,如String、基本类型的包装类、BigInteger和BigDecimal等。

三、对可变类型和不可变类型进行修改

        在Java中,对变量进行修改时存在两种不同的方式:修改变量的指向与修改变量的值。

        以String为例,String是一个不可变类型,当我们对String进行修改时,我们新分配了一个内存存储修改后的值,并将原变量指向修改后的值:

软件构造笔记——Java基本数据类型和对象数据类型_第1张图片

         以StringBuilder为例,StringBuilder是一个不可变类型,当我们对StringBuilder进行修改时,我们将变量指向的值直接进行修改:

软件构造笔记——Java基本数据类型和对象数据类型_第2张图片

         当只有一个引用指向该值, 没有区别,但是当有多个引用的时候,差异就出现了:

软件构造笔记——Java基本数据类型和对象数据类型_第3张图片

        对于资源的使用方面,使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收) ,可变类型最少化拷贝以提高效率。在性能方面,使用可变数据类型,可获得更好的性能,也适合于在多个模块之间共享数据。那我们为什么还要强调使用不可变类型呢?

        因为我们在调用函数传递可变变量时,很可能直接被恶意修改变量指向的数据值,导致出现不可理解的错误发生。为了避免发生这种错误和代码的安全性,我们提倡要使用不可变类型的数据。

四、对可变数据类型进行保护

        当我们在传递一个可变数据类型的时候,我们可以对他:

        1.通过数据类型转换变成一个不可变数据类型

        2.进行防御式拷贝

        这样可以大幅提高代码的安全性。

你可能感兴趣的:(java,数据结构,安全性测试)