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

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~

Float和Double和Integer还有Long类似,但是Float和Double较为复杂,特别Float。所以不是一个类型的,equals直接返回false。
而==如果是同一个类型,会自动拆箱。l.equals(42L),这里是42L自动装箱成Long类型,而不是l被自己拆箱了。

基本数据类型的==不是比较地址。
java中的数据类型,可分为两类:

1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。

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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java基本数据类型包装类是Java用来表示数据的两种不同方式。 1. 基本数据类型(Primitive Data Types): - Java基本数据类型有8种:byte、short、int、long、float、double、char和boolean。 - 这些基本数据类型直接存储着数据的值,它们是直接操作内存的,因此效率较高。 - 基本数据类型不具有任何方法,不能调用任何方法。 2. 包装类(Wrapper Classes): - 包装类是用来将基本数据类型包装起来,以便能够以对象的形式使用。 - Java提供了对应于每种基本数据类型包装类:Byte、Short、Integer、Long、Float、Double、Character和Boolean。 - 包装类提供了许多有用的方法,可以进行类型转换、比较、运算等操作。 - 包装类是不可变的(immutable),即一旦创建就无法修改其值。 区别: - 基本数据类型是直接存储数据的值,而包装类是将基本数据类型包装成对象。 - 基本数据类型效率较高,而包装类的效率较低,因为需要进行对象的创建和销毁操作。 - 基本数据类型不能调用任何方法,而包装类提供了许多有用的方法。 - 包装类可以用于泛型、集合类等需要对象作为参数的场景,而基本数据类型则不能直接使用。 - 基本数据类型在内存占据的空间大小是固定的,而包装类的内存消耗较大,因为需要额外存储一些信息。 总的来说,基本数据类型适合用于简单的数据操作,而包装类适合用于需要更多功能和灵活性的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值