0
点赞
收藏
分享

微信扫一扫

Java 包装类(Integer等)的详细介绍

whiteMu 2022-03-12 阅读 42
java

什么是包装类

Java是一个面向对象的编程语言,但是Java中的八种基本数据类型却是不面向对象的,为了使用方便和解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八种基本数据类型对应的类统称为包装类(Wrapper Class),包装类均位于java.lang包。

八种基本数据类型与包装类的对应关系

基本数据类型包装类
bytejava.lang.Byte
shortjava.lang.Short
intjava.lang.Integer
longjava.lang.Long
floatjava.lang.Float
doublejava.lang.Double
booleanjava.lang.Boolean
charjava.lang.Character

基本数据类型与其对应包装类的区别

  1. 数据类型不同

    一个是基本数据类型,一个是引用数据类型

  2. 存储位置不同

    基本数据类型直接将数据保存在栈中,包装类直接将数据保存在堆中

  3. null的处理不同

    基本数据类型不能赋空值,包装类可以赋空值

  4. 初始值不同

    在基本数据类型中,整数类型的初始值是0,小数类型的初始值是0.1,boolean类型的初始值是false,char类型的初始值是’’(空字符)
    在包装类中,所有类型的初始值都为null

给包装类赋值的方式

// 方式一
Integer integer1 = new Integer(10);
// 方式二
Integer integer2 = Integer.valueOf(10);
// 方式三
Integer integer3 = 10;

装箱与拆箱

装箱:指将基本数据类型转换为包装类对象
拆箱:指将包装类对象转换为基本数据类型

// 手动装箱
Integer integer = Integer.valueOf(10);
// 手动拆箱
int i = integer.intValue();
// 自动装箱(等同于Integer.valueOf(10))
Integer integer = 10;
// 自动拆箱(等同于integer.intValue())
int i = integer;

包装类的缓存问题

示例一

Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1 == integer2);

运行结果

false

Process finished with exit code 0

这个很容易解释,integer1 和 integer2 是两个不同的示例,比较地址自然是不相等。

示例二

Integer integer3 = Integer.valueOf(127);
Integer integer4 = Integer.valueOf(127);
System.out.println(integer3 == integer4);

运行结果

true

Process finished with exit code 0

这是为什么呢???
查看源码后发现,原来当数值大于等于IntegerCache.low和小于等于IntegerCache.high时是从缓存数组中取得值;

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

那么IntegerCache.low和IntegerCache.high是多少?缓存数组又在哪里初始化的呢?

private static class IntegerCache {
	// IntegerCache.low的值
    static final int low = -128;
    static final int high;
    static final Integer cache[];
    static {
        int h = 127;
        String integerCacheHighPropValue =
            VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
            }
        }
        // IntegerCache.high的值为h=127
        high = h;
        cache = new Integer[(high - low) + 1];
        int j = low;
        // 给缓存数组赋值
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
        assert IntegerCache.high >= 127;
    }
    private IntegerCache() {}
}

可用一段代码来简单验证

Integer integer3 = Integer.valueOf(127);
Integer integer4 = Integer.valueOf(127);
System.out.println(integer3 == integer4);

Integer integer5 = Integer.valueOf(128);
Integer integer6 = Integer.valueOf(128);
System.out.println(integer5 == integer6);

Integer integer7 = Integer.valueOf(-128);
Integer integer8 = Integer.valueOf(-128);
System.out.println(integer7 == integer8);

Integer integer9 = Integer.valueOf(-129);
Integer integer10 = Integer.valueOf(-129);
System.out.println(integer9 == integer10);

运行结果

true
false
true
false

Process finished with exit code 0
举报

相关推荐

0 条评论