equals和==的区别

equals和==经常用来去比较两个值或者两个对象。

==如果只是用来比较基本数据类型常量的话,那么比较的就是两个常量的值,如果用来去比较两个对象引用,那么比较的是两个对象的地址。equals在java中一般都是比较两个对象的值,前提是java提供的类中重写了equals这一方法(绝大多数equals方法在java类中均被重写)。

当str1和str2都是引用类型

public static void main(String[] args) {
        String str1 = new String("aaa");
        String str2 = new String("aaa");
        System.out.println(str1.equals(str2));
        System.out.println(str1 == str2);
    }

如上面代码,当new两个String类对象时,new String("aaa")分别在常量池创建了"aaa"对象,然后在堆内存new了对象str,对象成员变量赋予aaa的值。

因而new两次对象后,堆内存中的str1和str2分别是两个不同的对象,地址不相同,值相同,最后equals比较返回值相等为true。当用==去比较时,因为两个对象地址不同因而输出为false。

当str1和str2都是常量时的情况

public static void main(String[] args) {
        String str1 = "aaa";
        String str2 = "aaa";
        System.out.println(str1.equals(str2));
        System.out.println(str1 == str2);
    }

如果在自己写的类中equals方法没有被重写的话默认还是比较地址,相当于==。

class Animal{
    private String type;
    public Animal(String type) {
        this.type = type;
    }
}
public class test35 {
    public static void main(String[] args) {
        Animal animal1=new Animal("cat");
        Animal animal2=new Animal("dog");
        System.out.println(animal1.equals(animal2));
    }
}

如上面代码,自己构造的类中如果没有去重写equals方法则默认还是比较地址,因而返回false。

特殊情况

public static void main(String[] args) {
        int i=0;
        Integer j=new Integer(0);
        Integer k=new Integer(0);
        System.out.println(i==j);
        System.out.println(j.equals(i));
        System.out.println(j==k);
        System.out.println(j.equals(k));
    }

 当 i 是一个基本数据类型,j 作为一个包装引用类型时,i 和 j 使用 == 进行比较时,j会进行自动拆箱,变成一个基本类型:0,因而==比较返回结果为true。

j 和 k 都是包装引用类型时,没有拆箱操作,== 比较的仍然是j和k的地址。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值