从新开始学JAVA - 数据类型6
数据类型
Java的数据类型有两大类
- 基本类型(primitive type)
- 基本类型都属于关键字
- 基本类型的默认值为:
- 整数:
0
- 浮点数:
0.0
- 布尔值:
false
- 整数:
- 引用类型(reference type)
- 类
- 接口
- 数组
- 非基本类型的默认值全部是
null
具体分类
基本类型又可以细分为以下类型
- 数值类型
- 整数类型
- byte
- 占1个字节
- 范围:
-128
~127
(2(-7)~27-1)
- short
- 占2个字节
- 范围:
-32768
~32767
(2(-15)~215-1)
- int
- 占4个字节
- 范围:
-2147483648
~2147483647
(2(-8)~28-1)
- long
- 占8个字节
- 范围:
-9223372036854775808
~9223372036854775807
(2(-63)~263-1) - 因为这个类型数值太大,所以一般如果使用了
long
,则会在数值最后加一个L
或者l
,例如long number = 30L(或者30l);
- byte
- 浮点类型
- float
- 占4个字节
- 一般如果使用了
float
,则会在数值最后加一个F
或者f
,例如float number = 50.1F(或者50.1f);
- double
- 占8个字节
- float
- 字符类型
- char
- 占2个字节
- 注意这里是字符,不是字符串,所以只能一个字符,例如
char name = 'a';
,如果是char name = 'ab';
那么就会报错。中文则是一个字就可以,两个或者以上的字就不行。符号则是一个符号就可以,两个或者以上就报错,例如char name = '+';
就可以 - 字符串(
String
)是一个类,不是基本类型,也不是关键字,属于引用类型 char
使用单引号'
,String
使用双引号"
- char
- 整数类型
- 布尔类型(boolean)
- 占1位(1 bit),因为其数值只有
true
和false
- 占1位(1 bit),因为其数值只有
补充
- 所有的基本类型名字都是小写字母,所有的其他类型名字都是首字母大写,例如
char
,String
- 有一些基本类型会有对应的封装类,例如
Boolean
就是基本类型boolean
的封装类,具有属性和方法,是基本类型的实例化对象- 基本类型都不可以用
new
来声明或者初始化,但其他类型的类可以,例如Boolean flag = new Boolean("true");
,但不能boolean flag = new boolean("true");
- 基本类型都不可以用
- 位(bit):是计算机内部数据储存中最小单位,1位就能存储计算机语言中的一个
0
或者1
。例如11001100
是一个八位二进制数。一般用b
表示 - 字节(byte):1个byte(字节)即为8个bit(位),是计算机中处理数据的基本单位,一般用
B
表示。1B = 8b
- 电脑参数中经常提到的32位系统、64位系统,指的就是计算机的CPU单次可以处理数据的量,64位电脑表示该电脑单次可以处理8B(8byte,即64bit)的数据。高位电脑可以向下兼容(安装32位的软件、系统),但低位电脑不能向上兼容。主要区别如下
- 寻址能力不同:寻址能力简单点说就是支持的内存大小能力,64位系统最多可以支达128 GB的内存,而32位系统最多只可以支持4G内存
- 运算速度不同: 32位处理器一次只能处理4个字节的量,而64位一次可以提取64位数据,也就是8个字节的量,比32位提高了1倍
- 兼容性不同:32位操作系统只可以安装使用32位架构设计的软件,而64位的CPU既可以安装使用32位软件也可以安装使用64位软件
- 上面的整数类型中,byte占用1个字节,即8bit,所以系统会分配8个位置来储存这个数(例如00000001、01010010)。而计算机中,我们规定首位为符号位,即1代表负数,0代表正数,所以实际上只有7个位置来表达这个数的大小,所以范围是-128~127(2(-7)~27-1)。同理,short占2个字节,所以系统分配了16个位置来储存,而首位是符号位,所以数的大小的范围是-32768~32767(2(-15)~215-1)
- 因为
0
这个数在二进制中是0000
,但因为计算机规定了首位是符号位,所以就算我们人为定义0
既不是正数,也不是负数,但在计算机中,0000
的首位是0
,其实是占用了正数的一个位置的,所以计算范围时,正数要比负数少1。例如,-2~2,中间其实有5个数,-2,-1,0,1,2。而因为是二进制,所以范围大小都是2的倍数,所以只能取-2,-1,0,1 - 进制
- 二进制
- 以
0b
开头,例如0b11
代表0000 0011
,即3
- 以
- 十进制
- 八进制
- 以
0
开头 int number = 010;
,输出结果为8
- 注意,因为是八进制,所以数字
8
和9
是不可使用的,会报错Integer number too large
。也就是说在八进制中,数值0
~7
的表示是00
~07
,而8
则直接变成010
,同理,数值9
~15
的表示是011
~017
,而16
则直接变成020
- 以
- 十六进制
- 以
0x
开头 - 用
a
~f
来表示10
~15
,例如int number = 0xa
,输出结果为10
- 计算方法:例如
int number = 0xa30f
,则10(即a) * 16^3 + 3 * 16^2 + 0 * 16^1 + 15(即f) * 16^0 = 41743
- 以
- 二进制
- 浮点数
- 采用
IEEE 754
标准 - 详细解释
- 浮点数占4个字节,即32位,
IEEE 754
标准规定:- 首位为符号位,0表示正数,1表示负数
- 第2-9位表示指数
- 最后23位表示小数
- 浮点数的数值有舍入误差,所以千万不要用浮点数进行比较
- 可以使用
BigDecimal
(一个数学工具类)来进行比较(应用于银行业务)
- 采用
- 字符
- 字符的本质还是数字,所有的字符都可以被强制转换成数字
- Java的默认编码是
Unicode
,可以表达从0到65536(216)的数字,每个数字被规定好,表示不同的字符Unicode
采用十六进制,范围从U0000
到UFFFF
- 十六进制中,
F
或者f
代表15,所以UFFFF
即为15 * 16^3 + 15 * 16^2 + 15 * 16^1 + 15 * 16^0 = 65536
- 其他的编码还有
ASCII
,以及Unicode
拓展出来的UTF-8
,UTF-16
等 - 详细解释
- 转义字符(Escape Character)
\u
代表使用Unicode
,例如System.out.println('\u0061')
会输出Unicode
表格中数字97
代表的字符(因为是十六进制,计算方法如上),即a
\t
代表Tab
\n
代表换行
- 基本类型的大小
byte
(1字节)<short
(2字节)=char
(2字节)<int
(4字节)<long
(8字节)<float
(4字节)<double
(8字节)- 浮点数的范围大于整数,因为浮点数采用指数存放,具体可以看上方的链接
- 在基本类型的相互转换中,从大转换为小是自动转换,从小转换为大是强制转换,并且容易出现内存溢出