JavaJava 杂谈

《Java编程的逻辑》精读二(数据类型,字符编码)

2019-05-04  本文已影响0人  Alisallon

最近在阅读《Java编程的逻辑》一书,受益良多,在此对作者(马俊昌)万分的感谢。

计算机是一个机器,只能处理二进制数据,比如0100 1101。
但直接使用二进制进行编程开发,非常的不友好,所以有了各种高级开发语言,如 CC++C#JavaPHP等。
为了更好的操作二进制数据,高级开发语言大多引入了数据类型的概念,使用不同的类型来表示数据。

基本数据类型

对于 Java 语言来讲,有如下基本数据类型:

1、整数类型

byte

占1个字节,8位二进制,第1位是符号位,取值范围为:-27(即1000 0000) ~ 27-1(即0111 1111)。

byte b = 23;
short

占2个字节,16位二进制,第1位是符号位,取值范围为:-215(即1000 0000 0000 0000) ~ 215-1(即0111 1111 1111 1111)。

short s = 3333;
int

占4个字节,32位二进制,第1位是符号位,取值范围为:-231(即1000 0000 0000 0000 0000 0000 0000 0000) ~ 231-1(即0111 1111 1111 1111 1111 1111 1111 1111)。

int i = 9999;
long

占8个字节,64位二进制,第1位是符号位,取值范围为:-263 ~ 263-1。
整数值默认为int类型,给long类型变量赋值时需要在后面加小写字母 l 或大写字母 L,防止值超出了int的取值范围。

long l = 32323L;

2、浮点数类型

浮点数,即数学中的“小数”。
因为在计算机中表示小数的点不是固定的,而是浮动的,所以被称为“浮点数”。

浮点数在计算机中采用类似十进制的科学计数法来表示的,即m×2n,其中m称为“尾数”,n称为“指数”。
计算机中保存的小数,即保存的m和n。

由此可见,计算机只能精确的表示可以表述为2的几次方的小数(比如1×2-1:0.5、3×2-2:0.75、6×2-3:0.75),其他小数则无法精确的表示(类比一下十进制中的小数只能精确表示10的几次方的小数)。

float

占4个字节,32位二进制,第1位是符号位,中间23位保存尾数,最后8位保存指数。
浮点数的值默认为double类型,给float类型变量赋值时需要在后面加小写字母 f 或大写字母 F

float f = 2.11f;
double

占8个字节,64位二进制,第1位是符号位,中间52位保存尾数,最后11位保存指数。

double d = 2.11;

3、boolean类型

用boolean表示,值只有true或false两种。

boolean b = true;

boolean类型的大小没有明确定义。
下面参考Java中boolean类型到底占用多少个字节?
单独的boolean类型编译后会用int代替,boolean值占用4个字节(32位二进制)。
boolean类型数组会被编译为byte数组,每个boolean值占用1个字节(8位二进制)。
使用int代替boolean,而不用byte或short的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),32 位 CPU 使用 4 个字节是最为节省的,哪怕你是 1 个 bit 他也是占用 4 个字节。因为 CPU 寻址系统只能 32 位 32 位地寻址,具有高效存取的特点。

4、字符(char)类型

用char表示,值是一个字符,中文或英文字符都行。
使用单引号把字符括起来。

char c1 = 'a';
char c2 = '我';

Java内部处理字符时,使用的是Unicode编码,具体编码格式为 UTF-16BE(UTF-16大端表示)。
所以字符类型本质上也是一个整数,占2个字节或4个字节,下面有具体说明。

Unicode编码

Unicode编码为世界上所有字符都分配了一个唯一的数字编号,范围从0x000000~0x10FFFF,前缀使用U+。
Unicode编码并没有规定这个编号怎么和二进制对应,下面是几个主要方案:

非Unicode编码

⚠️ 字符乱码的问题,都是读取字符时用的编码与写字符时用的编码不一致造成的。

数组类型

数组中的元素是连续存放的。
数组的长度一旦确定,就不可更改。
基本数据类型的变量,在内存中只有一个对应的内存空间,直接存储变量的值。
而数组类型的变量,在内存中有两个对应的内存空间:一个存放该数组变量的值的起始位置,一个存放该数组变量的值的内容。
类似数组类型存储方式的类型,一般也称为引用类型。

在Java中,许多复杂的类型,都是使用基本数据类型和数组类型组合而成,比如:
String/StringBuilder/StringBuffer:内部使用char数组,所有字符串的操作都是基于该数组的。
ArrayList/ArrayDeque:内部使用泛型数组,所有Array操作都是基于该数组的。
Date:内部使用long值表示距离纪元时的毫秒数,所有时间操作都是基于该毫秒数的。

上一篇 下一篇

猜你喜欢

热点阅读