2015-04-14 12 views
17

Sappiamo tutti che Java ha una cache per Integer (e alcuni altri tipi) per il numero nell'intervallo [-128, 127] che sono considerati "comunemente usati".Perché la JVM consente di impostare il valore "alto" per IntegerCache, ma non il "basso"?

La cache è concepito come segue:

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

So che posso estendere il valore high dando un parametro alla JVM:

java -Djava.lang.Integer.IntegerCache.high=xxxx Aclass.class 

Quello che non capisco è il motivo non è possibile ignorare il valore low?

Si noti che non stavo cercando di trovare una soluzione alternativa, ma invece capire perché non è consentito per alcuni motivi oscuri.

risposta

10

Ha rilevato che esiste già un RFP non risolto su questo.

Joe Darcy ha commentato sulla questione:

È concepibile che sarebbe utile mettere in cache una più ampia gamma di numero negativo come pure, ma fino ad ora non c'è stato bisogno pressante da fare così.

Si noti che la richiesta di offerta offrono una soluzione povera, se mai qualcuno fosse interessato a utilizzare questo prima che sia gestito:

Nessuna soluzione possibile per aumentare la dimensione della cache oltre a implementare la propria cache e riferendosi a questo prima di andare alla classe java.lang.Integer. Questo ovviamente non è buono in quanto richiede chiamate ad altre classi anziché l'utilizzo predefinito di Integer.valueOf (int i) chiamata.

Problemi correlati