"=="和equals()的区别

一、基本类型

对于java中的简单类型int,如若比较两个值的大小只能用“==”。

int n1 = 10;
int n2 = 10;
if(n1 == n2){ //相等
    System.out.println("n1 == n2");
}

二、JDK自带的类

比如ArrayList、HashMap等等类型,“==”比较的是两个对象的类型,equals比较的是对象中的值是否相等。

        List<Integer> list1 = Arrays.asList(1, 2, 3);
        List<Integer> list2 = Arrays.asList(1, 2, 3);  
        if (list1 != list2) {//list2和list1不是同一个对象
            System.out.println("list1 != list2");
        }
        if (list1.equals(list2)) {//list2和list1对象中的值相等
            System.out.println("list1.equals(list2)");
        }

输出结果:

list1 != list2
list1.equals(list2)

但是,String类型的对象很特殊
如果new一个String对象,用法同上;如果只是定义一个对象,则从字符串池中拿字符。
1. new 一个String对象

        String s = new String("hello");
        String ss = new String("hello");
        if (s.equals(ss)) { //两个对象中的值相等
            System.out.println("s.equals(ss)");
        }
        if (s != ss) { //两个对象不相等
            System.out.println("s != ss");
        }

输出:

s.equals(ss)
s != ss

2.定义一个String对象

        /*s和ss都从字符串池中拿字符串,"hello world"在字符串池中已经分配好了一块内存,现在s和ss都指向了字符串池中同一块内存,多以两个对象是相等的*/
        String s = "hello world";
        String ss = "hello world";
        if (s.equals(ss)) {//两个对象中的值相等
            System.out.println("s.equals(ss)");
        }
        if (s == ss) {//两个对象相等
            System.out.println("s == ss");
        }

输出:

s.equals(ss)
s == ss

三、自定义的类

自定义的类如果没有继承JDK自带的类或者没有重写Object中的equals方法,则“==”和equals()方法事项的功能相同,都是比较两个对象是否相同。
1、例如自定义了一个Customer类,默认继承了Object类,但没有重写equals方法

public class Customer {

}

测试方法如下:

        Customer c1 = new Customer();
        Customer c2 = new Customer();
        if (c1 != c2) {//c1和c2是两个不同的对象
            System.out.println("c1 != c2");
        }
        if (!c1.equals(c2)) {//Customer没有实现equals方法,实质也是比较的c1和c2两个对象是否相等
            System.out.println("!c1.equals(c2)");
        }

输出:

c1 != c2
!c1.equals(c2)

由此可知,自定义的类,如果没有实现equals方法的话,则“==”和equals()实现的功能相等。Customer没有重写equals方法,则默认调用Object中的equals方法。Object中的equals方法的源码如下:

    public boolean equals(Object obj) {
        return (this == obj);
    }

源码中也是通过“==”直接比较两个对象是否相等,因此equals()方法 和“==”实现的功能相等,都是直接比较两个对象是否相等。

2、例如自定义了一个Customer类,默认继承了Object类,但重写equals方法

public class Customer {

    private String name;

    public Customer(String name) {
        super();
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (null == obj) {
            return false;
        }
        Customer objCustomer = (Customer) obj;

        if (this.name.equals(objCustomer.name)) {
            return true;
        }
        return false;
    }
}

测试方法如下:

        Customer c1 = new Customer("lzj");
        Customer c2 = new Customer("lzj");
        if (c1 != c2) {//c1和c2是两个不同的对象
            System.out.println("c1 != c2");
        }
        if (c1.equals(c2)) {//实质是比较两个对象中的name的值是否相等
            System.out.println("c1.equals(c2)");
        }

输出如下:

c1 != c2
c1.equals(c2)

由于Customer重写了自己的equals()方法,因此两个对象进行equals比较的时候,实质是比较的重写的equals()方法中定义的逻辑。本例中比较c1.equals(c2) 实质是比较的两个对象中属性name的值是否相等,因此返回true。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值