在进行编程时,往往需要定义变量来存储值,而内存管理系统会根据存储变量的类型为变量分配存储空间,分配的存储空间只能用来存储该类型数据。
可以理解为数据类型是用来划分存储空间的大小。
Java是一种强类型语言,则必须为每一种变量声明一种类型。
Java两大数据类型:
- 基本数据类型
- 引用数据类型
分类图如下:
基本数据类型
Java内置了八大基本数据类型。四类八种:整型四种,浮点型两种,布尔型一种,字符型一种。
基本类型表格对比如下:
数据类型 | 字节,位数 | 默认值 | 最小值 | 最大值 | 包装类 |
---|---|---|---|---|---|
byte(字节型) | 1,8 | 0 | -128(-2^7) | 127(2^7-1) | Byte |
short(短整型) | 2,16 | 0 | -32768(-2^15) | 32767(2^15 - 1) | Short |
int(整型) | 4,32 | 0 | -2,147,483,648(-2^31) | 2,147,483,647(2^31 - 1) | Integer |
long(长整型) | 8,64 | 0L | -9,223,372,036,854,775,808(-2^63) | 9,223,372,036,854,775,807(2^63 -1) | Long |
float(单精度字符型) | 4,32 | 0.0f | 1.4E-45 | 3.4028235E38 | Float |
double(双精度字符型) | 8,64 | 0.0d | 4.9E-324 | 1.7976931348623157E308 | Double |
boolean(布尔型) | 1,8 | false | false | true | Boolean |
char(字符型) | 2,16 | ‘u0000’ | 0(u0000) | 65535(uFFFF) | Character |
在计算机中,数据是以二进制位数来存储,1字节等于8位。
float和double的最小值和最大值都是以科学记数法的形式输出的,结尾的"E+数字"表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14 × 103 =3140,3.14E-3 就是 3.14 x 10-3 =0.00314。
实际上,JAVA中还存在另外一种基本类型 void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。
整型
在Java中,一般整型变量默认位 int 类型。
-
byte
byte类型作为最小数字来处理,占一个字节8位的二进制数,最高位 为符号位,以二进制补码表示整数。
byte运算规则:
正数的最高位都是 0,正数的值就是二进制表示的值。
负数的最高位都是 1,负数的值是取反后再加1,然后加个负号得到的值。例如:
- 8位二进制数 01111111
最高位为0表示正数,那么转换成十进制就是 127。 - 8位二进制数 10000000
最高位为1表示负数,取反之后得到 01111111,转换成十进制就是127,再加1得到128,加个负号得到-128。
所以byte的取值范围为 [-128,127]。
使用:byte b1 = -128; byte b2 = 127;
- 8位二进制数 01111111
-
short
short类型是 2字节16位,有符号的以二进制补码表示的整数。
使用:short s1 = -32768;short s2 = 32767;
-
int
int 类型是4字节32位、有符号的以二进制补码表示的整数。
Java中整型变量默认为 int 类型。
使用:int a = 0;
-
long
long 类型是8字节64 位、有符号的以二进制补码表示的整数。
使用long类型时,数值后面需要加上 l或者L,不然默认位int类型。
使用:long l = 100L;
"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
浮点型
在Java中,浮点数的默认类型为double类型。
-
float
float 数据类型是单精度、4字节32位、符合IEEE 754标准的浮点数。
使用float类型时,数值后面需要加上 f或F,不然默认double类型。
使用:float f = 10.0L;
-
double
double 数据类型是双精度、8字节64 位、符合IEEE 754标准的浮点数。
Java中浮点数的默认类型为double类型。
使用:double d = 10.0;
布尔型
-
boolean
boolean数据类型表示一位的信息。
只有两个取值:true 和 false,用来逻辑判断。
使用:boolean b1 = false; boolean b2 = true;
字符型
-
char
char类型是一个单一的 16 位 Unicode 字符,占两个字节16位。
使用:char c = ‘A’;
Java中获取基本数据类型的取值范围
Java中除布尔类型外,其它基本数据类型的取值范围的值、位数大小都以常量的形式定义在对应的包装类中
以 byte 类型为例:
byte 类型对应的包装类为 Byte
如下图:
Java中代码获取如下:
public class Test {
public static void main(String[] args) {
System.out.println(Byte.MIN_VALUE); //获取最小值
System.out.println(Byte.MAX_VALUE); //获取最大值
System.out.println(Byte.SIZE); //获取位数
}
}
运行:
-128
127
8
说下我当时是怎么记各个类型的字节大小
把下面两行念五遍:
byte short int long float double boolean char
1 2 4 8 4 8 1 2
引用数据类型
Java中的数组(array),类(class),接口(interface)都是引用数据类型。引用类型指向一个对象,指向对象的变量是引用变量。
例如:
运行:
null
引用类型的默认值为 null。
一个引用变量可以用来引用任何与之兼容的类型。
类型转换
在Java中进行混合运算时,不同类型的数据需要转换为同一类型,然后进行运算。
转换规则:
1、不能对boolean类型进行类型转换
2、不能把对象类型转换成不相关类的对象。
3、在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
4、转换过程中可能导致溢出或损失精度。
5、浮点数到小数的转换是通过舍弃小数得到的。
-
自动类型转换
自动类型转换必须满足转换前的数据类型大小必须低于转换后的数据类型。
下图为数值之间的转换:
图片来源于《Java核心技术卷I》箭头指向表示小类型向大类型自动转换,虚线箭头表示转换时可能精度损失。
其中,int类型与char类型之间是通过 ASCll 转换的
int与char 转换如下:
public class Test {
public static void main(String[] args) {
char c = 'A'; //定义一个 char 类型
int n = c; //c会根据 ASCll 表自动转换转换成数字(ASCll表上:字符A 对应的值是 65)
System.out.println("转换后的值:" + n); //输出n
// int类型与char类型运算时发生自动类型转换
System.out.println("int类型与char类型运算:n+c=" + (n + c) );
//n与c相加时,char类型 c 会转换成int类型,转换之后会是 65 + 65 = 130;
}
}
运行如下:
转换后的值:65
int类型与char类型运算:n+c=130
-
强制类型转换
在运算中,如需要将大类型值转换成小类型值需要使用强制类型转换。
格式:(type)value 其中,value是需要转换的值,type是转换后的类型
例如:
public class Test {
public static void main(String[] args) {
int n = 128; //定义一个int类型数据
byte b = (byte) n; //int强制类型转换为byte类型
}
}
强制类型转换过程中可能会精度损失。
什么时候会精度损失呢?
当大类型值转换成小类型值时,如果转换的值的大小不在转换后类型的取值范围内,则会发生精度损失。
如上面例子:int类型数值为128,byte类型取值范围为[-128,127],128不在这个范围内,转换后会发生精度损 失
精度损失会产生什么后果?
如上面例子,int类型的数值128 强制转换成byte类型过程如下:
int类型占16位,128转换成二进制值为:0000 0000 1000 0000
byte类型占8位,int类型转换为byte类型会去掉后面8位
得到:1000 0000
最后按照Java中byte类型运算规则 转换成十进制
结果为-128。
大数值的使用
在Java中,如果使用的数值超过了 整数型,浮点型的范围,则可以使用大数值。
java.math 包中的 BigDecimal和BigInteger 类。
BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。
在使用大数值运算时,不能使用 “+ - * /”等运算符,需要使用大数值类中的方式进行运算。
以BigInteger 为例:
public class Test {
public static void main(String[] args) {
BigInteger a = BigInteger.valueOf(10); //需要用valueOf方法把普通数值转换成大数值
BigInteger b = BigInteger.valueOf(20);
System.out.println("和" + a.add(b)); //加法运算
System.out.println("差" + a.subtract(b)); //减法运算
System.out.println("积" + a.multiply(b)); //乘法运算
System.out.println("商" + a.divide(b)); //除法运算
System.out.println("余数" + a.mod(b)); //取余
}
}
运行如下:
和30
差-10
积200
商0
余数10
b = BigInteger.valueOf(20);
System.out.println("和" + a.add(b)); //加法运算
System.out.println("差" + a.subtract(b)); //减法运算
System.out.println("积" + a.multiply(b)); //乘法运算
System.out.println("商" + a.divide(b)); //除法运算
System.out.println("余数" + a.mod(b)); //取余
}
}
运行如下:
```java
和30
差-10
积200
商0
余数10
——THE END——