java中基本数据类型和包装类的比较

java中基本数据类型和包装类的比较本文详细探讨了 Java 中基本类型与包装类的比较 包括 和 equals 的区别 自动装箱拆箱机制 以及在 Integer Long 等类中的具体应用实例

Integer i = 42;
Long l = 42l;
Double d = 42.0;

为true的是

l.equals(42L)

自动装箱,将 42L 装箱成 Long 类型,所以调用 equals 方法时,类型相同,且值也相同,因此返回真

1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;

int a = 220;
Integer b = 220;
System.out.println(a==b);//true

2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。

Integer c=3;
Integer h=3;
Integer e=321;
Integer f=321;
System.out.println(ch); //true
System.out.println(e
f); //false

3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true。

Integer a=1;
Integer b=2;
Integer c=3;
System.out.println(c.equals(a+b));//true

4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

int i=1;
int j = 2;
Integer c=3;
System.out.println(c.equals(i+j));//true

包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱(基本数据类型包装类在进行算术运算时会自动拆箱,比如两个Integer相加时,两个Integer会拆箱为int,相加结果为int。)

基本数据类型会自动装箱,equals方法只有对象才有,所以使用equals必须先包装(包装类的equals()方法不处理数据转型)。

==比较的是地址,equals比较的是value。
==是在同一类型的基本类与包装类之间才会发生自动拆包比较(如Integer 与int,Long与long进行 ==比较时,会自动拆箱),equals不会对比较的数据类型进行转换
不同类型之间进行比较,如果有一方为非包装类,则会自动拆箱。如果两方都为包装类,则不会拆箱,且不能比较,编译会报错 (不同类型引用的 == 比较,会出现编译错误,不能比较)。

基本数据类型和包装类的比较

  1. 只要== 号左右两边存在基本数据类型,那么必然是值比较,一边如果是包装类,包装类需要拆箱。同时这种比较,存在基本数据类型的自动向上转型,但是需要注意的是,浮点型由于精度的问题,比较的时候最好别用==。
  2. 包装类之间的比较(只要类型不同,肯定返回false,类型相同,才会判断值):
    1. 使用==号:先判断类型,再判断引用地址。Integer中的*数组,这个在比较Integer的时候需要被注意一下。
    2. 使用equals方法:先判断类型,再判断值。但是不提供类型转换。

包装类的equals都重写

Long覆写equals的java源码

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

Integer覆写equals的java源码

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

类中对equals重写的源码:会先用instanceof比较是否属于该类,如果不属于,直接返回false~

2.复合数据类型(类)
当用 == 进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号 == 进行比较的,所以比较后的结果跟双等号(==)的结果相同。

今天的文章 java中基本数据类型和包装类的比较分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-30 07:57
下一篇 2024-12-30 07:51

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/92831.html