计算机基础学习:如何选择合适的数据类型

89 阅读3分钟

文章内容主要为小册《程序员的必修课》的学习笔记以及个人理解,仅供个人学习使用。详细内容请支持正版小册

有哪些数据类型

首先数据类型分为两大类,值类型和应用类型,值类型存放的是具体数值,而引用类型存放的是数据的地址

值类型

  • 比特类型(byte):8 位二进制。
  • 短整型(short int):16 位二进制。
  • 整型(int):32 位二进制。
  • 长整型(long):64 位二进制。
  • 布尔类型(boolean):默认是使用 int 表示的,也就是 32 位二进制。
  • 字符类型(char):16 位二进制。
  • 单精度浮点(float):32 位二进制。
  • 双精度浮点(double)64 位二进制。

引用类型

  • 字符串(string)

字符串实际上一个钟被包装为值类型的应用类型,因为就是为了不可变。在许多编程语言中,字符串一旦被创建,就不能被改变。这意味着当你试图改变字符串的某个部分时,实际上是在创建一个新的字符串。

有人说不对啊,String 是为了不可变,那么字符串执行自加运算是怎么执行的呢?

let a = 'a'
let b = 'b'
a += b // 'ab'

在这个例子中,虽然看起来像更改了 a 的值,但实际上是将 a 指向了另一个地址,这个地址放的内容是 'ab',所以并不是字符串对象变了。所以,字符串每次相加都会创建新字符串对象

基于这个结论,我们在开发中要避免频繁的执行字符串的想加操作,因为创建对象的代价比较高。所以要避免写这种代码:

let name = "";
for(let i = 0; i < names.length; i++){ 
    name += names[i]
}
  • 数组

数组是一个特殊的引用类型,其指向的是内存中第一个元素的地址。因为数组在内存中占据连续的空间,我们能通过了解第一个元素的位置和数组中存储的变量类型大小,计算出数组中每个元素在内存中的具体地址。

所以在知道数组中索引的情况下,根据下标查找数据,速度非常快,这也是数组的特点。

然而,需要注意的是,尽管理论上可以这样计算元素的内存位置,但是在实际的编程环境中,程序员通常不需要(也不鼓励)针对特定元素的内存地址进行操作。利用数组索引就可以高效地访问元素,这样更安全、可读性也更高。

  • 对象
class Obj {
    public name = ''
    
    constructor(x) {
        this.name = x
    }
}

let theObj = new Obj()

任何对象都有它的生命周期;局部变量的生命周期,随着函数的调用出生,随着函数调用结束死亡。

对象的生命周期跟着作用域走,如果没有引用指向它,它就可能提前死亡。一个对象是否可以被回收,取决于执行垃圾回收时它有没有被引用

如何选择合适的数据类型

  • 空间

从空间上看,优先选择空间占用小的,比如在 Java 语言中,boolean 比较特殊,当它单独使用时,就是一个 int 的大小,也就是 4 个字节;当它用作数组元素使用,就只占用 1 个字节,这也是为什么很多服务器在定义数据时,将 boolean 定义为 1 和 0 的原因。

  • 时间

从时间上看,要选择操作效率高的数据类型,数字类型就是这样的类型,像操作位运算的时候,数字类型效率非常非常高。常见的乘法操作,可以考虑改成位运算的组合。