Java经典面试题—— int 和 Integer 有什么区别?谈谈 Integer 的值缓存范围
创始人
2024-05-29 19:24:53
0

典型回答

int 是我们常说的整型数字,是 Java 的 8 个原始数据类型(PrimitiveTypes,boolean、char、byte、short、int、long、float 和 double)之一。 Java 语言虽然号称一切都是对象,但原始数据类型是例外。

Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。在 Java5 中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java 可以根据上下文,自动进行转换,极大地简化了相关编程。

关于 Integer 的值缓存,这涉及 Java 5 中另一个改进。构建 Integer 对象的传统方式是直接调用构造器,直接 new 一个对象。但是根据实践,我们发现大部分数据操作都是集中在有限的、较小的数值范围,因而,在 Java 5 中新增了静态工厂方法 valueOf ,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。按照 Javadoc,这个值默认缓存是 -128 到 127 之间。

知识扩展

Java 使用的不同阶段:编译阶段、运行时,自动装箱 / 自动拆箱是发生在什么阶段?

自动装箱实际上算是一种 语法糖。什么是 语法糖?可以简单理解为 Java 平台为我们自动进行了一些转换,保证不同的写法在运行时等价,它们发生在 编译阶段 ,也就是生成的字节码是一致的。

我在前面提到使用静态工厂方法 valueOf 会使用到缓存机制,那么自动装箱的时候,缓存机制起作用吗?

javac 替我们自动把装箱转换为 Integer.valueOf(),把拆箱替换为 Integer.intValue(),既然调用的是 Integer.valueOf,自然能够得到缓存的好处。

Integer integer = 1;
int unboxing = integer ++;

反编译输出:

1: invokestatic  #2                  // Method
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: invokevirtual #3                  // Method
java/lang/Integer.intValue:()I

这种缓存机制并不是只有 Integer 才有,同样存在于其他的一些包装类,比如:

  • Boolean,缓存了 true/false 对应实例,确切说,只会返回两个常量实例 Boolean.TRUE/FALSE。
  • Short,同样是缓存了 -128 到 127 之间的数值。
  • Byte,数值有限,所以全部都被缓存。
  • Character,缓存范围’\u0000’ 到 ‘\u007F’。
自动装箱 / 自动拆箱似乎很酷,在编程实践中,有什么需要注意的吗?

原则上,建议避免无意中的装箱、拆箱行为,尤其是在性能敏感的场合,创建 10 万个 Java 对象和 10 万个整数的开销可不是一个数量级的,不管是内存使用还是处理速度,光是对象头的空间占用就已经是数量级的差距了。

为什么我们需要原始数据类型,Java 的对象似乎也很高效,应用中具体会产生哪些差异?

我们知道 Java 的对象都是引用类型,如果是一个原始数据类型数组,它在内存里是一段连续的内存,而对象数组则不然,数据存储的是引用,对象往往是分散地存储在堆的不同位置。这种设计虽然带来了极大灵活性,但是也导致了数据操作的低效,尤其是无法充分利用现代 CPU 缓存机制。

Java 为对象内建了各种多态、线程安全等方面的支持,但这不是所有场合的需求。使用原始数据类型、数组甚至本地代码实现等,在性能极度敏感的场景往往具有比较大的优势,用其替换掉包装类、动态数组(如 ArrayList)等可以作为性能优化的备选项。

相关内容

热门资讯

俄称乌无人机袭击莫斯科州设施 转自:证券时报人民财讯7月4日电,俄罗斯莫斯科州当局当地时间7月4日早上通报,乌克兰利用无人机袭击该...
美国取消对华芯片EDA软件出口... 作者 | 《财经》研究员 吴俊宇 周源 编辑 | 谢丽容  美国政府最担忧的是,中国产业界真正下决心...
东诚药业涨2.05%,成交额1... 7月4日,东诚药业盘中上涨2.05%,截至13:49,报14.93元/股,成交1.22亿元,换手率1...
伊以冲突后美国伊朗首次直接对话 转自:北京时间 【#伊以冲突后美国伊朗首次直接对话#】#...
金山云荣获“格隆汇金格奖·ES... 格隆汇7月4日|格隆汇2025中期策略会7月4-5日在深圳举行。活动期间颁发年度“格隆汇金格奖”,在...
网友在比利时偶遇马云   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 7月4日,有网友在社...
沪深两市成交额突破1万亿 较昨... 转自:财联社【沪深两市成交额突破1万亿 较昨日此时放量超1000亿】财联社7月4日电,据财联社盯盘数...
亚普股份涨2.79%,成交额6... 7月4日,亚普股份盘中上涨2.79%,截至13:36,报18.05元/股,成交6753.82万元,换...
热浪来袭 高温“烤”验西班牙旅... 来源:央视新闻客户端欧洲多国正遭受持续高温侵袭。高温热浪同样也席卷伊比利亚半岛,西班牙多地气温突破4...
2025暑期档电影你期待哪部? 【#2025暑期档电影你期待哪部#?】2025暑期档电影混剪,一起来看↓↓@朱一龙 @吴磊LEO @...