亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Hold住面試官之Integer Cache

Cheriselalala / 3078人閱讀

摘要:還有需要注意的一點(diǎn)是,此類緩存行為不僅存在于對(duì)象。還存在于其他的整數(shù)類型,,,。但是能改變緩存范圍的就只有了。

前言

最近跟許多朋友聊了下,在這個(gè)“跳槽”的黃金季節(jié),大家都有點(diǎn)蠢蠢欲動(dòng),所以最近就多聊聊面試的時(shí)候需要注意的一些問題,這些問題不一定多深?yuàn)W,多復(fù)雜,但是一不注意的話卻容易掉坑。下面看一下面試的時(shí)候經(jīng)常遇到的一段代碼:

public class IntegerDemo {
    public static void main(String[] args) {
        Integer numA = 127;
        Integer numB = 127;

        Integer numC = 128;
        Integer numD = 128;

        System.out.println("numA == numB : "+ (numA == numB));
        System.out.println("numC == numD : "+ (numC == numD));
    }
}

根據(jù)大家以往的經(jīng)驗(yàn),會(huì)認(rèn)為上面的代碼用“==“符號(hào)來比較,對(duì)比的是對(duì)象的引用,那么ABCD是不同的對(duì)象,所以輸出當(dāng)然是false了。我在《“==”、“equals()”、“hashcode()”之間的秘密》這篇文章也討論過。那么事實(shí)也是如此嗎?下面看一下輸出結(jié)果:

numA == numB : true
numC == numD : false

What?這個(gè)輸出結(jié)果怎么跟以往的認(rèn)知有所出入呢?在我們的代碼“Integer numA = 127”中,編譯器會(huì)把基本數(shù)據(jù)的“自動(dòng)裝箱”(autoboxing)成包裝類,所以這行代碼就等價(jià)于“Integer numA = Integer.valueOf(127)”了,這樣我們就可以進(jìn)入valueOf方法查看它的實(shí)現(xiàn)原理。

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

//Integer靜態(tài)內(nèi)部類
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() {}
        }

從上面的源碼可以看到,valueOf方法會(huì)先判斷傳進(jìn)來的參數(shù)是否在IntegerCache的low與high之間,如果是的話就返回cache數(shù)組里面的緩存值,不是的話就new Integer(i)返回。

那我們?cè)偻峡匆幌翴ntegerCache,它是Integer的內(nèi)部靜態(tài)類,low默認(rèn)是-128,high的值默認(rèn)127,但是high可以通過JVM啟動(dòng)參數(shù)XX:AutoBoxCacheMax=size來修改(如圖),如果我們按照這樣修改了,然后再次執(zhí)行上面代碼,這時(shí)候2次輸出都是true,因?yàn)榫彺娴膮^(qū)間變成-128~200了。

但是如果我們是通過構(gòu)造器來生成一個(gè)Integer對(duì)象的話,下面的輸出都是false。因?yàn)檫@樣不會(huì)走ValueOf方法,所以按照正常的對(duì)象對(duì)比邏輯即可。

public class IntegerDemo {
    public static void main(String[] args) {
        Integer numA = new Integer(127);
        Integer numB = new Integer(127);

        Integer numC = new Integer(128);
        Integer numD = new Integer(128);

        System.out.println("numA == numB : "+ (numA == numB));//false
        System.out.println("numC == numD : "+ (numC == numD));//false
    }
}

還有需要注意的一點(diǎn)是,此類緩存行為不僅存在于Integer對(duì)象。還存在于其他的整數(shù)類型Byte,Short,Long,Character。但是能改變緩存范圍的就只有Integer了。

結(jié)語

有時(shí)候往往越簡(jiǎn)單的知識(shí)越容易掉坑里,所以要保持自己的求知欲,不斷鞏固的基礎(chǔ),才能讓自己在面試的時(shí)候不會(huì)栽跟頭。

文章始發(fā)于微信公眾號(hào)《深夜里的程序猿》,每天分享最干的干貨,轉(zhuǎn)載請(qǐng)注明出處,侵權(quán)必究。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/77509.html

相關(guān)文章

  • Tornado Demo 之 chatdemo 不完全解讀

    摘要:清楚了以上流程,我們直接來看函數(shù)主要用作初始化應(yīng)用監(jiān)聽端口以及啟動(dòng)。其中就是保存聊天室所有聊天消息的結(jié)構(gòu)。關(guān)于的解讀我會(huì)放到閱讀源碼時(shí)講。然后把消息加到緩存里,如果緩存大于限制則取最新的條消息。 tornado 源碼自帶了豐富的 demo ,這篇文章主要分析 demo 中的聊天室應(yīng)用: chatdemo 首先看 chatdemo 的目錄結(jié)構(gòu): ├── chatdemo.py ├── ...

    TesterHome 評(píng)論0 收藏0
  • IntegerCache

    摘要:類實(shí)際上是中中的緩存類,目的是節(jié)省內(nèi)存消耗,提高程序性能。而當(dāng)堆內(nèi)存中的對(duì)象存儲(chǔ)非常多時(shí),就有可能造成內(nèi)存泄漏。使用頻率高創(chuàng)建對(duì)象也就越多,堆內(nèi)存中的對(duì)象也就越多,所以也就會(huì)可能發(fā)生上述中的內(nèi)存溢出等問題。 面試題:?jiǎn)栆韵麓a輸出的結(jié)果是多少? public class IntegerTest { @Test public void test() { ...

    yiliang 評(píng)論0 收藏0
  • 踩坑記[持續(xù)更新]

    摘要:解決的中只有一個(gè)生命周期的鉤子也只有一句代碼報(bào)錯(cuò)中的就是整個(gè)組建中的原來是寫在了使用指令的后面所以此時(shí)還沒有在組件中注冊(cè)所以會(huì)報(bào)錯(cuò)誤正確代碼標(biāo)題這是一段內(nèi)容這是一段內(nèi)容這是一段內(nèi)容這是一段內(nèi)容。 用于記錄coding過程中遇到的比較難解決或者有意思的問題,包括前端/后端(Node/Db),會(huì)持續(xù)更新... 后端 Node redis集群模式下pipline報(bào)錯(cuò)(2019.3.14) ...

    0x584a 評(píng)論0 收藏0
  • 踩坑記[持續(xù)更新]

    摘要:解決的中只有一個(gè)生命周期的鉤子也只有一句代碼報(bào)錯(cuò)中的就是整個(gè)組建中的原來是寫在了使用指令的后面所以此時(shí)還沒有在組件中注冊(cè)所以會(huì)報(bào)錯(cuò)誤正確代碼標(biāo)題這是一段內(nèi)容這是一段內(nèi)容這是一段內(nèi)容這是一段內(nèi)容。 用于記錄coding過程中遇到的比較難解決或者有意思的問題,包括前端/后端(Node/Db),會(huì)持續(xù)更新... 后端 Node redis集群模式下pipline報(bào)錯(cuò)(2019.3.14) ...

    ckllj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<