java中只有8种基本数据类型,除了这8种,其余的都是引用类型。
分类:
第一类:逻辑型 boolean
第二类: 整型 byte short int long
第三类:字符型 char
第四类:浮点型 float double
基本数据类型在栈中可以直接分配内存,引用类型是数据的引用在栈中,但是它的对象在堆中。
占用字节:
boolean: 1/8(即1位)
byte: 1
char: 2
shot: 2
int: 4
float: 4
double: 8
long:8
java中默认的整数是int型,要想定义为long型,要在数值后加l或L; 默认的浮点型是double,要想定义为float,要在数值后加f或F。
基本数据类型自动转换时,小可转大,大转小需要强转,会失去r精度。
基本数据类型与包装器类的区别:
包装器类继承Object, 可以重写equals,hashcode等Object里的方法;可以为null; 包装器类的对象存在堆中,引用存放在栈中, 基本数据类型只存放在栈中。
浮点型(double float)不能表示精确的值,如货币
double类型是8个字节,有效位15位。其中52小数,11位偏指数,1位符号。其中1.1是没有办法用二进制精确表示的。1.1的二进制大约就是这样1.0001100110011001
一直是小数部分一直是1001所以,只能取一个52精度的数近似代替1.1.因此,最终结果肯定会有误差。
同理,任意一个整数都是可以使用二进制精确表示,所以只要不超过精度总可以精确表示,但是小数往往不能使用二进制精确表示。
因此,java引入了一个对象BigDecimal
BigDecimal b1 = new BigDecimal("2.0");
BigDecimal b2 = new BigDecimal("1.1");
System.out.println(b1.subtract(b2));
这样就可以得到精确的0.9.