public class Flik {
/** @param a Value 1
* @param b Value 2
* @return Whether a and b are the same */
public static boolean isSameNumber(Integer a, Integer b) {
return a ==b ;
}
}
当为-128-127都可通过,128却不能通过。
import org.junit.Test;
import static org.junit.Assert.assertTrue;
public class FilkTest {
private Integer a, b;
private String expected;
private boolean actual;
@Test
public void isSameNumberTest(){
a = 1;
b = 1;
expected = "True";
actual = Flik.isSameNumber(a, b);
assertTrue(actual);
a = 128;
b = 128;
actual = Flik.isSameNumber(a, b);
assertTrue(actual);
}
}
原因是Integer类自动装箱缓存范围为-128-127的值,可以直接用“==”比较值,而128后是新的对象地址,需要用“equal”来比较。
public class Flik {
/** @param a Value 1
* @param b Value 2
* @return Whether a and b are the same */
// Integer.class再装载时,内部的IntegerCache的static块即将开始执行,实例化并暂存数值在-128,127之间的Integer类型对象。
// 这些常用数值在自动装箱时直接返回,从而提高效率,不用每次都要new一个新的对象。
public static boolean isSameNumber(Integer a, Integer b) {
return a.equal(b) ;
}
}