J2SE----equals()与==的区别

本文详细解析了Java中基本类型和引用类型的比较方式,包括==与equals的区别,以及自动拆箱后的int与Integer类型的比较方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Demo

基本类型

public class ObjectDemo {
    public static void main(String[] args) {

        //基本类型
        int a=57;
        int b=67;
        int c=124;
        int d=124;
        System.out.println(a==b);
        System.out.println((a+b)==c);
        System.out.println(c==d);
    }
}

运行结果:
这里写图片描述
注:基本类型时,==比较的是值是否相等。

引用类型

public class ObjectDemo {
    public static void main(String[] args) {

        //引用类型 ==与equal的区别

        String s1=new String("hello");
        String s2=new String("world");
        String s3=new String("helloworld");
        String s4=new String("helloworld");

        System.out.println(s1==s2);
        System.out.println((s1+s2)==s3);
        System.out.println(s3==s4);
        System.out.println("-----------");
        System.out.println(s1.equals(s2));
        System.out.println(s3.equals(s1+s2));
        System.out.println(s3.equals(s4));
    }
}

运行结果:
这里写图片描述
注:引用类型:==比较的是值地址是否相等,而equals()比较的是值是否相等!

结果分析:

  1. ==:s1、s2、s3、s4像这种new出来的(即通过基本类的构造函数赋值的),最开始在堆中分配4个不同的内存空间,用于存放其在常量池中返回的地址,其在堆中地址自然完全不同;而s1和s2在拼接时,会先在常量池中开辟一个新空间,在进行拼接。三个比较地址都不同,所以均为false!
  2. equals():s1、s2、s3、s4像这种new出来的(即通过基本类的构造函数赋值的),最开始在堆中分配4个不同的内存空间,其地址自然完全不同;但是equals()比较的是类对象值是否相等。所以结果为false、true、true!

自动拆箱、int与Integer比较方法

public class ObjectDemo {
    public static void main(String[] args) {

        //Integer做四则运算的自动拆箱   int与Integer类型比较时比较方法

        int i=57;
        Integer i1=new Integer(57);
        Integer i2=new Integer(67);
        Integer i3=new Integer(124);
        Integer i4=new Integer(124);

        System.out.println(i==i1);
        System.out.println(i1==i2);
        System.out.println((i1+i2)==i3);
        System.out.println(i3==i4);
    }
}

运行结果:
这里写图片描述

注:

  1. 两个Integer类型对象在做四则运算时会先进行自动拆箱,将Integer拆箱成int类型数据,然后做四则运算。
  2. int类型与Integer对象比较时会将Integer对象自动拆箱成int类型数据,然后比较值大小,相同则返回true。
  3. Integer对象与Integer对象做比较时是直接比较值地址。

结果分析:由以上可知,true、false、true,false。对于第三个输出结果为true是因为,i1,i2自动拆箱做加法后类型为int,int类型与Integer对象作比较如上注2,则结果为true。

总结

  1. ==:
    基本类型:==比较的是值得大小。
    引用类型:比较的是值地址是否相同
  2. equals():
    默认情况:即object类中equals()方法比较的是地址是否相同。
    重写equals():象Integer、Double、String等类都是重写了equals()方法的,这种情况下equals()是比较的是值是否相同。

参考

自动拆箱、自动装箱见:
http://blog.youkuaiyun.com/ZhouHuoCleverset/article/details/61676472#t5
String s=new String(“hello”)与String s=”hello”的区别?即new出来与直接赋值的区别请参考:
http://blog.youkuaiyun.com/zhouhuocleverset/article/details/61935578

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值