亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Integer面試以及源碼分析

發布時間:2021-10-21 09:56:40 來源:億速云 閱讀:166 作者:柒染 欄目:大數據

本篇文章為大家展示了Integer面試以及源碼分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

場景:

??昨天有位朋友去面試,我問他面試問了哪些問題,其中問了Integer相關的問題,以下就是面試官問的問題,還有一些是我對此做了擴展。

問:兩個new Integer 128相等嗎?

答:不。因為Integer緩存池默認是-127-128;

問:可以修改Integer緩存池范圍嗎?如何修改?

答:可以。使用-Djava.lang.Integer.IntegerCache.high=300設置Integer緩存池大小

問:Integer緩存機制使用了哪種設計模式?

答:亨元模式;

問:Integer是如何獲取你設置的緩存池大小?

答:sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

問:sun.misc.VM.getSavedPropertySystem.getProperty有啥區別?

答:唯一的區別是,System.getProperty只能獲取非內部的配置信息;例如java.lang.Integer.IntegerCache.highsun.zip.disableMemoryMappingsun.java.launcher.diagsun.cds.enableSharedLookupCache等不能獲取,這些只能使用sun.misc.VM.getSavedProperty獲取

Integer初始化源碼分析:

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() {}
}

VM.class源碼分析:

初始化:
static {
    allowArraySyntax = defaultAllowArraySyntax;
    savedProps = new Properties();
    finalRefCount = 0;
    peakFinalRefCount = 0;
    initialize();
}
getSavedProperty方法:
public static String getSavedProperty(String var0) {
    if (savedProps.isEmpty()) {
        throw new IllegalStateException("Should be non-empty if initialized");
    } else {
        return savedProps.getProperty(var0);
}
savedProps.getProperty方法:
public String getProperty(String key) {
    Object oval = super.get(key);
    String sval = (oval instanceof String) ? (String)oval : null;
    return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
}
System.java源碼分析:
/**
 * 初始化系統類。 線程初始化后調用。
 */
private static void initializeSystemClass() {

    /**
     * VM可能會調用JNU_NewStringPlatform()來在“props”初始化期間設置那些編碼敏感屬性(user.home,user.name,boot.class.path等),
     * 它們可能需要通過System.getProperty()進行訪問, 在初始化的早期階段已經初始化(放入“props”)的相關系統編碼屬性。
     * 因此,請確保初始化時可以使用“props”,并直接將所有系統屬性放入其中。
     */
    props = new Properties();
    initProperties(props);  // initialized by the VM

    /**
     * 某些系統配置可以由VM選項控制,例如用于支持自動裝箱的對象標識語義的最大直接內存量和整數高速緩存大小。 通常,庫將獲得這些值
     * 來自VM設置的屬性。 如果屬性是
     * 僅限內部實現使用,應從系統屬性中刪除這些屬性。
     *
     *   請參閱java.lang.Integer.IntegerCache和
     *   例如,sun.misc.VM.saveAndRemoveProperties方法。
     *
     *   保存系統屬性對象的私有副本,該副本只能由內部實現訪問。 去掉
     * 某些不適合公共訪問的系統屬性。
     */
    sun.misc.VM.saveAndRemoveProperties(props);


    lineSeparator = props.getProperty("line.separator");
    sun.misc.Version.init();

    FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
    FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
    FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
    setIn0(new BufferedInputStream(fdIn));
    setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
    setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding")));

    /**
     * 現在加載zip庫,以防止java.util.zip.ZipFile稍后嘗試使用它來加載此庫。
     */
    loadLibrary("zip");

    // 為HUP,TERM和INT(如果可用)設置Java信號處理程序。
    Terminator.setup();

    /**
     * 初始化需要為類庫設置的任何錯誤的操作系統設置。
     * 目前,除了在使用java.io類之前設置了進程范圍錯誤模式的Windows之外,這在任何地方都是無操作的。
     */
    sun.misc.VM.initializeOSEnvironment();

    /**
     * 主線程沒有像其他線程一樣添加到其線程組中; 我們必須在這里自己做。
     */
    Thread current = Thread.currentThread();
    current.getThreadGroup().add(current);

    // 注冊共享秘密
    setJavaLangAccess();

    /**
     * 在初始化期間調用的子系統可以調用sun.misc.VM.isBooted(),以避免執行應該等到應用程序類加載器設置完畢的事情。
     * 重要信息:確保這仍然是最后一次初始化操作!
     */
    sun.misc.VM.booted();
}

重點看這句:sun.misc.VM.saveAndRemoveProperties(props);他會移除系統內部使用的配置,咱們來看看源碼是如何操作的。

sun.misc.VM.saveAndRemoveProperties方法:
public static void saveAndRemoveProperties(Properties var0) {
    if (booted) {
        throw new IllegalStateException("System initialization has completed");
    } else {
        savedProps.putAll(var0);
        String var1 = (String)var0.remove("sun.nio.MaxDirectMemorySize");
        if (var1 != null) {
            if (var1.equals("-1")) {
                directMemory = Runtime.getRuntime().maxMemory();
            } else {
                long var2 = Long.parseLong(var1);
                if (var2 > -1L) {
                    directMemory = var2;
                }
            }
        }

        var1 = (String)var0.remove("sun.nio.PageAlignDirectMemory");
        if ("true".equals(var1)) {
            pageAlignDirectMemory = true;
        }

        var1 = var0.getProperty("sun.lang.ClassLoader.allowArraySyntax");
        allowArraySyntax = var1 == null ? defaultAllowArraySyntax : Boolean.parseBoolean(var1);
        //移除內部使用的配置,不應該讓看到這些配置信息
        var0.remove("java.lang.Integer.IntegerCache.high");
        var0.remove("sun.zip.disableMemoryMapping");
        var0.remove("sun.java.launcher.diag");
        var0.remove("sun.cds.enableSharedLookupCache");
    }
}

上述內容就是Integer面試以及源碼分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石家庄市| 临沭县| 新沂市| 肃北| 巧家县| 大埔区| 八宿县| 福建省| 定边县| 莲花县| 昭苏县| 柘城县| 库车县| 体育| 瑞昌市| 嘉祥县| 延长县| 铁力市| 永顺县| 苍溪县| 沿河| 昌黎县| 阳曲县| 平顺县| 武清区| 玉门市| 米易县| 定南县| 阿合奇县| 旬邑县| 望城县| 盘山县| 阿拉尔市| 化州市| 嘉义市| 吉水县| 乌恰县| 山东省| 金塔县| 石河子市| 东台市|