值类型和引用类型
首先简单回顾一下Java的值类型和引用数据类型:详情请看我的这篇博客
值类型:Java的八种基本数据类型boolean、long、int、short、byte、float、double、char都是值类型,对于值类型变量是直接在内存栈中分配的,栈空间直接存储了它们的值,比如下面的int型变量a和b。
引用类型:Java引用类型继承于Object类,像八种基本数据类型的包装类,以及我们自定义的类都属于引用类型。对于&引用类型变量的空间分配需要使用到栈和堆,首先在栈中分配“引用”,然后在堆中存储对象本身的值。
我们知道Java中的"=="是直接比较内存地址的。因此,对于下面的代码,我们很容易知道a == b,i1 == i2分别为true,false。然而i3 == i4却返回了true,这是为什么呢?这其实是Java的缓存机制。
int a = 1;
int b = 1;
Integer i1 = 128;
Integer i2 = 128;
Integer i3 = 127;
Integer i4 = 127;
System.out.println(a == b);
System.out.println(i1 == i2);
System.out.println(i3 == i4);
缓存机制
Integer类
Java为了使得八种基本数据类型具有面向对象的性质,增添了其相应的包装类。而装箱、拆箱则是为了方便它们之间的互相转化,jdk1.5后,编译器实现了自动装箱和拆箱。
装箱:基本类型封装为包装类型。自动装箱(通过valueOf方法实现),比如Integer i1 = 128;
拆箱:包装类型简化为基本类型。自动拆箱(通过xxvalue方法实现),比如int a = new Integer(100);