Java中整数类的IntegerCache的作用

  介绍

小编给大家分享一下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  @1bc6a36e

Java中整数类的IntegerCache的作用