zoukankan      html  css  js  c++  java
  • 数据类型

    包装类型

    八个基本类型:

    • boolean/1
    • byte/8
    • char/16
    • short/16
    • int/32
    • float/32
    • long/64
    • double/64

    基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。

    Integer x = 2;     // 装箱
    int y = x;         // 拆箱

    缓存池

    new Integer(123) 与 Integer.valueOf(123) 的区别在于:

    • new Integer(123) 每次都会新建一个对象;
    • Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
    Integer x = new Integer(123);
    Integer y = new Integer(123);
    System.out.println(x == y);    // false
    Integer z = Integer.valueOf(123);
    Integer k = Integer.valueOf(123);
    System.out.println(z == k);   // true

    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 8 中,Integer 缓存池的大小默认为 -128~127。

    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;
    }

    编译器会在自动装箱过程调用 valueOf() 方法,因此多个 Integer 实例使用自动装箱来创建并且值相同,那么就会引用相同的对象。

    Integer m = 123;
    Integer n = 123;
    System.out.println(m == n); // true

    基本类型对应的缓冲池如下:

    • boolean values true and false
    • all byte values
    • short values between -128 and 127
    • int values between -128 and 127
    • char in the range u0000 to u007F

    在使用这些基本类型对应的包装类型时,就可以直接使用缓冲池中的对象。

  • 相关阅读:
    WinAPI 字符及字符串函数(10): lstrcpy 复制字符串
    WinAPI 字符及字符串函数(7): IsCharLower 是否是个小写字母
    WinAPI 字符及字符串函数(9): lstrcat 合并字符串
    WinAPI 字符及字符串函数(8): IsCharUpper 是否是个大写字母
    WinAPI 字符及字符串函数(6): IsCharAlphaNumeric 是否是个文字(字母或数字)
    获取汉字编码的几种方法 回复"外来天客"的问题
    上周热点回顾(4.114.17)
    博客园电子期刊2011年3月刊发布啦
    上周热点回顾(3.213.27)
    上周热点回顾(3.73.13)
  • 原文地址:https://www.cnblogs.com/AnXinliang/p/9892846.html
Copyright © 2011-2022 走看看