Java包装类与基本类型进行比较的坑

  • Post author:
  • Post category:java


今天使用Java的包装类和基本类型做比较的时候发现了包装本身存在的坑,参考的JDK版本是1.8.0_121,下面是例子代码:

	Short packShort=1;
	short baseShort=1;
	Integer packInt=1;
	int baseInt=1;
	//用Short的equals()方法与short进行比较
	System.out.println(packShort.equals(baseShort));
	//用==比较Short和short
	System.out.println(packShort==baseShort);
	//用Short的equals()方法与int进行比较
	System.out.println(packShort.equals(baseInt));
	//用Short的equals()方法与Integer进行比较
	System.out.println(packShort.equals(packInt));
	//用==比较Short和int
	System.out.println(packShort==baseInt);
	//用==比较Short和Integer,不能进行比较,类型不同
	//System.out.println(packShort==packInt);

代码的运行结果如下:

true
true
false
false
true

先不分析运行结果,大家可以先看一下

Short

中的

equals()

方法源码:

	public boolean equals(Object obj) {
        if (obj instanceof Short) {
            return value == ((Short)obj).shortValue();
        }
        return false;
    }



Integer



equals()

代码类似,有兴趣可以自行去看一下,这里就不重复了。以下是结果分析:



  1. Short



    equals()

    方法与

    short

    进行比较的时候,

    short

    类型会被判断为是

    Short

    类型的实例,然后两个对象都会被转化为基本类型用

    ==

    进行比较,所以结果为

    true



  2. ==

    比较

    Short



    short

    的时候,

    Short

    类型对象被拆箱(转为

    short

    基本类型),所以结果为

    true



  3. Short



    equals()

    方法与int进行比较的时候,由于类型判断那里就已经为

    false

    了,直接返回

    false



  4. Short



    equals()

    方法与

    Integer

    进行比较的时候,与用

    Short



    equals()

    方法与

    int

    进行比较的时候同样的原因,返回结果为

    false



  5. ==

    比较

    Short



    int

    的时候,

    Short

    首先是进行了

    拆箱

    (转为

    short

    基本类型),然后是

    自动提高类型

    (转为

    int

    ),之后才进行比较,所以结果为

    true



版权声明:本文为a158123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。