8 种基本类型的包装类和常量池

包装类常量池

Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;前面 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True Or False。如果超出对应范围仍然会去创建新的对象。

两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。

Integer 源码

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

示例:

        Integer a = 127;
        Integer b = 127;

        Integer c = 128;
        Integer d = 128;

        Integer e = new Integer(127);
        Integer f = new Integer(127);

        System.out.println(a == b); // true
        System.out.println(c == d); // false
        System.out.println(e == f); // false

		Double m = 1.0;
        Double n = 1.0;
        System.out.println(m == n); // false

Integer a = 127;Java 在编译的时候会直接将代码封装成 Integer a = Integer.valueOf(127),从而使用常量池中的对象。Integer e = new Integer(127);这种情况下会创建新的对象

自动装箱与拆箱

		Integer a = new Integer(50);
        Integer b = new Integer(40);
        Integer c = new Integer(10);

        System.out.println(a == b + c); // true

因为 + 这个操作符不适用于 Integer 对象,首先 b 和 c 进行自动拆箱操作,进行数值相加,即 a == 40。然后 Integer 对象无法与数值进行直接比较,所以 a 自动拆箱转为 int 值 50,最终这条语句转为 50 == 50 进行数值比较。

发布了42 篇原创文章 · 获赞 11 · 访问量 3812

猜你喜欢

转载自blog.csdn.net/weixin_44584387/article/details/104656135
今日推荐