1. 程式人生 > >Java之Integer內部快取

Java之Integer內部快取

在Java中,每次建立物件都要進行記憶體分配操作,為了減少頻繁地建立物件,許多地方採用池來存放物件,如String中的字串池,對於基本型別,對應的包裝類中皆有快取來避免頻繁建立物件,如Integer。
Integer中的靜態內部類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) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127
); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low)); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new
Integer(j++); } private IntegerCache() {} }

這個類的作用就是快取-128~127這些常用數值,當呼叫valueOf(int i)方法時,先檢視是否在此範圍內,如果是,從池中返回,不是則新建物件,如下:

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

但是,如果直接使用new建立物件,則不會從快取中查詢,如下:

/**
 * @Auothor wzx
 * @Date 2017/3/12 0012
 */
public class IntegerTest {

    @Test
    public void test() {
        Integer i1 = 10;
        Integer i2 = Integer.valueOf(10);
        Integer i3 = new Integer(10);
        System.out.println(i1 == i2);
        System.out.println(i2 == i3);
    }

}

輸出結果:

true
false

此外,還可以設定vm引數來設定快取的最大值,如:

-Djava.lang.Integer.IntegerCache.high=2000

相關推薦

JavaInteger內部快取

在Java中,每次建立物件都要進行記憶體分配操作,為了減少頻繁地建立物件,許多地方採用池來存放物件,如String中的字串池,對於基本型別,對應的包裝類中皆有快取來避免頻繁建立物件,如Integer。 Integer中的靜態內部類IntegerCache原始碼

JAVAInteger快取機制

Integer的快取機制: Integer是對小資料(-128~127)是有快取的,再jvm初始化的時候,資料-128~127之間的數字便被快取到了本地記憶體中,如果初始化-128~127之間的數字,會直接從記憶體中取出,不需要新建一個物件. public static v

javaInteger類的注意點。

//突然間發現微軟字型的簡體和繁體的更改和eclipse的Format的快捷鍵一樣。。難受的一批。 //你上面這幾句話,最後編譯後其實是這樣的。 Integer i = Integer.valueOf(12338); Integer j = Integer.valueOf(12338); /

JAVA編寫簡單快取

一、問題          這幾天寫webservice提供介面時                  問題:當前臺通過條件呼叫介面查詢資料時,查詢的資料量太大。                   為

JavaInteger數值比較

工作中偶然遇到下面的問題,mark以下 Integer數值比較。下面展示測試程式碼。 public static void main(String[]args){ testInteger(); } public

Java使用Integer類中的parseInt()方法將字符串轉換為基本數據類型

javaimport java.util.*; public class SystemInfo { public static void main(String[] args) { Properties sp = System.getProperties();

【神奇現象】java整型數的神奇內部快取

一、常量與物件的比較 這樣的程式碼結果會是什麼? int a = 1000,b=1000; System.out.println(a == b);//1 Integer c = 1000, d = 1000; Sys

Java學習筆記Integer

Integer為基礎型別int的包裝型別,int基礎型別的預設值為0,Integer包裝型別的預設值為null。 Integer數值範圍 佔用空間:32位/8=4位元組 (31數值位+1位符號位) 最小值定義為MIN_VALUE = 0x80000000

深入學習java原始碼Integer.parseInt()與Integer.valueOf()

深入學習java原始碼之Integer.parseInt()與Integer.valueOf() Integer類包裝一個物件中的原始型別int的值。 型別為Integer的物件包含一個單一欄位,其型別為int 。  此外,該類還提供了一些將int轉換為String和String轉換為

java基礎Integer.parseInt(String s ,int radix)方法使用解釋

方法parseInt(String s,int radix)的目的是輸出一個十進位制數,這個數字是“String s”但是我們要知道他是多少進位制的,而方法中“int radix”引數正是來表達這個資訊的。 比如:parseInt(1010,2) 意思就是:輸出2進位制數1

Spring Bootapplication.properites的failed to convert java.lang.String to java.lang.Integer問題解決

環境描述 Spring Boot 2.0.4.RELEASE 問題描述 新建立了一個Spring Boot的Web應用,在pom.xml中的profile中配置了web server的埠,並在application.properties中配置了對應的

java基礎Integer的封包、拆包和反射

先看一段程式碼例子: public static void main(String[] args) { Integer a1 = 1; Integer b1 = 2; Integer a2 = 1000; I

Java裝箱拆箱Integer和int的區別

面向物件的Java,為了程式設計的方便為每一個基本資料型別都引入了對應的包裝型別,提供了拆箱和裝箱的語法糖,而int的包裝類就是Integer。一、基本區別Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null。二、其他區別public static

理解Java Integer快取策略

本文將介紹 Java 中 Integer 快取的相關知識。這是 Java 5 中引入的一個有助於節省記憶體、提高效能的特性。 首先看一個使用 Integer 的示例程式碼,展示了 Integer 的快取行為。接著我們將學習這種實現的原因和目的。你可以先猜猜下面 Java 程

java對數組排序

ner out mce 冒泡 can scan arr tin r語 一、在運行時輸入數組 import java.util.*; //也可以寫成 import java.util.Scanner; public class px { public static vo

Java路 ——初識Eclipse

cti 文章 啟動 eve 技術分享 win 恢復 高手 復制 零、大綱 一、前言 二、獲取Eclipse 三、運行Eclipse 四、創建及運行第一個Java Project 五、界面介紹 六、如何調試 七、獲取插件 八、Eclipse 快捷鍵 九、總結

javalist源代碼淺析

target lec http 失效 頭節點 就會 ide ctc linked 三大數據結構鏈表、樹和圖,順序表作為當中的一種,能夠說是平時編程中最長使用到的。List接口是順序表在java中的實現。它有非常多子接口和實現類,平時的編程中使用起來非常方便。可是更進一步

JavaInteger和int比較大小出現的錯誤

最好 裏的 pan 轉換 als 範圍 urn 返回 錯誤 Java在某一處維護著一個常量池,(我記得)在小於128的範圍內,直接用 1 Integer i = 100; 2 int j = 100; 3 return i == j;//true 這裏返回的是true.

Java

-m learn java語言 方便 font style scu 同學 together 省賽結束之後有相當長一段空閑時間,於是就想先提前自學一點Java語言的知識,在這裏紀錄一下學習過程,希望能給自學Java的同學提供一點小幫助!(當然,也能方便我以後的復習用^_^)

Java 變量和常量

family 三種 進行 字符 hello 是個 用途 習慣 起名字 Java中的關鍵字: Java 語言中有一些具有特殊用途的詞被稱為關鍵字。關鍵字對 Java 的編譯器有著特殊的意義,在程序中應用時一定要慎重哦!! Java 中常用關鍵字: 問:這麽多,記不住