(基本数据类型下) 的equals方法和==的比较

本文详细解析了Java中equals方法与==操作符的区别。==用于比较对象引用是否指向同一内存地址,而equals则用于比较对象的内容是否相同。对于String等类,equals会逐字符比较字符串内容。

理解string的equals方法和 == 方法

string 的 == 比较的是地址是否相等
string 的equals 比较的是
1.先判断地址是否相等 这个Object的equals的判断方式一样
2.在判断是否是String类型,是的话 进行字符比较 都一样的话返回true
3.否则返回false

基本数据下的equals方法比较方式:
1.先比较引用地址是否相同,相同返回true
2.在比较值是否相等 想等返回true
比如 Integer String character 这些包装类equals比较方法大同小异

3.最后的是自己创建的类的实例的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;
        }
    }

在引用类型中,"=="是比较两个引用是否指向堆内存里的同一个地址(同一个对象),而equals是一个普通的方法,该方法返回的结果依赖于自身的实现。我们先看一下Person这个类,并没有equals方法呀,那为什么不报错呢?在Java中,如果一个类没有继承其它类,那么它默认继承Object这个类,打开Object这个类看一下,发现如下代码,Person这个类的equals方法就继承自这里


很简单,就一句代码,判断两个引用是否指向同一个对象,两个Person对象在堆内存中的表现如下图所示:
所以代码person1.equals(person2)等同于person1 == person2,当然打印出来的结果是false。我们再来看看Integer这个类, equals的实现如下:
当代码执行到System.out.println(itr.equals(lon))时,会判断传入的lon这个对象是否是Integer类型,这里的lon是Long类型,所以打印出来的结果当然是false了。
最后是我们String的实现
当代码执行到:System.out.println(s3.equals(s4)),由于字符串底层char数组里存的都是{'1','0','0'}当然打印出来是true了。

文章部分内容来自于https://zhuanlan.zhihu.com/p/27573287
java那些事 -专栏

### Java中`equals`方法与`==`运算符的区别 在Java中,`equals`方法`==`运算符是用于比较两个对象或值是否相等的两种不同方式。以下是它们的主要区别: 1. **`==`运算符** - `==`是一个运算符,既可以用于基本数据类型比较,也可以用于引用类型比较。 - 当用于基本数据类型时,`==`比较的是值是否相等[^1]。 - 当用于引用类型时,`==`比较的是两个对象的内存地址是否相同,即判断两个引用是否指向同一个对象[^2]。 示例代码: ```java Integer integer1 = new Integer(5); Integer integer2 = new Integer(5); System.out.println(integer1 == integer2); // Output: false ``` 2. **`equals`方法** - `equals`是`Object`类中的一个方法,因此所有Java对象都继承了该方法。 - 默认情况下,`equals`方法的行为与`==`相同,即比较对象的内存地址[^1]。 - 然而,许多类(如`String`、`Integer`等)重写了`equals`方法以提供更合理的语义比较。例如,`String`类的`equals`方法比较的是字符串内容是否相等,而不是内存地址[^3]。 示例代码: ```java String str1 = new String("aa"); String str2 = new String("aa"); System.out.println(str1.equals(str2)); // Output: true ``` 3. **`hashCode`方法的相关性** - 如果一个类重写了`equals`方法,通常也需要重写`hashCode`方法,以确保两者保持一致性。这是因为Java集合框架(如`HashMap`)依赖于`hashCode``equals`来正确存储检索对象[^1]。 示例代码: ```java public class Person { private String name; public Person(String name) { this.name = name; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person person = (Person) obj; return name.equals(person.name); } @Override public int hashCode() { return Objects.hash(name); } } ``` ### 总结 - `==`运算符:对于基本数据类型比较的是值;对于引用类型比较的是内存地址。 - `equals`方法:默认比较的是内存地址,但许多类(如`String`、`Integer`等)重写了该方法比较内容或其他属性。 ```java public class Test { public static void main(String[] args) { Integer a = new Integer(5); Integer b = new Integer(5); System.out.println(a == b); // Output: false System.out.println(a.equals(b)); // Output: true } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值