码迷,mamicode.com
首页 > 编程语言 > 详细

Java基本类型与包装类的比较

时间:2020-12-18 12:54:30      阅读:2      评论:0      收藏:0      [点我收藏+]

标签:默认   方法   out   font   自动装箱   自动   div   ==   缓存   

我总结了Java数据比较主要有以下要点:

1.基本类型和基本类型对比;

2.基本类型和包装类型比较;

3.包装类型和包装类型比较;

4.”==“与”equal“比较方式;

5.[-128,127]与非[-128,127]范围的数据比较;

6.String包装类型的比较。

基本类型和基本类型对比

基本类型和基本类型的比较,因为不是对象所以没有equal方法也没有所谓的引用地址,所以只能”==“来比较它们本身的值。

int a = 127;
int b = 127;
System.out.println("a==b, result:" + (a == b)); //a==b, result:true

基本类型与包装类型比较

凡是基本类型和包装类型比较都会触发包装类型自动拆箱的操作,最终还是比较本身的值。

int     a = 127;
Integer b = 127;
System.out.println("a==b, result:" + (a == b)); //a==b, result:true

下面的情况与上面的类似,只不过Java在处理时少了自动装箱的那一步,后面的拆箱比较是一样的。

int     a = 127;
Integer b = new Integer(127);
System.out.println("a==b, result:" + (a == b)); //a==b, result:true

包装类型和包装类型比较

这里还是暂时只讨论”==“方式的比较,包装类型之间采用”==“比较的是对象的地址。

包装类型和包装类型比较结果会受包装类型对象的创建方式的影响,如”xxx.valueOf()“还是”new xxx()“方式。

xxx.valueOf()方式创建对象:这种方式Java遇到-128~127的值,会先去缓存池中根据值查找看是否有已存在的对象,如果有就直接将对象地址返回,如果没有则创建。所以下面的例子中a和b的地址都是同一个对象地址,所以相等。

Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
System.out.println("a==b, result:" + (a == b)); //a==b, result:true

new xxx()方式创建对象:这种方式Java不会检查缓存池而是直接new一个新的对象,所以下面例子的两个对象的地址肯定是不相等的。

Integer a = new Integer(127);
Integer b = new Integer(127);
System.out.println("a==b, result:" + (a == b)); //a==b, result:false

"=="与"equal"比较方式

equals属于包装类型对象的方法,Java默认equals方法是比较值,当然用户也可以重写该方法。

Integer a = new Integer(127);
Integer b = new Integer(127);
System.out.println("a==b, result:" + (a.equals(b))); // a==b, result:true

Integer a = new Integer(127);
int b = 127;
System.out.println("a==b, result:" + (a.equals(b))); // a==b, result:true

”==“相对于equals比较复杂,从上面的例子可以看出,除了”包装类型和包装类型“是比较地址,其它情况都是比较值。

[-128,127]与非[-128,127]范围的数据比较

上面的范围不是绝对的,用户是可以对JVM进行配置的。

当对象的值在[-128,127]范围内,Java会检查缓存池,如果有该对象就直接返回,如果没有则创建。如果范围为非[-128,127],那么Java不会检查。

可以总结的经验是当用户比较的是对象的地址才需要考虑值的范围是否在[-128,127],如果是比较值,那么不用考虑。

String包装类型的比较

String只有包装类型,没有基本类型,所以只讨论包装类型之间的比较。这里之所以将String单独拿出来讨论是因为String为字符串与数值类型的包装对象有点不一样,它有常量池还有字符串拼接等情况都会影响它是否创建新对象。

所以String的比较就留到下一篇文章再写了。

 

Java基本类型与包装类的比较

标签:默认   方法   out   font   自动装箱   自动   div   ==   缓存   

原文地址:https://www.cnblogs.com/kmpro/p/14129427.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!