Java包装类的缓存机制原理实例详解

Java包装类的缓存机制原理实例详解

这篇文章主要介绍了Java包装类的缓存机制原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

java 包装类的缓存机制,是在Java 5中引入的一个有助于节省内存、提高性能的功能Java包装类的缓存机制原理实例详解,只有在自动装箱时有效

包装类

举个栗子:

Integer a = 127;
Integer b = 127;
System.out.println(a == b);

这段代码输出的结果为true

使用自动装箱将基本类型转为封装类对象这个过程其实底层实现是调用封装类的方法:

a =127; 相当于 a = .(127);

看一下的方法:

public static Integer valueOf(int i) {
  if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + (-IntegerCache.low)];
  return new Integer(i);
}

如果入参 i 大于等于.low或者小于等于.high),就从中获取对象

看一下:

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 = 127;
  }

java缓存技术实例

private IntegerCache() {} }

默认范围为:-128到127之间,范围的最大值可以通过java.lang…high设置,通过for循环将范围内的数据实例化为对象放到cache数组里

在测试一下:

Integer a = 128;
Integer b = 128;
System.out.println(a == b);

输出结果为falsejava缓存技术实例,所以如果没有指定cache最大值时,在-128到127之间使用自动装箱时,会使用缓存

Byte包装类

再举个栗子:

public static void main(String[] args) {
  Byte a = 127;
  Byte b = 127;
  System.out.println(a == b); //true
}

由于Byte范围在-128到127之间,所以Byte的都是从缓存中获取的

public static Byte valueOf(byte b) {
  final int offset = 128;
  return ByteCache.cache[(int)b + offset];
}

类:

private static class ByteCache {
  private ByteCache(){}
  static final Byte cache[] = new Byte[-(-128) + 127 + 1];
  static {
    for(int i = 0; i < cache.length; i++)
      cache[i] = new Byte((byte)(i - 128));
  }
}

与相比,的最大值是不能修改的就是127

Short包装类

public static Short valueOf(short s) {
  final int offset = 128;
  int sAsInt = s;
  if (sAsInt >= -128 && sAsInt <= 127) { // must cache
    return ShortCache.cache[sAsInt + offset];
  }
  return new Short(s);
}

类:

private static class ShortCache {
  private ShortCache(){}
  static final Short cache[] = new Short[-(-128) + 127 + 1];
  static {

java缓存技术实例

for(int i = 0; i < cache.length; i++) cache[i] = new Short((short)(i - 128)); } }

的最大值也不可以修改,范围只能在-128 ~ 127之间

Long包装类的方法和类与Short包装类的实现一致java缓存技术实例,范围也是只能在-128 ~ 127之间

包装类

方法:

public static Character valueOf(char c) {
  if (c <= 127) { // must cache
    return CharacterCache.cache[(int)c];
  }
  return new Character(c);
}

类:

private static class CharacterCache {
  private CharacterCache(){}
  static final Character cache[] = new Character[127 + 1];
  static {
    for (int i = 0; i < cache.length; i++)
      cache[i] = new Character((char)i);
  }
}

的缓存范围在0 ~ 127之间

包装类

方法:

public static Boolean valueOf(boolean b) {
  return (b ? TRUE : FALSE);
}

TRUE跟FALSE都是 final修饰的静态变量

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

Float包装类 & 包装类

方法:

public static Float valueOf(float f) {
  return new Float(f);
}
public static Double valueOf(double d) {
  return new Double(d);
}

Float和没有使用缓存,直接new的对象

总结:

java的包装类中:Byte,Shortjava缓存技术实例,,LongJava包装类的缓存机制原理实例详解,使用代码块进行初始化缓存,其中的最大值可以通过java.lang…high设置;使用 final实例化的对象;Float和直接new的对象没有使用缓存

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » Java包装类的缓存机制原理实例详解

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们