Java Integer 小问题

本文详细探讨了Java中Integer类型的特性及其内部实现机制,特别是针对-128到127范围内Integer对象的缓存机制,以及超出此范围时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*Java Integer*

java 中的 Integer 类型作为常用类型,有一些特殊地方需要注意:
- Integer.SIZE = 32 bits
integer在 java 中使用 32 个字节保存,所以能存储的数字范围:-2147483648~2147483647 即 2^31 ~ 2^31-1
但是其中有些有意思的地方:

Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 127;
        Integer f = 127;
        Integer ee = 128;
        Integer ff = 128;
        Long g = 3L;

        System.out.println(c == d); //true
        System.out.println(e == f); //true
        System.out.println(ee == ff); //false
        System.out.println(c == (a+b)); //true
        System.out.println(c.equals(a+b)); //true
        System.out.println(g == (a+b)); //true 
        System.out.println(g.equals(a+b)); //false 
        System.out.println(ee.hashCode() + "--" + ff.hashCode());  //true
  • 结果明显看出,当 Integer 大于 127 到达 2^7 时,== 返回 false,说明两者的引用地址不相同。
  • Integer 的范围是 -2147483648~2147483647,为什么两者在内存中的地址不同呢?

原因

在 Java 中 Integer 范围是在 -128 ~ 127,创建实例时内存中在该范围的 Integer 实例是直接使用 Java 原生 Integer 类型保存,允许在内存中重用,而大于该范围时,每次创建 Integer 实例都相当于 new Integer(),不管数值是否相等。所以在上述例子中 “128==128” 返回 flase。
再者是 Integer 和 float 类型的对比,得出的结果原因是:”==” 在遇到算术运算符时会自动拆箱,将类型转换;而”equals()”则只是用于比较数值是否相等,无关于对象类型,所以”equals()”不处理数据转型。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值