JAVA包装类

JAVA包装类

    Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在
    很多不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和
    基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。

    包装类主要进行基本类型与对象之间进行转,还有一些其他的常用方法。

包装类常量池(cache[])

在包装类中,Byte,Character,Integer,Short,Long都实现了常量池。

Character cache:[0,127] 表示128个ASCII字符。
Other cache:[-128,127]

Boolean使用创建 final 对象实现类似功能
Float,Double未实现常量池。

Boolean类

 Boolean类中,创建了两个final类型的Boolean对象TRUE和FALSE。实现了类似于常量池的功能
 public static final Boolean TRUE = new Boolean(true);
 public static final Boolean FALSE = new Boolean(false);

下面以Integer为例分析一下其实现原理

 private final int value;
 这个属性用于存储Integer对象的值。

 此类内部还有一个内部类 IntegerCache,该类用于维护一个Integer的常量池。
 static final Integer cache[];
 cache 维护了一个[-128,127]的Integer对象

IntegerCache源码

    private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
}

编码验证

// 使用此种方式创建Integer对象时,直接在Integer类维护的常量池返回Integer对象
// 返回的是同一个对象,所以结果为true
Integer a= 123;
Integer b= 123;
System.out.println(a==b);   //true

// 使用此种方式创建Integer对象时,直接在堆中创建了一个Integer对象
// 堆中两个不同的对象,所以结果为false
Integer c= new Integer(123);
Integer d= new Integer(123);
System.out.println(c==d);  //false

自动拆箱和自动装箱

自动装箱:将基本类型自动转为其包装类
Integer n=123;
自动拆箱:将包装类型转为基本类型
int m=new Integer(100);

将字符串转为基本数据类型是时使用trim( )方法去除空格。

其他常用方法可参照API或者阅读源码

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页