为什么要设计八种基本数据类型?
答: 因为这几种类型无论在哪种业务里面,使用频率都是相当高的,如果仍旧按照一般对象来放在堆内存,会增加很多管理成本以及占用更多内存。所以设计了八种基本数据类型,它们一般的对象不一样,它是存储在栈内存的数据,会随着栈的消失而消失。这样做的目的就是为了减少内存占用。
一图记下八种基本类型:
整型的取值范围
每一个字节有个8个比特,每个类型的存储比特为:字节×8=n;
则该整型的取值范围为:
-2^(n-1)~2^(n-1)-1。
范围溢出:
当存储的数值超过该类型的上限或低于下限时,数值会溢出,且不会报错,如:
int i = Integer.MAX_VALUE;
int j = Integer.MAX_VALUE;
int k = i + j;
System.out.println("i (" + i + ") + j (" + j + ") = k (" + k + ")");
输出结果:i (2147483647) + j (2147483647) = k (-2)
浮点数
什么是浮点数?一种用近似值表示小数的方式,IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。 其中最常用的就是32位单精度浮点数和64位双精度浮点数。
包装类型
为什么需要包装类型?
java是面向对象的语言,而基本类型却不是面向对象的,为了使基本类型也具备面向对象的特性,加入了基本类型的包装类给开发者自由选择。
拆箱与装箱
基本数据类型和包装类之间的转换; 装箱:基本类型——>包装类型; 拆箱:包装类型——>基本类型。 在 Java SE5 中,为了减少开发人员的工作,Java 提供了自动拆箱与自动装箱功能。
自动装箱与自动拆箱的实现原理
输入测试代码
public static void main(String[]args){
Integer integer=1; //装箱
int i=integer; //拆箱
}
编译后
public static void main(String[]args){
Integer integer=Integer.valueOf(1);
int i=integer.intValue();
}
结论: 自动装箱都是通过包装类的 valueOf() 方法来实现的.自动拆箱都是通过包装类对象的 xxxValue() 来实现的。
缓存机制
输入测试代码
Integer integer1 = 3;
Integer integer2 = 3;
if (integer1 == integer2)
System.out.println("integer1 == integer2");
else
System.out.println("integer1 != integer2");
Integer integer3 = 300;
Integer integer4 = 300;
if (integer3 == integer4)
System.out.println("integer3 == integer4");
else
System.out.println("integer3 != integer4");
输出结果为: integer1 == integer2
integer3 != integer4
1等于2,3却不等于4,为什么?
答:
Java 5中,在Integer的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。
适用于整数值区间-128 至 +127。 只适用于自动装箱。使用构造函数创建对象不适用。
valueOf会先去缓存查找时候存在等值的对象,如果有则直接引用,如果没有才创建一个新对象。 ** 这种缓存行为不仅适用于Integer对象。针对所有的整数类型的类都有类似的缓存机制。 **