博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java包装类自动拆装箱tips(-128到127缓存问题)
阅读量:2427 次
发布时间:2019-05-10

本文共 2676 字,大约阅读时间需要 8 分钟。

-128到127缓存问题

java包装类很多同学在日常的工作中都会大量使用,它将基本类型封装成对象后使其也能像普通对象一样具有面向对象的特性,但是也有一些tips需要注意。

java包装类中Integer和Long对-128到127的对象会先创建一个缓存池,在使用这个范围内的对象valueOf方法会直接返回缓存池中的对象,只有不在这个范围内的对象才重新创建。

以Integer的源代码为例,具体实现如下:

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() {
} }
public static Integer valueOf(int i) {
// 如果在-128 - 127,则返回缓存对象,如果不在则创建新的对象 if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
案例代码
public class PackClassTest {
public static void main(String[] args) {
System.out.println("-------Integer-----------"); Integer x = new Integer(123); Integer y = new Integer(123); System.out.println(x == y); System.out.println(x.equals(y)); System.out.println("-------------------"); Integer z = Integer.valueOf(123); Integer w = Integer.valueOf(123); System.out.println(z == w); System.out.println(z.equals(w)); System.out.println("--------Long-----------"); Long a = Long.valueOf(127); Long b = Long.valueOf(127); System.out.println(a == b); System.out.println(a.equals(b)); System.out.println("-------------------"); Long c = Long.valueOf(128); Long d = Long.valueOf(128); System.out.println(c == d); System.out.println(c.equals(d)); }}

运行结果:

-------Integer-----------falsetrue-------------------truetrue--------Long-----------truetrue-------------------falsetrue

转载地址:http://recmb.baihongyu.com/

你可能感兴趣的文章
@程序员,沟通这项核心技能你掌握了多少?
查看>>
2019,九问联想贺志强
查看>>
你可以忍受大城市 365 天的孤独,却不能忍受小城市 7 天的热闹
查看>>
35 岁程序员,年后第一天被辞退
查看>>
情人节她说:是的,嫁人当嫁程序员
查看>>
骚操作!代码写情诗 | 程序员有话说
查看>>
小程序卡卡卡?用这个方法后,渲染速度提升三倍!
查看>>
二线城市容不下程序员
查看>>
不要成为自己讨厌的那种程序员 | 程序员有话说
查看>>
为什么程序员下班后只关显示器从不关电脑?
查看>>
滴滴裁员 2000 人,具体补偿方案已出
查看>>
余生,做个不焦虑的程序员!
查看>>
世界排名第 3 的滴滴裁员,开春求职必知的独角兽排行榜
查看>>
Spring Boot 中的响应式编程和 WebFlux 入门
查看>>
阿里终结裁员危机!坚决不拿 10 万阿里人祭天!
查看>>
如何从零开始两天撸一个微信小程序?!(内含源码)
查看>>
女神?御姐?文艺?这样的程序媛你绝没见过! | 程序员有话说
查看>>
“软件外包城”下的马鞍山 | 程序员有话说
查看>>
那些上相亲网站的程序员,后来怎么样了?
查看>>
程序员如何实现财富自由?
查看>>