基本类型与包装类的区别

基本类型: byte short int long float double char boolean
包装类: Byte Short Integer Long Float Double Character Boolean

一、基本类型只有值,而包装类还具有和值不一样的同一性

public void integerTest(){
		// 基本类型
		int a = 10;
		int b = 10;
		System.out.println("a==b:" + (a == b));//true

		//包装类型
		Integer a1 = new Integer(20);
		Integer b1 = new Integer(20);
		System.out.println("a1.equals(b1):" + a1.equals(b1));//true
		System.out.println("a1==b1:" + (a1 == b1));//false
	}

基本类型只有值,可以直接拿“= =”进行比较。通过new创建的包装类,调用equals方法可以发现其具有和基本类型相同的值,但是直接拿“==”比较两个值相同的包装类结果却是false,这说明包装类具有和值不一样的同一性。包装类之所以具有不同的同一性,是因为包装类属于引用类型,直接拿“= =”进行比较,其实比较的是地址值,所以不同。

二、基本类型具有完备的值,而包装类具有一个非功能值null

基本数据类型使用时必须进行赋值,否则无法使用,因此当我们定义一个基本类型的数据时它就具有完备的值。包装类型如果未赋值会有一个默认值null,此时如果忘记赋值直接使用就会报java.lang.NullPointerException,会带来一些隐患。

三、基本类型比包装类更节省空间和时间

通过new方式创建的包装类,两个相同的值,会创建两个对象,占用空间更大。

  /**
     * Compares this object to the specified object.  The result is
     * {@code true} if and only if the argument is not
     * {@code null} and is an {@code Integer} object that
     * contains the same {@code int} value as this object.
     *
     * @param   obj   the object to compare with.
     * @return  {@code true} if the objects are the same;
     *          {@code false} otherwise.
     */
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

基本类型在比较值时可以直接使用= =进行;而包装类需要使用equals方法,当我们点进去equals方法就会发现,包装类重写了Object的该方法,先将包装类拆箱转换成基本类型,然后再使用 = =进行比较,因此从时间上来看包装类更加耗时。

四、包装类使用场景

既然包装类有这么多缺点,那为什么还要使用它呢?因为在有些场景下无法使用基本类型,只能使用包装类。例如:在集合中的元素、键和值不允许使用基本类型,只能使用包装类;使用反射调用方法时必须使用包装类。
备注:本文参考《Effective Java》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值