美文网首页Java基础知识
java基础2. 基本数据类型的封装类

java基础2. 基本数据类型的封装类

作者: ygxing | 来源:发表于2019-03-15 16:44 被阅读0次
1.基本类型和封装类型的对应表格
数据类型 关键字 封装类
布尔类型 boolean Boolean
字节类型 byte Byte
字符型 char Character
短整型 short Short
整形 int Integer
单精度浮点数 float Float
长整形 long Long
双精度浮点数 double Double
2.基本类型和封装类型的 == 判断
-封装类型和基本类型比较
封装类型会进行自动拆箱,然后变成基本类型判断
public static void main(String[] args) {
    Integer num1 = 1000;
    int num2 = 1000;
    System.out.println("Integer == int : " 
        + (num1 == num2));
}
运行结果:
    Integer == int : true
-封装类型和封装类型比较
两个封装类型进行 "=="比较的时候, 判断的是两个指针引用是否指向同一个地址
  public static void main(String[] args) {
    Integer num1 = 127;
    Integer num2 = 127;
    System.out.println("Integer == Integer : " 
        + (num1 == num2));
  }
运行结果:
    Integer == Integer : true
  public static void main(String[] args) {
    Integer num1 = 1000;
    Integer num2 = 1000;
    System.out.println("Integer == Integer : " 
        + (num1 == num2));
  }
运行结果:
    Integer == Integer : false
3.基本类型和封装类型的 equals 判断
封装类型和基本类型进行equals比较的时候,
基本类型装箱会先进行装箱操作,
转换为封装类型,
然后进行equals判断
 public static void main(String[] args) {
    int num1 = 1000;
    Integer num2 = 1000;
    System.out.println("Integer.equals(int) : " 
        + num2.equals(num1));
  }
运行结果:
    Integer.equals(int) : true
4.整型常亮缓存池
Byte,Short,Integer,Long这四种类型
分别维护了一个私有的静态内部缓存类,
在缓存类中,缓存了一个范围是[-128,127]的数组;
当我们使用valueOf()方法或者用整型直接赋值的时候,
会判断数据范围,如果是在缓存范围内,
那么优先从缓存中取出来
Byte缓存源码
Byte,Short,Long这三个封装类的思想基本上是一样的
/**
 * 私有静态内部缓存类 
 */
private static class ByteCache {
    private ByteCache(){}

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

    //静态代码块,将-128到127范围内的数据缓存的cache数组中
    static {
        for(int i = 0; i < cache.length; i++)
            cache[i] = new Byte((byte)(i - 128));
    }
}

/**
 *调用valueOf方法的时候,直接从缓存数组中取出来 
 */
public static Byte valueOf(byte b) {
    final int offset = 128;
    return ByteCache.cache[(int)b + offset];
}

Integer缓存源码
Integer的缓存实现和Byte有所不同,
缓存的最大值需要从JVM中取出

/**
 * 私有静态内部缓存类 
 */
private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
        //从jvm中取出关于缓存最大值的配置
        //java规范中规定,[-128, 127]必须缓存
        //所以此处缓存最大值是Math.max(i, 127)
        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) {
               
            }
        }
        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() {}
}

/**
 * 调用valueOf方法的时候先判断数值的大小,
 * 如果是在缓存的范围中,那么直接从缓存数组中取出来 
 */
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

相关文章

网友评论

    本文标题:java基础2. 基本数据类型的封装类

    本文链接:https://www.haomeiwen.com/subject/tjdrmqtx.html