int与Integer 的区别
一 区别:
- int 是基本数据类型,int 变量存储的是数值。
- Integer 是引用数据类型(包装类),实际是一个对象。Integer 存储的是引用对象的地址。
- int 变量不需要实例化就可以使用,Integer 必须实例化才可以使用。
- int 的默认值是 0 ,Integer 的默认值是 null.
Integer a = null;
int b = 0;
存储位置:
对于 int a = 2; int j = 2 ; 内存中发生了怎样的变化?
首先会开辟一个 a 的存储区域,然后再检查 栈中有没有 2 这个值,如果没有,则保存到栈中,然后让 a = 2,接着开辟一个 j 的存储区域,检查站中是否有 2 这个值,有,就直接让 j = 2. 这就是所谓的栈内数据共享。
int 与 integer 所占内存比较:
Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用空间较少。
int 与 integer 的比较:
1.两个 Integer 相比较:为什么同样的值,两次比较会有所不同???
public class IntTest1 {
public static void main(String[] args) {
Integer a = 20;
Integer b = 20;
System.out.println(a == b); // true
Integer c = -1299;
Integer d = -1299;
System.out.println(c == d ); // false
System.out.println(c.equals(d)); //true
Integer f = new Integer(100);
Integer g = new Integer(100);
System.out.println(f == g ); // false
System.out.println(f.equals(g)); // true
}
}
因为 Integer 与 Integer 相比较,数据在 -128 ~ 127 范围内,就会从缓存中拿数据去比较,比较结果就相等;若不在这个范围内,就会直接创建新的一个 Integer 对象,使用 == 判断的是两个内存的应用地址,所以不相等。这是因为 Integer 的缓存机制。
Integer 缓存机制:
在 java5 中,为 Integer 的操作引入了一个新特性,用来节省内存和提高性能。整型对象在内部实现通过使用相同的 对象引用 实现缓存和重用,但是只适用于1.数据在 -128 ~ 127 范围内,2.适用于自动装箱但是不能是使用构造函数创建的对象,这两个条件必须共存。
java 编译器把原始类型数据自动转换成包装类的过程成为自动装箱(autoboxing),这相当于调用 valueOf 方法。
Integer a = 10;
相当于
Integer a = Integer.valueOf(10);
2. int 与 Integer 相比较:
public class IntTest1 {
public static void main(String[] args) {
int a = 20;
Integer b = 20;
System.out.println(a == b); // true
int c = 20;
Integer d = new Integer(20);
System.out.println(c == d); //true
}
}
Integer 自动拆箱: 将 包装类自动转为基本数据类型
int 与 Integer 比较的时候, Integer 会自动拆箱,然后与 int 类型比较。
c == d 相等于 d.intValue() == c.
java 内存分配:
寄存器:程序无法控制,读写最快!
栈:存放局部变量和对象的引用值,而对象本身则放在堆中(自动回收),可数据共享。
堆:程序运行期被动态创建,存放在堆中。手动回收或者系统 gc 自动回收。
静态域: 存放对象中对象的 static 成员。
常量池:存放常量。
使用场景:
对于 int 与 Integer 的使用场景,一般来说若是该最终值必须为0,那么使用 int 类型,若是最终结果属于 null ,那么需要使用 Integer.