基本数据类型
类型 | 字节数 | 取值范围 |
---|---|---|
byte | 1 | −27 − 2 7 到 27−1 2 7 − 1 |
short | 2 | −215 − 2 1 5 到 215−1 2 1 5 − 1 |
int | 4 | −231 − 2 3 1 到 231−1 2 3 1 − 1 |
long | 8 | −263 − 2 6 3 到 263−1 2 6 3 − 1 |
char | 2 | \u0000~\uFFFF |
float | 4 | 小数 |
double | 8 | 范围更大,精度更高 |
boolean | 1 | 前七位是0 |
注意:而然,在实际的开发过程中,Double.valueOf(String) 和Float.valueOf(String)会丢失精度。如果我们需要精确计算的结果,则必须使用BigDecimal类来操作!一般项目中都会写一个BigDecimal的工具类,可自行百度。
基本数据和包装类
原因:
- java是面向对象语言,基本数据类型并不是一个具体的类,用包装类可以更好的提现万物基于对象这一理念。
- 集合中的泛型需要基类是Object类型,所以必须有个对象的包装类才能使用
区别:
- 包装类属于引用数据类型,所以它们之间的区别就是基本数据类型和引用数据类型的区别。反应到内存中,基本数据类型的值是存放在栈里面,而包装类的栈存放的是值得地址,值存放在堆内存中。
- 初始值不同,eg: int的初始值为 0 、 boolean的初始值为false 而包装类型的初始值为null
注意:
在java中,Integer,Short,Byte,Character,Long有缓存机制。浮点型没有该机制,大小范围除Character为0-127外其余均为-128–127.
具体举例为:
Integer a1 = 1;
Integer a2 = 1;
Integer b1 = 200;
Integer b2 = 200;
Integer c1 = Integer.valueOf(1);
// Integer c2 = new Integer(1); 官方不推荐这种建对象的方法喔
Integer c2 = Integer.valueOf(1);
Integer d1 = Integer.valueOf(200);
Integer d2 = Integer.valueOf(200);
System.out.println("a1==a2?" + (a1 == a2));//true
System.out.println("b1==b2?" + (b1 == b2));//false
System.out.println("c1==c2?" + (c1 == c2));//false
System.out.println("d1==d2?" + (d1 == d2));//false
可以看到,不同的创建方式也有是否用缓存的区别,大家可以细细体会。