备战金三专题: int 和 Integer 有什么区别?谈谈 Integer 的值缓存范围

回答

java有8个基本数据类型,byte、short、int、lang、float、double、boolean、char,java语言号称一切都是对象,但原始数据类型是例外。

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

Integer的值缓存,是根据实践发现的 大部分数据操作都是集中在有限较小的数值范围,在java5中新增了静态工厂方法valueof,这个值默认缓存 -128 - 127之间。

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

  • Boolean,缓存了 true/false 对应实例,确切说,只会返回两个常量实例 Boolean.TRUE/FALSE。

  • Short,同样是缓存了 -128 到 127 之间的数值。

  • Byte,数值有限,所以全部都被缓存。

  • Character,缓存范围’\u0000’ 到 ‘\u007F’。

同样对于垃圾回收器来说:

ru:Integer i = 100;

i = null;

这里虽然i被赋予null,但它之前指向的是cache中的Integer对象,而cache没有被赋null,所以Integer(100)这个对象还是存在;然而如果这里是1000的话就符合回收的条件;其他的包装类也是。

拓展

1、自动装箱 / 自动拆箱是发生在什么阶段?

编译阶段

javac 替我们自动把装箱转换为 Integer.valueOf(),把拆箱替换为 Integer.intValue()

2、自动装箱 / 自动拆箱似乎很酷,在编程实践中,有什么需要注意的吗?

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

3、源码分析

-XX:AutoBoxCacheMax=N  可以修改nteger缓存大小

不管是 Integer 还 Boolean 等,都被声明为“private final”,所以,它们同样是不可变类型!

不管是 32 位还是 64 位环境,开发者无需担心数据的位数差异。

对于应用移植,虽然存在一些底层实现的差异,比如 64 位 HotSpot JVM 里的对象要比 32 位 HotSpot JVM 大(具体区别取决于不同 JVM 实现的选择),但是总体来说,并没有行为差异,应用移植还是可以做到宣称的“一次书写,到处执行”,应用开发者更多需要考虑的是容量、能力等方面的差异。

4.Java 原始数据类型和引用类型局限性?

  • 原始数据类型和 Java 泛型并不能配合使用

这是因为 Java 的泛型某种程度上可以算作伪泛型,它完全是一种编译期的技巧,Java 编译期会自动将类型转换为对应的特定类型,这就决定了使用泛型,必须保证相应类型可以转换为 Object。

  • 无法高效地表达数据,也不便于表达复杂的数据结构,比如 vector 和 tuple

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值