java中euqals和==的区别

在java中,equals()方法和==操作符在比较对象时扮演着不同的角色,它们之间的主要区别在于它们所比较的内容不同。

1. ==操作符

1)比较基本数据类型:当使用==操作符比较基本数据类型(如intdoublechar等)时,它比较的是这两个变量值是否相等。

2)比较引用类型:当使用==操作符比较引用类型时,它实际上是在比较这两个对象的引用是否指向内存中的同一个位置(即,它们是否是同一个对象的引用)。如果两个引用指向的是同一个对象实例,则结果为true;否则,结果为false

2. equals()方法

​​​​​​1)比较字符串:使用euqals()方法比较字符串时,比较的是内容是否相等

2)比较对象引用:使用euqals()方法比较对象引用时,比较的是对象的内存地址是否相同(等价于使用==比较对象),若想比较对象的内容,则需要重写equals()方法

  以下是equals()方法的源码:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

 设置了三重判断,第一重比较两个对象的地址是否相同,如果相同则表示同一个对象返回true,如果不相同,则进行第二重判断,比较对象是不是String类型的,不是就返回false,如果为true则进行第三重判断,比较两个字符串长度是否相等,如果不同,则证明这是两个字符串,如果相同,在进行转换为字符数组,进行按位逐一比较

3.示例

public class Person {  
    private String name;  
    private int age;  
  
    public Person(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    // 重写equals方法以比较Person对象的内容  
    @Override  
    public boolean equals(Object obj) {  
        // 检查是否为同一个对象的引用  
        if (this == obj) return true;  
        // 检查是否为同一类型  
        if (obj == null || getClass() != obj.getClass()) return false;  
        // 强制类型转换为Person  
        Person person = (Person) obj;  
        // 比较name和age  
        return age == person.age &&  
               (name == person.name || (name != null && name.equals(person.name)));  
    }  
  
    // 为了方便,也重写hashCode方法(在实际应用中,如果重写了equals,通常也应该重写hashCode)  
    @Override  
    public int hashCode() {  
        int result = name != null ? name.hashCode() : 0;  
        result = 31 * result + age;  
        return result;  
    }  
  
    public static void main(String[] args) {  
        Person p1 = new Person("Alice", 30);  
        Person p2 = new Person("Alice", 30);  
  
        // 使用==比较两个Person对象的引用  
        System.out.println(p1 == p2); // 输出:false,因为p1和p2是不同对象的引用  
  
        // 使用equals方法比较两个Person对象的内容  
        System.out.println(p1.equals(p2)); // 输出:true,因为p1和p2的内容相同  
  
        // 示例:使用String的equals和==  
        String s1 = new String("Hello");  
        String s2 = new String("Hello");  
        String s3 = s1;  
  
        // 使用==比较String对象的引用  
        System.out.println(s1 == s2); // 输出:false,因为s1和s2是不同对象的引用  
        System.out.println(s1 == s3); // 输出:true,因为s1和s3指向同一个对象  
  
        // 使用equals方法比较String对象的内容  
        System.out.println(s1.equals(s2)); // 输出:true,因为s1和s2的内容相同  
    }  
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值