JAVA四类⼋种基本数据类型
boolean类型
Boolean在内存中占⽤⼀个字节。
当java编译器把java源代码编译为字节码时,会⽤int或byte来表⽰boolean。在java虚拟机中,⽤整数零来表⽰false,⽤任意⼀个⾮零整数表⽰true。
java虚拟机这种底层处理⽅式对java虚拟机是透明的,在java源程序中boolean类型的变量取值只能是true或false
byte、short、int、和long 整数类型
byte、short、int、long都是整数类型,并且是有符号整数分别占⽤1、2、4、8个字节。
取值范围分别是-128—127、-2的15次⽅到2的15次⽅减⼀、-2的31次⽅到2的31次⽅减⼀、-2的63次⽅到2的63次⽅减⼀
byte在内存中占⽤⼀个字节取值范围是 -128—127。在定义⼀个变量时。⽐如⽉份的取值是1到12。因此把代表⽉份的month变量定义为byte类型会节省内存空间。
在实际应⽤中通常把month定义为int类型,因为这样可以简化数据运算时强制类型转换操作。
byte month = 1;
month = month+2;//编译错误需要强转
month = (byte) (month+2); //编译正确
Java中整型常量数值的默认类型是int类型
char 字符类型
char是字符类型占⽤两个字节,java语⾔对字符采⽤Unicode字符编码。由于计算机内存只能存储⼆进制数据。因此必须对各个字符进⾏编码。
所谓字符编码是指⽤⼀串⼆进制数据来表⽰特定的字符。常见的字符编码包括,ASCII编码(1Byte=8bit ⼀共能表⽰2的7次⽅ 128个字符) 是单字节编码系统,ISO-8859-1编码(也是单字节编码系统) GB2312编码 GBK编码 Unicode编码。
Unicode编码由国际Unicode协会编制,收录了全世界所有语⾔⽂字中的字符,是⼀种跨平台的字符编码USC(Universal Character Set)是指采⽤Unicode编码的通⽤字符集。
如果实际上要存储的字节都是ASCII字符(只占7位),采⽤Unicode编码及其浪费存储空间。UTF-8编码能够更加有效的利⽤存储空间,它对ASCII字符采⽤⼀个字节形式的编码,对⾮ASCII字符则采⽤两个或两个以上字节形式的编码。
Unicode有两种编码⽅案。
  ⽤两个字节(16位)编码,采⽤这个编码⽅案的字符集称为UCS-2。java语⾔采⽤的就是两个字节的编码⽅案
  ⽤四个字节(32位)编码(实际上只⽤了31位,最⾼位必须为0),采⽤这个编码的字符集被称为UCS-4。
1994年公布的Unicode,为每种语⾳中的每个字符都设定了唯⼀编码,以满⾜跨语⾔的交流,分为编码⽅式和实现⽅式。
实现Unicode的编码格式有UTF编码。可以理解为对Unicode的压缩⽅式,常见的UTF编码有 utf-8,utf-7,utf-16
有些操作系统不完全⽀持16位或32位的Unicode编码,UTF(UnicodeTransformation Format) 编码能够把Unicode编码转换为操作系统⽀持的编码。
ASCII编码,ISO-8859-1编码 GB2312编码 GBK编码 Unicode编码都属于编码⽅式,UTF属于实现⽅式(实现Unicode编码)。
float和double 浮点类型(带⼩数)
float:占四个字节,共32位,称为单精度浮点数
double:占⼋个字节,共64位,称为双精度浮点数
Java中的浮点型常量数值默认是double类型
注意: java提供的浮点类型不适合进⾏精确的运算java语言使用的字符码集是
public static void main(String[] args) throws Exception {
double money = 1;
double price = 0.1;
System.out.println(money-price*9);//打印出来0.09999999999999998(本应该是0.1)
}
解决办法: java.math.BigDecimal类可以满⾜⽤户的精度注意构造BigDecimal类时构造⽅法中的参数不建议是浮点类型需要转成String类型
基本数据类型转换
上⾯四类⼋种基本数据类型。除了boolean类型。整型浮点型和字符型数据可以进⾏混合转换。
从低位到⾼位会⾃动进⾏类型转换,即int类型的数和Long类型的数⼀起运算时结果会⾃动转成Long类型(向上转型)
从⾼位到低位需要进⾏强制类型转换。(向下转型)
从低位到⾼位 byte、char、short、int、long、float、double
  float f = 3.14; //编译错误,不能把double类型直接赋值给float类型变量需要强制类型转换
  应⽤中,强制类型转换有可能会导致数据溢出或者精度下降,应该避免使⽤强制类型转换。
  下⾯代码中把int强制转换为byte类型,会导致数据溢出。
    int a = 256;
    byte aa = (byte) a;
    int b = 222;
    byte bb = (byte) b;
    System.out.println(aa); // 打印结果0
    System.out.println(bb); //打印结果-34
对于基本类型的变量,java虚拟机会为其分配数据类型实际占⽤内存的⼤⼩