欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Integer包装类的种种

程序员文章站 2024-03-07 13:26:33
...

Integer包装类的种种

Integer的构造方法

	>Integer i=new Integer(String s);
	>Integer i1=new Integer(int i);

s必须为数字字符串
Integer i2=1; //自动装箱底层用了new Integer(i)

不论是自动装箱底层调用new Integer(int i),还是直接new Integer(int i).
底层都会调用valueOf(Int i) 方法,并不只是每次创建对象都在堆内存里创建对象那么简单,为什么包装不同的数,以下代码的结果不同呢?

public class MyInteger {
	public static void main(String[] args) {
		Integer i1=new Integer(1);
		Integer i2=1;
		System.out.println(i1==i2);    //true
		Integer i3=128;
		Integer i4=128;
		System.out.println(i3==i4);   	//false
	}
}

这可能就要看看valueOf的源码了

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

从源码中可以发现传入的int会被检测在不在一个范围内,这个范围就是-128~127
如果满足这个条件会直接得到一个从数组中取出来的Integer对象,所以地址是相同的,而当不在这个范围的数传入的时候,就每调用一次创建一个对象,对于引用数据类型==是比较地址值的所以结果为false;

相关标签: Integer