Java中的基本數據類型和包裝類型的這些知識,你都知道嗎?

Java中的基本數據類型和包裝類型

Java 中的基本數據按類型可以分爲四大類:布爾型、整數型、浮點型、字符型;
這四大類包含 8 種基本數據類型。

  • 布爾型:boolean
  • 整數型:byte、short、int、long
  • 浮點型:float、double
  • 字符型:char

這8 種基本類型取值如下:

數據類型 代表含義 默認值 取值 包裝類
boolean 布爾型 false 0(false) 到 1(true) Boolean
byte 字節型 (byte)0 ﹣128 到 127 Byte
char 字符型 '\u0000'(空) '\u0000' 到 '\uFFFF' Character
short 短整數型 (short)0 -2^{15}2^{15}
﹣1 Short
int 整數型 0 2^{31}2^{31}﹣1 Integer
long 長整數型 0L 2^{63}2^{63}﹣1 Long
float 單浮點型 0.0f 1.4e-45 到 3.4e+38 Float
double 雙浮點型 0.0d 4.9e-324 到 1.798e+308 Double

我們可以看到除 char 的包裝類 Character 和 int 的包裝類 Integer之外,
其他基本數據類型的包裝類只需要首字母大寫即可。包裝類的作用和特點,本文下半部分詳細講解。
這些都是我們很熟悉的知識了,那下面的知識你有了解嗎?

你可能不知道的知識點

首先我們來看一道題目?
下面這段代碼輸出什麼呢?

public class Demo1 {
    public static void main(String[] args) {

        Integer number1 = 127;
        Integer number2 = 127;

        System.out.println("number1==number2判斷的值爲" + (number1 == number2));

        Integer number3 = 128;
        Integer number4 = 128;

        System.out.println("number3==number4判斷的值爲" + (number3 == number4));
    }
}

讓我們來看一下答案:

number1number2均賦值爲了127,number3number4均賦值爲了128,
那爲什麼number1==number2truenumber3==number4false呢?

我們來看一下Integer中的valueOf的源碼:

    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]之間就返回IntegerCache.cache[i + (-IntegerCache.low)],如果值沒在這裏面,就創建一個新對象返回;
實際上這是一個 高頻區間的數據緩存,我們再來看看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() {}
    }

我們看到IntegerCache.low爲-128,IntegerCache.high爲127;
所以在通過valueOf方法創建Integer對象的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的對象的引用;否則創建一個新的Integer對象。
與Integer類似,有高頻區間數據緩存的包裝類還有:

  • Byte:緩存區 -128~127
  • Short:緩存區 -128~127
  • Character:緩存區 0~127
  • Long:緩存區 -128~127
  • Integer:緩存區 -128~127

我們再來看一下以下代碼:

public class Demo2 {
        public static void main(String[] args) {

            Boolean bool1 = false;
            Boolean bool2 = false;
            Boolean bool3 = true;
            Boolean bool4 = true;

            System.out.println("bool1==bool2判斷的值爲"+(bool1==bool1));
            System.out.println("bool3==bool4判斷的值爲"+(bool3==bool4));
        }
}

讓我們來看一下答案:

我們來看一下Boolean的valueOf代碼:

public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }

再來看一下TRUE和FALSE的定義:

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

可以看到它們使用靜態 final 定義,就會返回靜態值,所以答案2中返回都是true。

Double、Float的valueOf方法的實現是類似的,但是它們的valueOf與Integer、Short、Byte、Character、Long的不同。

我們再看一下下面的代碼:

public class Demo3 {
    public static void main(String[] args) {

        Double d1 = 20.0;
        Double d2 = 20.0;

        System.out.println("d1==d2判斷的值爲" + (d1 == d2));

        Double d3 = 30.0;
        Double d4 = 30.0;

        System.out.println("d3==d4判斷的值爲" + (d3 == d4));
    }
}

讓我們來看一下答案:

看一下Double類型的valueOf的實現

public static Double valueOf(String s) throws NumberFormatException {
        return new Double(parseDouble(s));
}

它會返回一個新的Double對象。
看一下Float類型的valueOf的實現

public static Float valueOf(String s) throws NumberFormatException {
        return new Float(parseFloat(s));
}

Float類型的valueOf的實現與Double類型類似。

歡迎關注

掃下方二維碼即可關注,微信公衆號:code隨筆

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章