Java包装类的注意事项(有小坑)

本文深入解析Java中基本数据类型的包装类,包括Byte、Short、Integer等的自动装箱与拆箱机制,探讨Integer在不同数值范围内的对象复用原理,以及包装类与基本数据类型间的转换方法。

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

一、基本数据类型的包装类

byteByte
shortShort
intInteger
longLong
charCharacter
floatFloat
douleDouble
booleanBoolean

其中,int类型的包装类是Integer,char类型的包装类是Character。其他的基本数据类型的包装类,都是在对该基本数据类型的首字母进行大写。

二、包装类的自动装箱与拆箱

自JDK1.5开始,Java提供了自动拆箱与装箱的功能

【1】自动装箱

Integer in = 15;

自动装箱底层依赖的是valueOf(xxx i)方法

 public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

【2】自动拆箱

public static void main(String[] args) {
        Integer in = new Integer(15);
        int a = in;
    }

自动拆箱底层依赖的是 xxxValue()方法

public int intValue() {
        return value;
    }

补充习题:

public static void main(String[] args) {
		Integer in = 50;
		Integer in2 = 50;
		System.out.println("in == in2 :" + (in==in2));
		Integer in3 = 500;
		Integer in4 = 500;
		System.out.println("in3 == in4 :" + (in3==in4));
		
	}

答案:

in == in2 :true
in3 == in4 :false

大家是不是觉得很奇怪。重所周知,包装类是类,是引用类型,使用“==”进行比较,比较的不是两个类的地址吗?为什么 会出现in == in2 为true,in3 == in4 为false的情况呢!

让我们看看源码

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

可以看出,如果 i是 大于等于 IntegerCache.low 并且 i 小于等于 IntegerCache.high,就返回cache里的数组变量,否则,就返回一个新的对象。

那么low、high与cache各是什么呢?

首先,IntegerCache是Integer类里的静态内部类(还是私有的),在这个类里low的值是-128,high的值为128,cache为一个大小为256的数组,里面变量包含-128到127之间的数。

所以,我么可以得出,当传入的数在(-128到127)之间,Integer给我们返回的是同一个数,否则就返回一个新的对象。

总结与扩展:

  1. Integer在-128到127之间,自动装箱返回的是同一个对象,超出范围会每一次都创建新的对象.
  2. Byte在-128到127之间,自动装箱返回的是同一个对象
  3. Short在-128到127之间,自动装箱返回的是同一个对象,超出范围会每一次都创建新的对象
  4. Long在-128到127之间,自动装箱返回的是同一个对象,超出范围会每一次都创建新的对象
  5. Float和Double每一次都会创建新的对象
  6. Character在0-127范围内,自动装箱返回的是同一个对象,超出范围会每一次都创建新的对象

三、其他注意点

(1)Number是 Byte Short Integer Long Float Double 的共同父类

(2)对应包装类的静态方法parseXXXX()可以将字符串转换为对应的基本数据类型,譬如parseInt()

(3)包装类的哈希码值是固定的。

Byte Short Integer 直接返回对应基本数据类型值作为哈希码值

其他,是通过一系列算法,得出哈希值。但同一个数得到的结果是一致的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值