精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

以為很簡(jiǎn)單的 int (1) 和 int (10),卻成了面試滑鐵盧!

開(kāi)發(fā) 前端
各位程序員朋友們,下次遇到類(lèi)似的問(wèn)題,不要輕敵,多問(wèn)自己幾個(gè)為什么:為什么會(huì)有自動(dòng)裝箱?為什么 Integer 要設(shè)計(jì)緩存機(jī)制?緩存范圍為什么是 - 128 到 127?修改 JVM 參數(shù)會(huì)有什么影響?只有把這些問(wèn)題都搞清楚,才能在面試中從容應(yīng)對(duì),避免滑鐵盧。

兄弟們,有沒(méi)有過(guò)這樣的經(jīng)歷?面試的時(shí)候,面試官突然拋出一個(gè)看似簡(jiǎn)單到不能再簡(jiǎn)單的問(wèn)題:"說(shuō)說(shuō) int 和 Integer 的區(qū)別,再看看這段代碼的輸出結(jié)果是什么?" 然后在白板上寫(xiě)下兩行代碼:

Integer a = 1;
Integer b = 10;
System.out.println(a == b);
System.out.println(a.equals(b));

你心里暗自竊喜,這不就是自動(dòng)裝箱嘛,int 和 Integer 的區(qū)別早就滾瓜爛熟了。可是當(dāng)你自信滿(mǎn)滿(mǎn)地說(shuō)出 "第一個(gè)輸出 false,第二個(gè)輸出 true" 的時(shí)候,面試官嘴角上揚(yáng),露出一絲神秘的微笑:"那如果是這樣呢?" 接著又寫(xiě)下:

Integer c = 1;
Integer d = 1;
System.out.println(c == d);
Integer e = 128;
Integer f = 128;
System.out.println(e == f);

這時(shí)候你突然意識(shí)到事情沒(méi)那么簡(jiǎn)單,剛才的答案可能有問(wèn)題。看著面試官似笑非笑的表情,你開(kāi)始懷疑人生:明明都是 int 裝箱成 Integer,為什么有的用 == 比較是 true,有的又是 false?難道 1 和 10 有什么特殊魔力?今天咱們就來(lái)好好掰扯掰扯這個(gè)讓無(wú)數(shù)程序員在面試中翻車(chē)的 "簡(jiǎn)單" 問(wèn)題,看看背后藏著多少不為人知的細(xì)節(jié)。

一、從自動(dòng)裝箱說(shuō)起:編譯器背后的小魔術(shù)

首先,我們得搞清楚 int 和 Integer 之間的關(guān)系。在 Java 5 之后,引入了自動(dòng)裝箱(Autoboxing)和自動(dòng)拆箱(Unboxing)的特性,讓基本數(shù)據(jù)類(lèi)型和對(duì)應(yīng)的包裝類(lèi)之間可以自動(dòng)轉(zhuǎn)換。比如說(shuō):

Integer x = 5; // 自動(dòng)裝箱,相當(dāng)于Integer x = Integer.valueOf(5);
int y = x; // 自動(dòng)拆箱,相當(dāng)于int y = x.intValue();

這個(gè)特性讓我們?cè)诰帉?xiě)代碼時(shí)可以更方便地使用包裝類(lèi),不用頻繁地手動(dòng)調(diào)用 valueOf () 和 xxxValue () 方法。但是,自動(dòng)裝箱并不是簡(jiǎn)單地把 int 包裝成 Integer 對(duì)象,背后涉及到一個(gè)重要的方法 ——Integer.valueOf(int i)。這個(gè)方法可是大有學(xué)問(wèn),面試題的玄機(jī)就藏在這里。我們先來(lái)看一下Integer.valueOf(int i)的源碼(以 Java 8 為例):

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

看到?jīng)]?這里有一個(gè)IntegerCache的緩存機(jī)制。當(dāng)傳入的 int 值在IntegerCache.low和IntegerCache.high之間時(shí),不會(huì)創(chuàng)建新的 Integer 對(duì)象,而是直接從緩存中獲取已經(jīng)存在的對(duì)象。而默認(rèn)情況下,IntegerCache.low是 - 128,IntegerCache.high是 127。也就是說(shuō),當(dāng)我們將一個(gè) int 值裝箱成 Integer 時(shí),如果值在 - 128 到 127 之間,會(huì)直接返回緩存中的對(duì)象,而不是新建一個(gè)對(duì)象;如果超過(guò)這個(gè)范圍,才會(huì)新建一個(gè) Integer 對(duì)象。這下明白了吧?剛才的例子中,Integer c = 1和Integer d = 1,因?yàn)?1 在緩存范圍內(nèi),所以 c 和 d 指向的是同一個(gè)緩存中的對(duì)象,用 == 比較自然是 true;而Integer e = 128和Integer f = 128,128 超過(guò)了默認(rèn)的緩存上限 127,所以會(huì)新建兩個(gè)不同的 Integer 對(duì)象,用 == 比較就是 false。

但是等等,這里有個(gè)問(wèn)題:面試官剛才的第一個(gè)問(wèn)題中,a 是 1,b 是 10,都是在緩存范圍內(nèi),為什么a == b是 false 呢?哦,對(duì)了,因?yàn)?a 和 b 是不同的對(duì)象,雖然都在緩存范圍內(nèi),但緩存的是相同值的對(duì)象,而不是不同值的對(duì)象。也就是說(shuō),緩存是針對(duì)單個(gè)值的,每個(gè)值在緩存中只有一個(gè)對(duì)象。所以 1 對(duì)應(yīng)的緩存對(duì)象和 10 對(duì)應(yīng)的緩存對(duì)象是不同的,所以 a 和 b 指向不同的對(duì)象,== 比較自然是 false,而 equals 比較的是值,所以是 true。

二、Integer 緩存機(jī)制:面試官挖的第一個(gè)坑

剛才提到的IntegerCache是 Java 中為了優(yōu)化性能而引入的一個(gè)緩存機(jī)制,用于緩存常用的小整數(shù)對(duì)象,避免頻繁創(chuàng)建和銷(xiāo)毀對(duì)象帶來(lái)的性能開(kāi)銷(xiāo)。這個(gè)緩存的范圍默認(rèn)是 - 128 到 127,但是我們可以通過(guò) JVM 參數(shù)來(lái)修改這個(gè)范圍。比如,在啟動(dòng)程序時(shí)加上-XX:AutoBoxCacheMax=200,就可以將緩存的上限設(shè)置為 200,這樣 200 以?xún)?nèi)的整數(shù)裝箱時(shí)都會(huì)使用緩存中的對(duì)象。

不過(guò),需要注意的是,這個(gè)緩存機(jī)制只適用于自動(dòng)裝箱的情況,也就是通過(guò)Integer.valueOf(int i)方法來(lái)獲取 Integer 對(duì)象的情況。如果我們直接使用 new Integer (int i) 來(lái)創(chuàng)建對(duì)象,不管值是多少,都會(huì)新建一個(gè)新的對(duì)象,不會(huì)使用緩存。比如:

Integer g = new Integer(1);
Integer h = new Integer(1);
System.out.println(g == h); // 輸出false,因?yàn)槊看蝞ew都會(huì)創(chuàng)建新對(duì)象
System.out.println(g.equals(h)); // 輸出true,因?yàn)橹迪嗤?/code>

另外,還有一個(gè)容易混淆的地方是,Integer 的緩存機(jī)制是在類(lèi)加載的時(shí)候就已經(jīng)初始化好了的,也就是說(shuō),當(dāng)我們第一次使用 Integer 類(lèi)的時(shí)候,緩存就已經(jīng)創(chuàng)建好了,包含 - 128 到 127 之間的所有整數(shù)對(duì)象。所以,不管我們?cè)诔绦虻哪膫€(gè)地方裝箱一個(gè)在這個(gè)范圍內(nèi)的整數(shù),都會(huì)返回同一個(gè)緩存中的對(duì)象。這里還有一個(gè)有趣的現(xiàn)象:當(dāng)我們將一個(gè) Integer 對(duì)象賦值給 int 變量時(shí),會(huì)發(fā)生自動(dòng)拆箱,這時(shí)候比較的是值而不是對(duì)象引用。比如:

Integer i = 1;
int j = 1;
System.out.println(i == j); // 輸出true,因?yàn)樽詣?dòng)拆箱后比較的是值

這是因?yàn)楫?dāng)一個(gè) Integer 對(duì)象和一個(gè)基本數(shù)據(jù)類(lèi)型 int 進(jìn)行比較時(shí),Integer 會(huì)自動(dòng)拆箱成 int,然后比較兩個(gè) int 的值,所以結(jié)果是 true。

三、== vs equals:面試官挖的第二個(gè)坑

接下來(lái),我們來(lái)深入探討一下 == 和 equals 方法的區(qū)別。這是 Java 面試中非常經(jīng)典的問(wèn)題,但很多人對(duì)它們的理解還停留在表面。

首先,== 對(duì)于基本數(shù)據(jù)類(lèi)型來(lái)說(shuō),比較的是值是否相等;對(duì)于引用數(shù)據(jù)類(lèi)型來(lái)說(shuō),比較的是對(duì)象的內(nèi)存地址是否相同,也就是是否指向同一個(gè)對(duì)象。

而 equals 方法是 Object 類(lèi)的一個(gè)實(shí)例方法,默認(rèn)實(shí)現(xiàn)也是比較對(duì)象的內(nèi)存地址,和 == 的效果一樣。但是,很多類(lèi)重寫(xiě)了 equals 方法,比如 String、Integer 等,重寫(xiě)后的 equals 方法比較的是對(duì)象的內(nèi)容是否相等。

以 Integer 為例,它的 equals 方法源碼如下:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

可以看到,Integer 的 equals 方法會(huì)先判斷對(duì)象是否是 Integer 類(lèi)型,如果是,就比較包裝的 int 值是否相等。所以,當(dāng)我們用 equals 比較兩個(gè) Integer 對(duì)象時(shí),只要它們包裝的 int 值相同,就會(huì)返回 true,不管它們是否是同一個(gè)對(duì)象。但是,這里需要注意一個(gè)問(wèn)題:如果我們將一個(gè) null 值和一個(gè) Integer 對(duì)象用 equals 比較,會(huì)拋出 NullPointerException。而用 == 比較的話(huà),null 和任何對(duì)象引用比較都是 false,不會(huì)拋出異常。

另外,還有一種常見(jiàn)的錯(cuò)誤是,誤以為所有包裝類(lèi)的 equals 方法都和 Integer 一樣,只比較值。其實(shí)不然,比如 Double 和 Float 的 equals 方法在比較時(shí),還會(huì)考慮 NaN 的情況。不過(guò),這是另一個(gè)話(huà)題,我們今天先聚焦在 Integer 上。

回到最初的面試題,當(dāng)面試官問(wèn)a == b和a.equals(b)的結(jié)果時(shí),我們需要分情況討論:

  1. 如果 a 和 b 都是通過(guò)自動(dòng)裝箱(即 Integer.valueOf ())得到的,并且值在緩存范圍內(nèi)(-128 到 127),那么當(dāng)值相同時(shí),a == b 為 true,否則為 false;而 a.equals (b) 只要值相同就為 true。
  2. 如果 a 和 b 是通過(guò) new Integer () 創(chuàng)建的,那么不管值是否相同,a == b 永遠(yuǎn)為 false,因?yàn)槊看?new 都會(huì)創(chuàng)建新對(duì)象;而 a.equals (b) 只要值相同就為 true。
  3. 當(dāng)一個(gè)是基本類(lèi)型 int,一個(gè)是 Integer 對(duì)象時(shí),== 比較會(huì)自動(dòng)拆箱,比較值是否相同;而 equals 比較時(shí),因?yàn)?int 會(huì)自動(dòng)裝箱成 Integer,所以和兩個(gè) Integer 對(duì)象比較一樣,比較值是否相同。

四、哈希碼與 equals:面試官可能追問(wèn)的第三個(gè)坑

在 Java 中,哈希碼(hash code)和 equals 方法有著密切的關(guān)系。根據(jù) Java 的規(guī)范,兩個(gè)對(duì)象如果 equals 方法返回 true,那么它們的哈希碼(hashCode () 方法的返回值)必須相等;如果 equals 方法返回 false,它們的哈希碼可以相等也可以不相等。

Integer 類(lèi)重寫(xiě)了 hashCode 方法,返回的是包裝的 int 值。所以,兩個(gè)值相同的 Integer 對(duì)象,它們的哈希碼是相等的,這符合上述規(guī)范。

我們可以通過(guò)一個(gè)例子來(lái)驗(yàn)證:

Integer k = 100;
Integer l = 100;
System.out.println(k.hashCode()); // 輸出100
System.out.println(l.hashCode()); // 輸出100
System.out.println(k.equals(l)); // 輸出true
Integer m = new Integer(100);
System.out.println(m.hashCode()); // 輸出100,因?yàn)橹貙?xiě)了hashCode方法,返回值本身

這里需要注意的是,如果我們自定義一個(gè)類(lèi),重寫(xiě)了 equals 方法,就必須同時(shí)重寫(xiě) hashCode 方法,否則可能會(huì)違反上述規(guī)范,導(dǎo)致在使用哈希表(如 HashMap、HashSet)時(shí)出現(xiàn)問(wèn)題。不過(guò),這是另一個(gè)層面的問(wèn)題,我們今天主要關(guān)注 Integer 類(lèi)。另外,當(dāng)我們將 Integer 對(duì)象作為 HashMap 的鍵時(shí),需要注意如果對(duì)象被修改了(雖然 Integer 是不可變類(lèi),值不會(huì)被修改,但如果是自定義的可變類(lèi)),哈希碼可能會(huì)改變,導(dǎo)致無(wú)法正確獲取對(duì)應(yīng)的 value。不過(guò),Integer 是不可變的,所以不用擔(dān)心這個(gè)問(wèn)題,但這是一個(gè)需要了解的知識(shí)點(diǎn)。

五、序列化與反序列化:面試官可能深挖的第四個(gè)坑

Integer 作為 Java 的基本包裝類(lèi),實(shí)現(xiàn)了 Serializable 接口,所以可以被序列化和反序列化。在序列化過(guò)程中,Integer 對(duì)象會(huì)被轉(zhuǎn)換成字節(jié)流,反序列化時(shí)再恢復(fù)成對(duì)象。

這里有一個(gè)有趣的現(xiàn)象:當(dāng)反序列化一個(gè) Integer 對(duì)象時(shí),返回的對(duì)象是否來(lái)自緩存呢?答案是肯定的。因?yàn)榉葱蛄谢^(guò)程中,會(huì)調(diào)用 Integer.valueOf () 方法來(lái)創(chuàng)建對(duì)象,所以如果值在緩存范圍內(nèi),會(huì)返回緩存中的對(duì)象,而不是新建一個(gè)對(duì)象。

我們可以通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)驗(yàn)證:

import java.io.*;

publicclass IntegerSerializationTest {
    public static void main(String[] args) throws Exception {
        Integer n = 100;
        // 序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("integer.ser"));
        oos.writeObject(n);
        oos.close();

        // 反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("integer.ser"));
        Integer m = (Integer) ois.readObject();
        ois.close();

        System.out.println(n == m); // 輸出true,因?yàn)?00在緩存范圍內(nèi),反序列化使用了valueOf方法
    }
}

運(yùn)行結(jié)果是 true,說(shuō)明反序列化得到的 Integer 對(duì)象和緩存中的對(duì)象是同一個(gè)。而如果序列化的值是 128,反序列化得到的對(duì)象和新裝箱的 128 是否是同一個(gè)呢?我們來(lái)試一下:

Integer p = 128;
ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream("integer2.ser"));
oos2.writeObject(p);
oos2.close();

ObjectInputStream ois2 = new ObjectInputStream(new FileInputStream("integer2.ser"));
Integer q = (Integer) ois2.readObject();
ois2.close();

System.out.println(p == q); // 輸出false,因?yàn)?28不在默認(rèn)緩存范圍內(nèi),序列化時(shí)保存的是對(duì)象的二進(jìn)制數(shù)據(jù),反序列化時(shí)調(diào)用valueOf方法,128超過(guò)緩存上限,新建對(duì)象
System.out.println(p.equals(q)); // 輸出true

這里輸出 false,因?yàn)?128 不在默認(rèn)的緩存范圍內(nèi),反序列化時(shí)會(huì)調(diào)用 Integer.valueOf (128),而該方法會(huì)新建一個(gè) Integer 對(duì)象,所以 p 和 q 是不同的對(duì)象,但值相同。

六、擴(kuò)展思考:其他包裝類(lèi)的緩存機(jī)制

其實(shí),不僅僅是 Integer 類(lèi)有緩存機(jī)制,Java 中的其他基本包裝類(lèi),如 Byte、Short、Long、Character 等,也都有類(lèi)似的緩存機(jī)制,只不過(guò)緩存的范圍可能不同:

  • Byte:緩存范圍是 - 128 到 127,因?yàn)?Byte 的取值范圍就是 - 128 到 127,所以所有值都會(huì)被緩存。
  • Short:默認(rèn)緩存范圍是 - 128 到 127,可以通過(guò) JVM 參數(shù)修改上限。
  • Long:默認(rèn)緩存范圍是 - 128 到 127,可以通過(guò) JVM 參數(shù)修改上限。
  • Character:默認(rèn)緩存范圍是 0 到 127,因?yàn)?Character 表示的是 Unicode 字符,0 到 127 對(duì)應(yīng) ASCII 字符,是比較常用的范圍。
  • Double 和 Float:沒(méi)有緩存機(jī)制,因?yàn)楦↑c(diǎn)數(shù)的范圍太大,而且存在精度問(wèn)題,緩存沒(méi)有意義。

我們以 Short 為例,來(lái)看一下它的 valueOf 方法源碼:

public static Short valueOf(short s) {
    final int offset = 128;
    int sAsInt = s;
    if (sAsInt >= -128 && sAsInt <= 127) { // must cache
        return ShortCache.cache[sAsInt + offset];
    }
    return new Short(s);
}

可以看到,Short 的緩存范圍也是 - 128 到 127,和 Integer 類(lèi)似。而 Character 的緩存范圍是 0 到 127,源碼如下:

public static Character valueOf(char c) {
    if (c <= 127) { // must cache
        return CharacterCache.cache[(int)c];
    }
    return new Character(c);
}

所以,當(dāng)我們使用這些包裝類(lèi)時(shí),也要注意它們的緩存機(jī)制,避免在面試中被問(wèn)到類(lèi)似的問(wèn)題時(shí)翻車(chē)。

七、面試陷阱總結(jié):這些坑你都踩過(guò)嗎?

現(xiàn)在,我們來(lái)總結(jié)一下面試中關(guān)于 int 和 Integer 的常見(jiàn)問(wèn)題和陷阱:

  1. 自動(dòng)裝箱 / 拆箱的原理:知道是通過(guò) valueOf () 和 xxxValue () 方法實(shí)現(xiàn)的,尤其是 valueOf () 方法的緩存機(jī)制。
  2. == 和 equals 的區(qū)別:基本類(lèi)型比較值,引用類(lèi)型比較地址;equals 方法在 Integer 中比較的是值,但要注意 null 的情況。
  3. Integer 緩存范圍:默認(rèn) - 128 到 127,可通過(guò) JVM 參數(shù)修改,new Integer () 不會(huì)使用緩存。
  4. 哈希碼與 equals 的關(guān)系:重寫(xiě) equals 必須重寫(xiě) hashCode,Integer 的 hashCode 返回值本身。
  5. 序列化問(wèn)題:反序列化使用 valueOf () 方法,所以在緩存范圍內(nèi)會(huì)返回緩存對(duì)象。
  6. 其他包裝類(lèi)的緩存:Byte、Short、Long、Character 有緩存,Double 和 Float 沒(méi)有。

為了幫助大家更好地理解,我們?cè)賮?lái)看幾個(gè)經(jīng)典的面試題例子:

例子 1:

Integer a1 = 127;
Integer a2 = 127;
System.out.println(a1 == a2); // 輸出true,127在緩存范圍內(nèi)

Integer b1 = 128;
Integer b2 = 128;
System.out.println(b1 == b2); // 輸出false,128超出緩存范圍

例子 2:

Integer c1 = new Integer(100);
Integer c2 = new Integer(100);
System.out.println(c1 == c2); // 輸出false,new創(chuàng)建新對(duì)象
System.out.println(c1.equals(c2)); // 輸出true,值相同

例子 3:

Integer d1 = 100;
int d2 = 100;
System.out.println(d1 == d2); // 輸出true,d1自動(dòng)拆箱成int,比較值

例子 4:

Integer e1 = null;
Integer e2 = 100;
// System.out.println(e1 == e2); // 輸出false,不會(huì)拋異常
// System.out.println(e1.equals(e2)); // 拋NullPointerException

例子 5:

Integer f1 = Integer.valueOf(100);
Integer f2 = Integer.valueOf(100);
System.out.println(f1 == f2); // 輸出true,使用緩存對(duì)象

八、為什么面試官喜歡問(wèn)這個(gè)問(wèn)題?

看到這里,可能有人會(huì)問(wèn):不就是一個(gè)自動(dòng)裝箱和緩存的問(wèn)題嗎?為什么面試官總是揪著不放?其實(shí),這個(gè)問(wèn)題雖然看似簡(jiǎn)單,但背后涉及到 Java 的很多核心概念:

  1. 基本類(lèi)型與包裝類(lèi)的區(qū)別:值類(lèi)型和引用類(lèi)型的本質(zhì)區(qū)別,棧內(nèi)存和堆內(nèi)存的存儲(chǔ)方式。
  2. 自動(dòng)裝箱拆箱的實(shí)現(xiàn)原理:理解編譯器如何處理基本類(lèi)型和包裝類(lèi)的轉(zhuǎn)換,背后的方法調(diào)用。
  3. 對(duì)象池技術(shù)(緩存機(jī)制):Java 中為了優(yōu)化性能而采用的常見(jiàn)技術(shù),如 String 常量池、Integer 緩存池等,理解性能優(yōu)化的思路。
  4. == 和 equals 的語(yǔ)義:深入理解 Java 中對(duì)象比較的規(guī)則,避免在實(shí)際開(kāi)發(fā)中出現(xiàn)邏輯錯(cuò)誤。
  5. 不可變類(lèi)的設(shè)計(jì):Integer 是不可變類(lèi),一旦創(chuàng)建值就不能改變,理解不可變類(lèi)的優(yōu)點(diǎn)和應(yīng)用場(chǎng)景。

這些知識(shí)點(diǎn)都是 Java 程序員必須掌握的基礎(chǔ),尤其是在涉及到對(duì)象比較、集合操作(如 HashMap 的鍵)、性能優(yōu)化等場(chǎng)景時(shí),對(duì)這些細(xì)節(jié)的理解會(huì)直接影響代碼的正確性和效率。

九、實(shí)際開(kāi)發(fā)中的注意事項(xiàng)

雖然面試中經(jīng)常考察這些細(xì)節(jié),但在實(shí)際開(kāi)發(fā)中,我們應(yīng)該如何正確使用 int 和 Integer 呢?

  1. 優(yōu)先使用基本類(lèi)型:如果不需要對(duì)象功能(如 null 值、方法調(diào)用等),優(yōu)先使用 int、double 等基本類(lèi)型,因?yàn)樗鼈兏咝В加脙?nèi)存更小。
  2. 注意 null 值處理:當(dāng)使用 Integer 時(shí),要注意可能為 null 的情況,避免空指針異常。比如,在數(shù)據(jù)庫(kù)查詢(xún)中,整數(shù)類(lèi)型的字段可能返回 null,這時(shí)候需要合理處理。
  3. 謹(jǐn)慎使用 == 比較對(duì)象:除非你確定兩個(gè)引用指向同一個(gè)對(duì)象(如來(lái)自緩存或同一個(gè) new 操作),否則應(yīng)該使用 equals 方法比較值,尤其是在涉及自動(dòng)裝箱的情況下。
  4. 了解框架的處理方式:很多框架(如 Spring、MyBatis)在處理數(shù)據(jù)類(lèi)型轉(zhuǎn)換時(shí),會(huì)涉及到自動(dòng)裝箱拆箱,了解這些機(jī)制可以幫助我們更好地調(diào)試和優(yōu)化代碼。
  5. 性能敏感場(chǎng)景的優(yōu)化:在高頻調(diào)用的代碼中,如循環(huán)內(nèi)部,如果需要?jiǎng)?chuàng)建大量小整數(shù)的 Integer 對(duì)象,使用自動(dòng)裝箱(利用緩存)會(huì)比 new Integer () 更高效,因?yàn)楸苊饬藢?duì)象創(chuàng)建和垃圾回收的開(kāi)銷(xiāo)。

十、總結(jié):細(xì)節(jié)決定成敗

回到最初的面試場(chǎng)景,為什么一個(gè)看似簡(jiǎn)單的 int 和 Integer 的問(wèn)題會(huì)成為滑鐵盧?因?yàn)楹芏喑绦騿T只停留在表面知識(shí),知道自動(dòng)裝箱拆箱,知道 == 和 equals 的區(qū)別,但沒(méi)有深入理解背后的實(shí)現(xiàn)原理,尤其是 Integer 的緩存機(jī)制。而面試官通過(guò)這個(gè)問(wèn)題,實(shí)際上是在考察候選人對(duì) Java 基礎(chǔ)的掌握程度,是否注重細(xì)節(jié),是否有深入鉆研的習(xí)慣。

技術(shù)面試的本質(zhì),不是考察你會(huì)不會(huì)某個(gè)冷門(mén)的 API,而是考察你對(duì)基礎(chǔ)原理的理解深度,以及能否將這些原理應(yīng)用到實(shí)際開(kāi)發(fā)中。就像 Integer 的緩存機(jī)制,看似只是一個(gè)小細(xì)節(jié),但背后涉及到性能優(yōu)化、對(duì)象池設(shè)計(jì)、語(yǔ)言特性實(shí)現(xiàn)等多個(gè)層面的知識(shí)。

所以,各位程序員朋友們,下次遇到類(lèi)似的問(wèn)題,不要輕敵,多問(wèn)自己幾個(gè)為什么:為什么會(huì)有自動(dòng)裝箱?為什么 Integer 要設(shè)計(jì)緩存機(jī)制?緩存范圍為什么是 - 128 到 127?修改 JVM 參數(shù)會(huì)有什么影響?只有把這些問(wèn)題都搞清楚,才能在面試中從容應(yīng)對(duì),避免滑鐵盧。

責(zé)任編輯:武曉燕 來(lái)源: 石杉的架構(gòu)筆記
相關(guān)推薦

2024-03-14 08:36:25

MySQLzerofill?數(shù)字

2023-02-07 09:01:30

字符串類(lèi)型MySQL

2025-02-10 08:40:00

MySQLint(10)數(shù)據(jù)庫(kù)

2021-07-27 06:49:11

數(shù)據(jù)庫(kù)設(shè)計(jì)數(shù)據(jù)

2009-06-19 16:46:18

IntegerJava

2009-08-18 15:00:00

C#強(qiáng)制轉(zhuǎn)換

2021-10-10 18:28:24

數(shù)值mysql類(lèi)型

2010-06-12 10:10:55

2010-07-08 14:53:38

SQLServer實(shí)現(xiàn)

2010-10-09 16:51:47

2010-09-29 14:48:16

2021-10-28 19:35:48

Go 控制超時(shí)

2017-07-14 08:18:08

異構(gòu)存儲(chǔ)復(fù)制

2014-01-10 10:20:18

Windows 8.1Update 1

2017-07-10 13:31:03

異構(gòu) 存儲(chǔ)

2010-07-13 15:56:16

SQL Server獲

2010-07-19 08:36:56

SQL Server內(nèi)

2010-05-19 16:45:26

MySQL自動(dòng)啟動(dòng)

2010-06-09 13:55:24

設(shè)置MySQL同步

2010-03-31 09:16:28

Oracle10g安裝
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩精品亚洲一区| 国产精品亚洲综合在线观看| 久久综合九色综合97婷婷女人 | 精品在线免费视频| 欧美国产激情18| 欧美熟妇一区二区| jizz欧美| 亚洲午夜一二三区视频| 日本最新一区二区三区视频观看| 国产片在线播放| 日韩一区二区久久| 日韩在线免费观看视频| 无码国产精品一区二区免费式直播 | 老司机在线精品视频| 欧洲一区二区三区在线| 国产爆乳无码一区二区麻豆| 免费福利在线视频| 国产九九视频一区二区三区| 日本免费久久高清视频| 九九热这里有精品视频| 欧美日韩激情| 精品成人a区在线观看| 一级片视频免费观看| av成人影院在线| 国产精品二区一区二区aⅴ污介绍| 国产精品日韩一区二区三区| 成人一级免费视频| 99日韩精品| 欧美另类精品xxxx孕妇| 精品一区二区三区蜜桃在线| 日本午夜精品| 日韩精品在线一区| 五月天激情播播| 日本欧美一区| 欧美日韩国产影院| 国产精品久久久久久久乖乖| 二区三区四区高清视频在线观看| 日本一区二区三区视频视频| 欧美日产一区二区三区在线观看| 国产91绿帽单男绿奴| 国产乱子伦视频一区二区三区 | 国产精品老熟女视频一区二区| 久久高清一区| 78色国产精品| 国产成人一区二区三区影院在线| 欧美在线亚洲| 久久成人免费视频| 日韩福利小视频| 久久精品高清| y97精品国产97久久久久久| www久久久久久久| av中文一区| 国产午夜精品全部视频在线播放| 中国毛片在线观看| 国产探花在线精品一区二区| 亚洲片在线观看| 草草影院第一页| 妖精视频一区二区三区| 亚洲美女激情视频| 精品无码人妻一区二区免费蜜桃 | 99热亚洲精品| 91www在线| 天天影视色香欲综合网老头| 成人黄色大片网站| 国产高清中文字幕在线| 午夜欧美2019年伦理| 国产69精品久久久久久久| 激情aⅴ欧美一区二区欲海潮 | 中文字幕一区2区3区| 日本女优在线视频一区二区| 国产区亚洲区欧美区| 国产露脸无套对白在线播放| 国产伦理精品不卡| 精品国产区在线| 青青草在线播放| 亚洲国产精品av| 日本特级黄色大片| 色老头在线观看| 精品美女永久免费视频| 国语对白做受xxxxx在线中国| 国产极品久久久久久久久波多结野| 欧美日韩免费不卡视频一区二区三区 | 小泽玛利亚av在线| 国产精选在线| 欧美性xxxxx极品少妇| 国产大片一区二区三区| 精品视频在线你懂得| 亚洲欧美国产高清va在线播| 制服丨自拍丨欧美丨动漫丨| 亚洲精品二区三区| 欧美伊久线香蕉线新在线| 最新中文字幕免费| 丁香天五香天堂综合| 欧美午夜精品久久久久免费视| 欧美videos极品另类| 五月天一区二区| 日韩精品视频一二三| 欧美色图五月天| www.亚洲男人天堂| 美日韩一二三区| 国内精品伊人久久久久av影院 | 综合在线视频| 欧美性受xxx| 99久久夜色精品国产亚洲| 2017欧美狠狠色| 激情六月天婷婷| 美女色狠狠久久| 日韩成人在线视频观看| 精品亚洲乱码一区二区| 亚洲一区网站| 成人精品水蜜桃| 午夜小视频在线| 欧美日韩一区二区免费视频| 性生交大片免费看l| 欧美日韩激情在线一区二区三区| 91精品国产电影| www.国产麻豆| 日韩一区在线免费观看| 久久精品午夜福利| 久草在线综合| 欧美国产亚洲精品久久久8v| 中文字幕第三页| 91亚洲精品久久久蜜桃网站 | av高清不卡| 欧美一级片在线观看| 精品日韩在线视频| 久久久精品日韩| 精品国产乱码一区二区三区四区| 国产美女情趣调教h一区二区| 欧美日韩国产经典色站一区二区三区| 欧洲女同同性吃奶| 午夜在线观看免费一区| 精品午夜一区二区| 97人人澡人人爽| 国产免费高清视频| 国产精品久久三| 高清一区在线观看| 国产成人精品免费视| 91精品国产91久久久久久久久| xxxx18国产| 亚洲精品成人a在线观看| 中文字幕第38页| 日韩欧美视频在线播放| 国产成人精品视频在线| 免费a级毛片在线观看| 婷婷一区二区三区| 免费黄色三级网站| 国产日本精品| 免费在线观看91| 精品91久久| 国产一区二区动漫| 中文天堂在线视频| 国产精品护士白丝一区av| 欧美黄色性生活| 日韩一区电影| 91麻豆国产精品| 午夜伦理在线视频| 欧美www视频| 日韩欧美性视频| 91蜜桃网址入口| 久草精品在线播放| 日韩欧美午夜| 亚洲一区二区在线| gogo久久| 亚洲女人天堂成人av在线| 四虎影院在线免费播放| 国产精品美女久久久久久2018| jizz大全欧美jizzcom| 亚洲国产精品久久久久蝴蝶传媒| 亚洲va久久久噜噜噜| sis001亚洲原创区| 亚洲男人的天堂在线| 五月天中文字幕| 亚洲视频一二三区| 高清中文字幕mv的电影| 亚洲综合二区| 亚洲日本japanese丝袜| 欧美大片91| 78色国产精品| 日本视频在线免费观看| 欧美成人一区二区三区 | 欧美性高潮床叫视频| 97人妻人人揉人人躁人人| 精品亚洲porn| 国产不卡一区二区视频| 精品久久美女| 91中文字精品一区二区| 中文字幕在线直播| 久久好看免费视频| 少妇一区二区三区四区| 欧美视频你懂的| 精品人妻在线播放| 欧美激情在线看| 第一页在线视频| 日韩高清电影一区| 激情五月婷婷六月| 日韩精品一卡| 久久精品丝袜高跟鞋| 国产高清亚洲| 日本高清视频一区| 在线āv视频| 在线中文字幕日韩| 人妻无码一区二区三区久久99| 91久久精品一区二区三| 久久久精品国产sm调教网站| 国产欧美日韩久久| 精品国产电影一区二区| 日韩女优一区二区| 久久久另类综合| 绯色av蜜臀vs少妇| 蜜桃一区二区三区在线观看| 2018国产在线| 最新国产精品| 亚洲一卡二卡三卡| 久操成人av| 国新精品乱码一区二区三区18| 四虎成人精品一区二区免费网站| 97成人超碰免| 深夜国产在线播放| 午夜国产在线视频| 精品乱人伦一区二区三区| 一道本在线视频| 日本精品视频一区二区三区| 日本网站在线免费观看| 亚洲欧美日韩国产手机在线| 黑人と日本人の交わりビデオ| 99久久精品一区| 中文字幕第66页| 久久99热99| 欧美三级午夜理伦三级富婆| 麻豆91精品| 女人天堂av手机在线| 欧美区亚洲区| 97av中文字幕| 欧美成人国产| 天天干天天色天天爽| 天天射成人网| 手机福利在线视频| 91偷拍一区二区三区精品| 天堂社区 天堂综合网 天堂资源最新版 | 国产亚洲精品久久久久久豆腐| 91女厕偷拍女厕偷拍高清| 中国免费黄色片| 成人99免费视频| 91黄色免费视频| 91在线一区二区| 91视频免费观看网站| 久久久久久久久久久久久久久99| 女尊高h男高潮呻吟| 久久伊人中文字幕| 黄色aaa视频| 国产欧美中文在线| 美国一级黄色录像| 国产精品理论在线观看| 娇小11一12╳yⅹ╳毛片| 中文久久乱码一区二区| 99热在线观看精品| 亚洲欧美日韩国产一区二区三区| 精品国产精品国产精品| 亚洲乱码国产乱码精品精可以看| 久久久久久久久毛片| 亚洲最大成人综合| 日韩乱码在线观看| 91黄色免费观看| 中文永久免费观看| 91精品国产91综合久久蜜臀| 精品国产伦一区二区三| 亚洲电影免费观看高清完整版在线观看| 日本免费网站在线观看| 亚洲摸下面视频| 麻豆网站在线看| 久久久久久久97| 一根才成人网| 国产美女高潮久久白浆| 日本一区精品视频| 国产一区免费观看| 欧美伦理在线视频| 日本福利视频在线观看| 一区二区三区导航| 在线观看免费黄网站| 国产精品一区二区男女羞羞无遮挡| 国产性猛交96| 久久精品视频在线看| 极品久久久久久| 色综合激情久久| 99热这里只有精品在线| 亚洲欧美一区二区三区四区| 暖暖日本在线观看| 97精品一区二区视频在线观看| 主播大秀视频在线观看一区二区| 92国产精品久久久久首页| 日韩精品免费一区二区三区竹菊 | 久久精品电影网| 国产高清在线a视频大全 | 男操女视频网站| 欧美一级黄色大片| 国产三级视频在线看| 欧美精品免费看| 97人人做人人爽香蕉精品| av在线亚洲男人的天堂| 成人羞羞视频在线看网址| 17c丨国产丨精品视频| 欧美aⅴ一区二区三区视频| 在线观看免费视频国产| 一区在线观看免费| 日韩在线播放中文字幕| 日韩精品一区二区三区三区免费| 国产免费a∨片在线观看不卡| 欧美激情aaaa| 日韩三级一区| 欧美精品v日韩精品v国产精品| 欧美精品大片| 亚洲精品性视频| 久久久久久久综合| 久久精品国产亚洲AV无码麻豆| 欧美日韩国产精品自在自线| 欧美扣逼视频| 91国产美女视频| 中文字幕一区日韩精品| 在线视频欧美一区| 日韩av一区二区三区四区| 成人免费无码大片a毛片| 一区二区欧美国产| 国产男女猛烈无遮挡| 日韩在线欧美在线| 国产麻豆久久| 欧美日韩在线不卡一区| 亚洲理伦在线| 星空大象在线观看免费播放| 亚洲精品欧美综合四区| 国产欧美综合视频| 精品国产一区二区三区四区在线观看 | 亚洲色图欧洲色图| 亚洲最大成人在线视频| 中文字幕av一区中文字幕天堂| 黄色综合网址| 欧美日韩高清在线一区| 亚洲男女自偷自拍| 91视频啊啊啊| 欧美日韩国产丝袜另类| 水莓100国产免费av在线播放| 久久免费视频在线| 麻豆精品av| 免费看一级大黄情大片| 99久久精品情趣| 久久精品无码av| 亚洲欧美福利视频| 成人四虎影院| 亚洲精品一卡二卡三卡四卡| 美女免费视频一区| 日本精品在线免费观看| 欧美日本韩国一区| av成人手机在线| 成人在线精品视频| 91九色精品国产一区二区| 亚洲熟女乱综合一区二区| 一区二区三区小说| 无码国产伦一区二区三区视频 | 久久久成人精品一区二区三区 | 丝袜中文在线| 国产亚洲情侣一区二区无| 国产精品一区毛片| 69视频在线观看免费| 欧美性感一区二区三区| 黄色网在线免费观看| 91精品国产综合久久久久久丝袜| 国产精品激情| 爱爱免费小视频| 欧美日韩国产不卡| 羞羞的视频在线看| 国产乱码精品一区二区三区日韩精品 | 欧美日韩精品专区| 无码精品黑人一区二区三区 | 中文字幕精品在线播放| 成人免费视频网站在线观看| 天天综合网久久综合网| 中文字幕亚洲综合久久| 国产一区二区三区亚洲综合| 成人免费播放器| 久久久国产精华| 国产视频一二三四区| 2019最新中文字幕| 日韩精品dvd| 男男一级淫片免费播放| 欧美亚洲高清一区| 青青草原国产在线| 欧美日韩天天操| 国产一区不卡在线| 黄色在线免费观看| 欧美成aaa人片在线观看蜜臀| 欧美重口另类| 中文字幕55页| 一本一道久久a久久精品| 成年人黄视频在线观看| 欧美精品一区二区三区四区五区 | 国内外成人免费视频| 久久精品噜噜噜成人av农村| 国产一级一片免费播放放a| 中文精品99久久国产香蕉| 精品按摩偷拍|