最近刷题的时候碰到了不少基本数据类型和包装类进行比较的问题,一开始做的有点蒙,错多了之后就自己整理了一下,特记录下来加深印象。
在java中不能定义基本数据类型对象,为了能将基本数据类型视为对象处理,并且能够调用方法简化其使用过程,java为每个基本类型都提供了包装类。
下面是8种基本数据类型图解
下面是基本数据类型及其包装类对照表:
基本数据类型 | 包装类 |
---|---|
int | Integer |
byte | Byte |
short | Short |
long | Long |
float | Float |
double | Double |
char | Char |
boolean | Boolean |
包装类提供了多种常用方法,如下图:
其中equals方法在本篇中有所涉及,摘录其源码如下:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
可以看出,先通过instanceof判断比较对象obj是否是Integer的类实例,如果不是,则return false,若是,则强制转换为Integer类并通过intValue()方法取值,比较调用方法的对象的值和该值是否相等,返回比较结果。
包装类往往涉及到比较两个对象或者比较对象和基本数据类型的大小的问题。
下面以最常用的Integer类为例,用程序说明几种判断方式。
通过总结得到以下四点:
1.同样被new出的两个相同类型的对象一定是不“==”的,因为==比较的是位置,而new出的对象一定是全新地址的,但是用equals比较时是比较的数值,是相等的。
Integer a=new Integer(5);
Integer b=new Integer(5);
System.out.println(a==b);//return false
System.out.println(a.equals(b));//return true
2.在“==”进行比较时,有以下原则:
1)不用new得到新对象,当要赋的值在区间[-128,127]时,该值会被缓存到IntegerCache.cache中,此时赋值的是同一对象,用“==”比较会返回ture;
Integer a=5;
Integer b=5;
System.out.println(a==b);//return true
2)当要赋的值在(-∞,-128)或(127,+∞)时,即时不用new得到新对象,用“==”比较也会返回false;
Integer a=128;
Integer b=128;
Integer c=-129;
Integer d=-129;
System.out.println(a==b);//return false
System.out.println(c==d);//return false
3)当用new赋值时,一定返回false;
3.当Integer对象与基本类型做比较时,默认将Integer对象做拆箱操作,比较基本类型,而基本类型的比较只与数值有关,因此数值一样就返回true;
Integer a=new Integer(5);
int c=5;
System.out.println(a==c);//return true
4.若两个Byte对象相加,则会自动升格为int,只能赋值给int或更高精度的类型,因此赋值给Byte一定出错。
Byte a = new Byte((byte) 5);
Byte b = new Byte((byte) 5);
Byte c = a + b;
/*
* 报错如下:
* Type mismatch: cannot convert from int to Byte
*/
希望有缺漏的地方各位能够予以补充。