小编给大家分享一下Java中整数类的IntegerCache的作用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<强> Java中整数类的IntegerCache的作用强>
包名:. lang
文件名:整数。java
方法名:IntegerCache
方法的代码如下:
private static class IntegerCache {, static final  int 高, static final  Integer 缓存[], {static final int low =, -128,,//,high value may  be configured by property int h =,, 127; if (integerCacheHighPropValue !=, null), {,//,Use Long.decode  here 用avoid invoking methods that //,require 整数# 39;s autoboxing cache 用be initialized int 小姐:=,Long.decode (integerCacheHighPropValue) .intValue (),, 小姐:=,Math.max(我,127,),,//,Maximum array size  is Integer.MAX_VALUE 时间=h Math.min(我,Integer.MAX_VALUE 作用;低),, }, high =, h,, 时间=cache new 整数((high 作用;低),+,1];, int j =时间低;大敌;; (int k =, 0;, k & lt;, cache.length;, k + +), 缓存[k],=, new 整数(+ +),, }, private IntegerCache (), {}, }
我们在代码中看到,低为-128,高为127年,这样的话,在Java编程中,如果要使用-128 - 127这个区间的对象的话,是直接使用这个缓存中的对象的。
上面是段简单的介绍,帮助大家理解下IntegerCache、下面开始本文的正文:
<强>引言强>
5年前,我在匈牙利上发表了一篇关于JDK中如何改变IntegerCache的文章。这种做法其实是深入进Java运行时,在实际并没有使用的场景。当你开发这些研究代码时,你才能更好的理解反射是如何工作的,以及整数类是如何实现的。
Integer类有一个私有的嵌套内,名为IntegerCache,包含了值从-127到128的整数对象。
当代码需要从int类型封箱成整数对象,而且值在这个范围内时,那么Java运行时会使用这个缓存,而不是创建一个新的整数对象。这主要是处于性能优化的考虑,我们必须牢记在心的是很多int值在程序中很多时候都处于这个范围内(例如数组的下标索引)。
这样做的副作用是,很多时候,使用等号操作符来比较两个整数对象时,只要值在范围内都是有效的。这在单元测试中很典型。而在运行模式下,当数值大于128时,代码执行会失败。
使用反射来访问IntegerCache类时会导致一些奇怪的副作用,注意这会影响到整个JVM的。如果一个Servlet重新定义了小的整数缓存值,那么所有运行在同一个Tomcat下的其他Servlet也遭遇同样问题。
在卢卡斯埃德尔和Sitepoint上面还有其他一些文章描述此问题。
现在我已经开始在玩弄Java 9的早期发布版本,在我脑海里我一直要做的就是对新Java版的本进行各种实验。在开始之前,让我们先看看在Java 8中的做法。
在卢卡斯的文章中,我将他的示例代码贴在此处:
import java.lang.reflect.Field; import java.util.Random; public class  Entropy { ,public static  void main (String [], args) ,throws Exception  { ,//Extract 从而IntegerCache through 反射 ,Class & lt; & lt;, ?,祝辞,clazz =, forname ( “java.lang.Integer IntegerCache"美元;才能); ,Field Field =, clazz.getDeclaredField (“cache"); ,field.setAccessible(真正的); ,整数[]cache =,(整数[]),field.get (clazz); ,//Rewrite 从而Integer 缓存 ,for (int 小姐:=,0;,小姐:& lt;, cache.length;,我+ +),{ 缓存才能[我],=,new 整数( new 才能;随机().nextInt (cache.length)); ,} ,//Prove 随机性 ,for (int 小姐:=,0;,小姐:& lt;, 10;,我+ +),{ System.out.println才能((整数),我); ,} ,} }
此代码通过反射方式访问IntegerCache,然后使用随机值对缓存进行填充(淘气!)。
我们尝试在Java 9中执行相同的代码,别指望有什么乐趣。当有人尝试违反它时会发现Java 9的限制更加严格。
Exception 拷贝thread “main", java.lang.reflect.InaccessibleObjectException: 用,Unable  make field  static final java.lang.Integer [] java.lang.Integer IntegerCache.cache美元 ,访问:module java.base  does not “opens java.lang",用unnamed module @1bc6a36eJava中整数类的IntegerCache的作用