最近闲来无事 和同事们一起讨论面试题的时候我们老大说了一个Integer在128以下直接初始两个值比较为TRUE还是FALSE
其实我老早就知道 在127以下比较都为true 但是具体为什么还真没了解过 那么接下来咱们一起探讨探讨。
很简单的一段代码 结果是为true 具体为什么呢 咱们先来看下被编译的class文件是什么样
import com.ahhuage.dddriver.operate.core.kits.SmsKit;
import java.io.PrintStream;
import javax.annotation.Resource;
import org.junit.Ignore;
import org.junit.Test;
@Ignore
public class orderTest
public static void main(String[] args)
throws Exception
{
Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
System.out.println("a==b\t" + (a == b));
}
可以看到 Integer a = 127 被编译后被改成了 Integer a = Integer.valueOf(127); 那么我们再来看看Integer.valueOf的源码
红色框里的注释经过翻译后大致意思为 (*此方法将始终缓存-128到127范围内的值,包含,并且可能缓存此范围之外的其他值) 并且看到如果接收到的值是大于等于最小值小于等于最大值 那么就直接存入缓存 否则的话是直接new 一个出来
再来看下其最小值是固定死的 static final int low = -128 但是最大值是可以设置的 源码里有这么一段注释 (被我用红色框住的 ) 可以更改参数 -XX:AutoBoxCacheMax=<Size> 来设置缓存最大值 好 既然这么说了那咱么接下来就试一试
现在idea中更改设置最大值为1000 继续执行接下来的代码
public static void main(String[] args) throws Exception {
Integer a = 127;
Integer b = 127;
System.out.println("a==b\t"+(a == b));
Integer c = 128;
Integer d = 128;
System.out.println("c==d\t"+(c == d));
Integer g = 1000;
Integer h = 1000;
System.out.println("g==h\t"+(g == h));
Integer i = 1001;
Integer j = 1001;
System.out.println("i==j\t"+(i == j));
}
结果发现 果然生效了 证明缓存最大值是可以修改且生效的