为了避免内存浪费,JAVA将数据类型分为两大类:基本数据类型和引用类型,这两大类中又细分了很多,具体如下。
基本数据类型:
基本数据类型主要分为整型、浮点型、字符型、布尔型:
需要提前了解的知识:
(一个字节等于8位)
(字节是计算机数据处理的基本单位)
(计算机中存储数据的最小单位:位bit(比特),存放一位二进制数,即0或1)
(存储容量的基本单位还有:bit、B、KB、mb、GB、TB、PB、EB、ZB、YB、BB、NB、DB)
- 整型:
整型又分为:
(1)字节型(byte):
byte类型占用1个字节(8位)既有效范围为-128~127,(在Java中byte类型占8位,表示的范围是 (-2 ^ 7 ~ 2 ^ 7 - 1) 总共256个 (byte类型占一个字节,即8位,所以是二的8次方个(0 000 0000)但是第一个零是符号位,0为正,1为负,又因为在0到127之间有个零而在负128到0之间还有个零,所以后面的范围需要减一)
典型易错问题:
如果byte b = (byte)129,则b = -127
原因:
一、强制转换(byte占一个字节,8位,int占4个字节32位);
二、在计算机系统中,数值一律用补码来表示;
(正数:源码 = 反码 = 补码)
(负数:源码 = 反码除了符号位不变其他位取反 、 补码 = 反码+1)
int 类型的129的二进制:00000000 00000000 00000000 100000001
强制转换byte型后,只有一个字节既10000001(从二进制角度看第一位为符号位)
反码为:11111110;补码为11111111;
转换成int型就是-127(1+2+4+8+16+32+64)
(2)短整型(short):
short类型占用2个字节(16位),最大范围为(-2 ^ 15 ~ 2^ 15 - 1)。
(3)整型(int):
int类型占用4个字节(32位),最大表示范围为( -2^ 31 ~ 2^ 31 - 1),默认情况下的整数均为int类型,byte、short、char类型会自动转换成int。
(4)长整型(long):
在表示整数时,如果int类型的范围不够,可以使用long型,一个long型的变量占用8个字节(64位),最大范围为( -2 ^ 63 ~ 2 ^ 63 -1)
注意:long类型的数后面加L(后面的L可以是大写也可以是小写,但是为了好区分最好写成大写的L)
- 浮点型:
浮点型又分为:
(1)单精度型(float):
float类型占用4个字节(32位)
注意:
1、float类型的数字后面都要加f(f可以为大写也可以为小写);
2、float类型在计算的时候会存在精度差;(如:0.1-0.01 !=0.09)
在计算机执行计算的时候,会将10进制数转换成2进制数,然后再讲2进制数转换称成10进制数显示;
十进制小数如何转换为二进制数:
十进制是乘以2直到没有小数为止。如:0.9表示为二进制
0.92 * 2 = 1.8 取整数部分 1
0.8 (1.8的小数部分) * 2 = 1.6取整数部分 1
0.6 * 2 = 1.2取整数部分 1
0.2 * 2 = 0.4 取整数部分 0
0.4 * 2 = 0.8 取整数部分 0
0.8 * 2 = 1.6 取整数部分 1
……
0.9二进制表示为(从上往下):111001
总之就是取不尽,所以在计算的时候float和double存在一定的精度差。
通常会这样解决:
public static void main(String[] args) {
float a = 1.34f;
float b = 1.35f;
float c = 0.01f;
//(输出小数点后N位小数(小数点后的数为多少输出几位小数,在精度允许的情况下)如:
System.out.println("%.5f"a);
// 输出为1.34000)(float最大输出六位小数)
//if(a-b==c)(错误) 结果为false 因为浮点型数据在存储和运算过程中有误差a-b!=c
if (b-a-c>-0.000001 && b-a-c<0.000001)
System.out.println("浮点数相等");
else
System.out.println("浮点数不相等");
}
(2)双精度型(double):
double类型占用8个字节(64位),默认的小数均为double类型。
- 字符型(char)
Java中char类型占用2个字节(16位)
Java中char类型的字符为什么可以保存一个汉字而C语言却不可以?
C语言中使用的是ASCII编码,所以C语言中字符型分配一个字节空间;Java使用的是Unicode编码( unicode编码就是类似’\uxxxx’ 4位十六进制数(如:窦的unicode码是"\u7aa6")),所以Java分配两个字节(Java中字符型可以为一个汉字,因为一个汉字正好占两个字节的内存);
注意:字符型的值是被单引号包起来的一个任意字符(有且只有一个)。
- 布尔型(boolean)
Java规范中并没有明确指出Boolean类型占用的内存大小,但是由于Boolean类型仅仅有两个值,true 和false,所以一般只需要1bit(就够了)。boolean型不能和任何一种类型的数据类型转换,强制转换也不行。
基本类型间的转换:
java中的类型转换有两种强制转换和自动转换;
自动转换
也叫 “ 隐式类型转换 ” 由低精度向高精度转换,一般在运算的过程中结果都保留为最高精度的值;
如:
int a = 10 ;
double b = 20.2;
System.out.println(a+b);
//输入的值为double类型的30.2;
基本数据类型精度表:
byte ——》short 、char ——》int ——》 long ——》 float ——》 double
注意:
byte short char不会自动相互转换;都会自动转换为int类型进行运算。
boolean类型不能和其他的类型相互转换。(即使强制转换也不行)
强制转换
也叫 “ 显示类型转换 ”由高精度向低精度转换,存在数据丢失或溢出的问题;
如:
int a ;
double b = 10.01;
a = (int)b;
a = 10;
引用类型:
我们常接触的引用类型有,数组、类、接口(interface)、还有枚举(enum),注解(@interface)等。后面将一一讲解。
默认值:
只有成员变量才会默认赋值(类中定义的变量)
局部变量不会默认赋值(方法中定义的变量)
基本数据类型:
byte: 0
short: 0
int: 0
long: 0L
float: 0.0f
double: 0.0d
char: \u0000 (空,’ ')
boolean: false
引用类型:
所有对象引用类型的默认初始值为null