注:本文仅为本人上课时的一些心得体会,由于本人能力有限,文章会有很多错漏之处,还请各位谅解,欢迎指正。
一、前言
从前我编程的时候,对于数据类型没有一个很好的理解,基本上就停留在知道他们都是什么意思的层面,对于他们在底层中的原理啊什么的没什么了解,也觉得没必要,大一时候那些编程课都是直接拿过来就用,没有思考,也从来没有考虑过这样做会不会带来什么安全隐患。
但在这节课上,我第一次知道了数据是怎么初始化的,数据的类型有可变与不可变之分,以及如果不注意正确地使用数据类型会造成多严重的后果,受益良多。
二、可变与不可变
如果让以前的我看这个标题,我会感到匪夷所思,“数据不都是能改变的吗,给他赋另一个值不就行了嘛”,我得出这样的结论也很正常,当时我写代码几乎都是这样:
String a="hello,world";
a="nihao";
对于当时的我来说,这似乎很自然,也很方便。但是现在我明白,我之所以能这样写,是因为这不是简单的赋值,而是开辟了两块内存空间,存入了两个字符串,改变了a的指向!
指向?什么指向?谁指向谁?
这里就要提到变量是怎么创建的了,在Java中,当我们创建一个变量,会在内存中开辟一块空间,记录变量的值,而该变量指向这个值。也就是说,变量和他的值可以理解为两个东西,变量指向值。
而当我们改变一个变量的时候,就有了两种情况:
- 改变这个变量的指向
- 直接改变这个变量所指向的值
根据这两种修改情况的不同,就可以把数据类型分为可变数据类型和不可变数据类型。
1)不可变数据类型
不可变数据类型是指当其一旦被创建后,就不能再修改。Java中的String类就是这样的例子,每一个String字符串都有自己的内存空间,如果我们想改变一个String,就需要再开辟一块内存空间,存储新的值,再将该String指向新创建的内存空间。
对于不可变类型,我们不难发现对其频繁修改会产生大量的临时拷贝,需要对他们进行垃圾回收。但是,由于其不可变性,使之更加的安全可靠,在质量指标上表现的更好。
2)可变数据类型
可变数据类型在修改时,可以直接修改其所指向的内存空间的值,而不用开辟新的内存空间。StringBuilder就是这样的一种数据类型。
可变数据类型可以最少化拷贝,以提高运行效率,也适合在多个模块之间共享数据(这个没怎么实际应用过,体会不是很多)。但如果同时有多个指向同一个内存空间,则会很危险。
所以在使用时,要根据需求折中地使用这两种数据类型。
还有一个关键词与这两个数据类型息息相关:final。final加上一个数据类型的变量时,就表示该变量的指向不可再变,但对于其指向的内存空间的值,是可以进行修改的(前提是可以修改)。