【java基础】包装类型的缓存机制

Java中的几种常见包装类:

Integer, Float, Double, Long, Short, Byte, Boolean, character

Integer, Long, Byte, Short, 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据;
Character 创建了数值在 [0,127] 范围的缓存数;
Float, Double 没有实现缓存机制。

如果超出缓存范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。

所有整型包装类对象之间值的比较,全部使用 equals 方法比较, 如下代码示例:

{
	Integer i1 = 40;
	Integer i2 = new Integer(40);
	System.out.println(i1==i2);
	// 结果是false
	//Integer i1=40 这一行代码会发生装箱,也就是说这行代码等价于 Integer i1=Integer.valueOf(40) 。
	//因此,i1 直接使用的是缓存中的对象。而Integer i2 = new Integer(40) 会直接创建新的对象
}

拆装箱

装箱:将基本类型用它们对应的引用类型包装起来。
拆箱:将包装类型转换为基本数据类型。
注意:如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽 量避免不必要的拆装

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的包装类(Byte、Short、Integer、Long、Float、Double、Character、Boolean)都提供了常量池缓存机制,即对于某些范围内的数值,每次创建新的包装对象时并不会新建对象,而是从缓存中获取已有的对象引用。其中,Byte、Short、Integer、Long默认对[-128,127]之间的数值进行缓存,其他类默认不缓存。这样做的好处是可以节省内存开销,提高程序的性能。 例如,当我们使用以下方式创建Integer对象时,实际上并不会创建新的对象,而是从常量池中获取已有的对象引用: ``` Integer i1 = 10; // 自动装箱,相当于 Integer i1 = Integer.valueOf(10); Integer i2 = 10; // 自动装箱,相当于 Integer i2 = Integer.valueOf(10); System.out.println(i1 == i2); // true,因为 i1 和 i2 引用同一个对象 ``` 但是,当创建的数值超出了缓存范围时,就会创建新的对象,例如: ``` Integer i3 = 128; // 自动装箱,相当于 Integer i3 = Integer.valueOf(128); Integer i4 = 128; // 自动装箱,相当于 Integer i4 = Integer.valueOf(128); System.out.println(i3 == i4); // false,因为 i3 和 i4 引用不同的对象 ``` 需要注意的是,虽然使用包装类缓存机制可以提高程序的性能,但是在某些特殊情况下,也可能会导致程序出错。例如,如果使用包装类进行比较时,应该使用 equals() 方法进行比较,而不是使用“==”运算符进行比较。因为使用“==”运算符进行比较时,如果两个对象引用的不是同一个对象,就会返回 false,而不是根据对象的值进行比较。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值