基本数据类型与其包装类的比较
2018-02-08 20:15
537 查看
最近刷题的时候碰到了不少基本数据类型和包装类进行比较的问题,一开始做的有点蒙,错多了之后就自己整理了一下,特记录下来加深印象。
在java中不能定义基本数据类型对象,为了能将基本数据类型视为对象处理,并且能够调用方法简化其使用过程,java为每个基本类型都提供了包装类。
下面是8种基本数据类型图解
下面是基本数据类型及其包装类对照表:
包装类提供了多种常用方法,如下图:
其中equals方法在本篇中有所涉及,摘录其源码如下:
可以看出,先通过instanceof判断比较对象obj是否是Integer的类实例,如果不是,则return false,若是,则强制转换为Integer类并通过intValue()方法取值,比较调用方法的对象的值和该值是否相等,返回比较结果。
包装类往往涉及到比较两个对象或者比较对象和基本数据类型的大小的问题。
下面以最常用的Integer类为例,用程序说明几种判断方式。
通过总结得到以下四点:
1.同样被new出的两个相同类型的对象一定是不“==”的,因为==比较的是位置,而new出的对象一定是全新地址的,但是用equals比较时是比较的数值,是相等的。
2.在“==”进行比较时,有以下原则:
1)不用new得到新对象,当要赋的值在区间[-128,127]时,该值会被缓存到IntegerCache.cache中,此时赋值的是同一对象,用“==”比较会返回ture;
2)当要赋的值在(-∞,-128)或(127,+∞)时,即时不用new得到新对象,用“==”比较也会返回false;
3)当用new赋值时,一定返回false;
3.当Integer对象与基本类型做比较时,默认将Integer对象做拆箱操作,比较基本类型,而基本类型的比较只与数值有关,因此数值一样就返回true;
4.若两个Byte对象相加,则会自动升格为int,只能赋值给int或更高精度的类型,因此赋值给Byte一定出错。
希望有缺漏的地方各位能够予以补充。
在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 */
希望有缺漏的地方各位能够予以补充。
相关文章推荐
- Java中的Integer和int等包装类和基本数据类型简单比较
- 基本数据类型与包装类可以比较吗
- java基本数据类型与其包装类的区别
- 基本数据类型对象包装类
- 基本数据类型、引用数据类型相互之间的比较规范(相等运算符的使用)
- 黑马程序员——Java基础---String类和基本数据类型对象包装类
- String类与基本数据类型对象包装类
- 基本数据类型与基本数据类型包装类深入剖析
- 基本数据类型包装类
- Java SE-基本数据类型对应包装类
- java基本数据类型包装类
- java中基本数据类型和包装类的区别
- 基本数据类型和包装类、String类的转换&toString方法&instanceof运算符
- 浅谈Java API中基本数据类型包装类的缓存设计
- java基本数据类型包装类
- 黑马程序员——Java笔记——基本数据类型包装类注意
- java 基本数据类型和包装类
- java中基本数据类型与引用类型比较方式
- 基本数据类型包装类
- tips:Java基本数据类型大小比较