Java中equals与==的区别解析

版权申诉
0 下载量 168 浏览量 更新于2024-09-05 收藏 56KB PDF 举报
"Java语言中,`equals()`方法和`==`运算符是两种常见的用于比较对象的方法,但它们在用途和行为上有着显著的区别。`==`运算符主要用于比较基本类型(如int, char)的值是否相等,而对于引用类型(如对象),它比较的是两个引用是否指向内存中的同一位置,即对象的地址。这意味着,如果两个引用指向堆中的不同实例,即使这两个实例的内容完全相同,`==`也会返回`false`。 `equals()`方法则是对象的比较方法,通常用于比较对象的内容是否相等。默认情况下,`equals()`方法的行为与`==`相同,但是许多类(尤其是`String`类)重写了`equals()`方法,以便比较对象的内容而不是引用。例如,在`String`类中,`equals()`会比较两个字符串的字符序列是否一致。 来看一个具体的例子: 1. 当我们创建两个`String`对象`s1`和`s2`,并给它们赋值为"Monday",如: ```java String s1 = "Monday"; String s2 = "Monday"; ``` 此时,由于字符串字面量的优化,JVM会将"Monday"存入常量池,并且`s1`和`s2`都指向这个相同的引用,因此`==`比较会返回`true`: ```java System.out.println(s1 == s2); // 输出: true ``` 2. 如果我们使用`new String("Monday")`创建`s2`,情况就会有所不同: ```java String s1 = "Monday"; String s2 = new String("Monday"); ``` 现在,`s1`仍然指向常量池中的"Monday",而`s2`则是在堆中创建了一个新的`String`对象,虽然内容相同,但它们是两个不同的对象,所以`==`比较返回`false`: ```java System.out.println(s1 == s2); // 输出: false ``` 然而,由于`s1`和`s2`的内容都是"Monday",它们的`equals()`方法比较会返回`true`: ```java System.out.println(s1.equals(s2)); // 输出: true ``` 总结来说,`==`在对象比较时关注的是引用是否相同,而`equals()`关注的是对象的内容是否相等。在编写代码时,应当根据需要比较的内容选择合适的方法。对于自定义类,如果需要基于对象内容的比较,应重写`equals()`方法并确保与`hashCode()`方法保持一致,以符合Java集合框架的约定。