本章节目标:
理解数据类型的作用。Java中包括哪些数据类型?常见的八种基本数据类型都有哪些?会用八种基本数据类型声明变量?什么是二进制?原码反码补码是什么?什么是字节?byte类型取值范围?什么是字符编码方式?每种数据类型在使用时的注意事项?基本数据类型之间的转换?
Java的数据类型概述
几乎所有的编程语言中都会有数据类型,什么是数据类型呢?软件的存在主要是进行数据的处理,现实生活中的数据会有很多,所以编程语言对其进行了分门别类,然后不同的数据类型的数据会给其分配不同大小的空间进行存储。换句话说,java中的数据类型作用就是指导java虚拟机在程序运行阶段到底应该给该变量分配多大的内存空间。
● 基本数据类型
● 引用数据类型
● 整数型(不带小数的数字):byte,short,int,long
● 浮点型(带小数的数字):float,double
● 字符型(文字,单个字符):char
● 布尔型(真和假):boolean
java中除了以上的8种基本数据类型之外,其它的数据类型均属于引用数据类型,也就是说字符串在java中不属于基本数据类型,而属于引用数据类型。请看八种基本数据类型对照表:
数据类型 |
占用bit位 |
取值范围 |
缺省默认值 |
byte(字节型) |
1 |
[-128~127] |
0 |
short(短整型) |
2 |
[-32768~32767] |
0 |
int(整型) |
4 |
[-2147483648~2147483647] |
0 |
long(长整型) |
8 |
|
0L |
float(单精度) |
4 |
|
0.0f |
double(双精度) |
8 |
|
0.0 |
boolean(布尔型) |
1 |
true、false |
false |
char(字符型) |
2 |
[0~65535] |
‘\u0000’ |
接下来我们普及一下计算机基本知识,计算机在任何情况下都只能识别二进制,因为计算机毕竟是一台通电的机器,电流只有正极、负极,所以只能表示两种情况,也就是1和0。什么是二进制呢?满2进一位,请看对照表
十进制 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
二进制 |
0 |
1 |
10 |
11 |
100 |
101 |
110 |
111 |
1000 |
1001 |
1010 |
1011 |
十进制和二进制之间的转换规则:
● 十进制转换成二进制:比方说十进制数65转换成二进制代码,我们可以使用短除法,65对2整除商32余数为1,把1写在旁边,接着32对2整除商16余数为0,把0写在旁边,用16整除2商0余数为0,把0写在旁边,这样进行下去直至商为0时为止。然后把余数逆序排列就得到了65的二进制代码。
● 二进制转换成十进制:比方说二进制代码为1000001的十进制数是多少呢?可以采用按权相加的方法,对于二进制代码1000001首先从右边第一位起对应2的零次方,第二位对应2的一次方,以此类推,把相应的数位与权值相乘得到的积相加即可,即2^0*1+0*2^1+0*2^2+0*2^3+0*2^4+0*2^5+1*2^6=65
接下来我们来看一下byte类型的取值范围:首先byte属于字节型,占用空间大小是1个字节byte,1个byte是8个bit位,二进制位中的一个1或者一个0就是一个bit位,而java中的数字有正负之分,二进制位中最左边的数字表示符号位,0表示正数,1表示负数,所以byte类型最大值是:01111111,将这个二进制位转换为十进制是:127。byte类型最小值是-128,也就是说1个字节可以表示256种不同形式。另外还需要给大家普及一下计算机的容量换算单位:
1byte = 8bit
1KB = 1024byte
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
对于以上的八种基本数据类型来说,其中七种类型byte,short,int,long,float,double,boolean计算机表示起来是很容易的,因为这七种类型底层直接就是数字,十进制的数字和二进制之间有固定的转换规则,其中boolean类型只有true和false,而true底层实际上是1,false底层实际上是0。除了以上的七种数据类型之外,还有一种类型叫做字符型char,这个对于计算机来说表示起来就不是那么容易了,因为字符毕竟是现实世界当中的文字,计算机是如何表示文字的呢?
起初的计算机实际上只支持数字的,因为计算机起初就是为了科学计算,随着计算机的发展,为了让计算机起到更大的作用,因此我们需要让计算机支持现实世界当中的文字,这个时候某个标准协会就制定了字符编码(字符集),字符编码就是一张对照表,在这个对照表上描述了某个文字与二进制之间的转换关系。
最初的时候美国标准协会制定了ASCII码,ASCII码采用1个字节编码,大家是否还记得1个字节可以表示256种不同的形式,对于美国来说这个足够了,因为英文单词就是由26个英文字母拼凑而成,大小写全部才52个,再加上标点符号也不会超过256个。ASCII码中规定’a’对应97,’b’对应98,以此类推,’A’对应65,’B’对应66,以此类推,’0’字符对应48,’1’字符对应49,以此类推,这些常见的编码还是需要大家记住的。
什么是编码?什么是解码?我们拿’a’来解释:
● ‘a’ ----(以ASCII字符集进行编码)----> 01100001
● 01100001----(以ASCII字符集进行解码)----> ‘a’
大家一定要注意:编码和解码要采用同一种字符编码方式(要采用同一个对照表),不然会出现乱码。
随着计算机的不断发展,为了让计算机支持更多国家的语言,国际标准组织又制定了ISO-8859-1字符集,又被称为latin-1,向上兼容ASCII码,仍不支持中文,主要支持西欧语言。
当计算机发展到亚洲的时候,计算机开始支持简体中文、繁体中文、日本语、朝鲜语等,其中支持简体中文的字符集包括:GB2312 < GBK < GB18030,它们的容量大小不同。支持繁体中文的大五码Big5等。
后来,国际组织制定了一种字符编码方式,叫做Unicode编码,这种编码方式统一了全球所有国家的文字,具体的实现包括:UTF-8,UTF-16,UTF-32等。
java为了国际化,为了支持所有国家的语言,所以java采用的编码方式为Unicode编码。例如’中’对应的Unicode码是’\u4e2d’。在实际开发中几乎所有的团队都会使用Unicode编码方式,因为这种方式更通用,兼容性更好。