想想 Integer 128 这个东东

原创
2017/03/14 10:51
阅读数 158

简单粗暴,用代码说话

public class TestSubstring {

	public static void main(String[] args) {


		/**compare Integer when Integer >=-128 and Integer<=127***/
		Integer s1 = 127;
		Integer s2 = 127;
		System.out.println("s1 == s2:"+(s1==s2));
		System.out.println("s1.equals(s2):"+(s1.equals(s2)));
		System.out.println("\r");
		/**compare Integer when Integer <-128 and Integer>127***/
		Integer s3 = 128;
		Integer s4 = 128;
		System.out.println("s3 == s4:"+(s3==s4));
		System.out.println("s3.equals(s4):"+(s3.equals(s4)));
	}
}

结果输出为 输入图片说明

以上代码第一段和第二段旨在说明:在-128~127的Integer值并且以Integer x = value;的方式赋值的Integer值在进行==和equals比较时,都会返回true,因为Java里面对处在在-128~127之间的Integer值,用的是原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行==比较时只是进行int原生数据类型的数值比较,而超出-128~127的范围,进行==比较时是进行地址及数值比较。

进入 JDK 查看源码

    /**
     * Returns a <tt>Integer</tt> instance representing the specified
     * <tt>int</tt> value.
     * If a new <tt>Integer</tt> instance is not required, this method
     * should generally be used in preference to the constructor
     * {@link #Integer(int)}, as this method is likely to yield
     * significantly better space and time performance by caching
     * frequently requested values.
     *
     * @param  i an <code>int</code> value.
     * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
     * @since  1.5
     */
    public static Integer valueOf(int i) {
	final int offset = 128;
	if (i >= -128 && i <= 127) { // must cache 
	    return IntegerCache.cache[i + offset];
	}
        return new Integer(i);
    }
    private static class IntegerCache {
	private IntegerCache(){}

	static final Integer cache[] = new Integer[-(-128) + 127 + 1];

	static {
	    for(int i = 0; i < cache.length; i++)
		cache[i] = new Integer(i - 128);
	}
    }

这儿的IntegerCache有一个静态的Integer数组,在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中,一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。如果超过这个值范围,就会 return new Integer(i) ,所以 我们在处理 Integer 类型 是否相等 时 最好用 equals 去比较 以免出现 不必要的麻烦,要不 就直接 转为 int 类型 再去做比较。。。。

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部