Integer IntegerCache源码阅读
程序员文章站
2023-12-17 23:49:28
先看一段测试结果:
/*public static void main(string[] args) {
integer a = 128, b = 12...
先看一段测试结果:
/*public static void main(string[] args) { integer a = 128, b = 128; integer c = 127, d = 127; system.out.println(a == b);//false system.out.println(c == d);//true }*/ /*public static void main(string[] args) { integer int1 = integer.valueof("100"); integer int2 = integer.valueof("100"); system.out.println(int1 == int2);//true }*/ public static void main(string[] args) { integer int1 = integer.valueof("300"); integer int2 = integer.valueof("300"); system.out.println(int1 == int2);//false }
jdk的源码如下:
public static integer valueof(string s) throws numberformatexception { return integer.valueof(parseint(s, 10)); } public static integer valueof(int i) { if (i >= integercache.low && i <= integercache.high) return integercache.cache[i + (-integercache.low)]; return new integer(i); }
发现里面另有玄机,多了个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) { 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() {} }
原来integer把-128到127(可调)的整数都提前实例化了。
这就解释了答案,原来你不管创建多少个这个范围内的integer用valueof出来的都是同一个对象。
但是为什么jdk要这么多此一举呢? 我们仔细想想, 淘宝的商品大多数都是100以内的价格, 一天后台服务器会new多少个这个的integer, 用了integercache,就减少了new的时间也就提升了效率。同时jdk还提供cache中high值得可配置,
这无疑提高了灵活性,方便对jvm进行优化。
总结
以上就是本文关于integer integercache源码阅读的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!