2014-01-24 1 views
2

Я получил вопрос Java во время моего интервью, как показано нижеОперация сложения в классе Java Integer

public static boolean isSame(Integer a, Integer b){ 
return a==b; 
} 

public static void main(String[] arg){ 
int i=0; 
for(int j=0;i<500;++i,++j){ 
    if(isSame(i,j)){ 
     continue; 
    } 
    else break; 
    } 
} 

Вопрос является «я =?» в конце концов.

Я думал, что буду 500. Но когда я попробовал это в Eclipse i = 128!

Так что мне было интересно, что здесь происходит.

Благодаря

ответ

7

Integer Сравнение двух объектов с помощью == будет возвращать только true если они являются же объект (т.е. же точным, например), то есть независимо от их стоимости .

Однако значения -128 к 127 являются кэшируются, поэтому автоматический бокс эти значения (что происходит, когда вы передаете int в качестве Integer параметра) всегда возвращает экземпляр Integerже для заданного значения ,

Значения вне этого диапазона всегда приводят к созданию нового экземпляра Integer.

+0

я не знаю значения могут быть кэшируются !! Спасибо, богемский !!! –

+1

[JLS §5.1.7] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7) гарантирует, что -128..127 кэшируются но также утверждает, что «Меньшие реализации с ограничением памяти могут, например, кэшировать все значения char и short, а также значения int и long в диапазоне от -32K до + 32K». Поэтому лучше не полагаться на ценности снаружи. – zapl

+0

Итак, правильный ответ на этот вопрос интервью с ОП - «зависит от реализации» (возможно с дополнительной записью «но не менее 128» - 128, потому что это больше, чем максимальное кэшированное значение) –

0

Это из-за автоматического бокса.

Если значение p в коробке равно true, false, байт, символ в диапазоне \ u0000 to \ u007f или int или short number между -128 и 127, то пусть r1 и r2 будут результатом любые два преобразования бокса на стр. Всегда бывает, что r1 == r2.

Чтобы узнать больше об авто боксе, см. Здесь.

http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7

1

исходный код:

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

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); 
} 
Смежные вопросы