Java中的==和equals()区别小结
作者:修己xj
在 Java 编程中,比较对象的相等性是一个常见的任务。然而,你是否知道在 Java 中有两种不同的方法来比较对象的相等性:== 操作符和 equals() 方法?本文将深入探讨这两种方法之间的区别以及何时使用它们。
== 操作符
首先,让我们来看看 == 操作符。在 Java 中,== 操作符用于比较两个对象的引用是否相等,也就是判断它们是否指向内存中的同一个对象。如果两个对象的引用指向同一个内存地址,== 操作符返回 true,否则返回 false。
例如如下代码:
String str1 = new String("xj"); String str2 = new String("xj"); String str3 = str1; System.out.println(str1 == str2); // 输出 false,因为两个不同的对象 System.out.println(str1 == str3); // 输出 true,引用指向同一个对象
equals() 方法
equals() 方法是 Object 类中定义的方法,用于比较两个对象的内容是否相等。默认情况下,equals() 方法在 Object 类中的实现与 == 操作符的行为相同,即只比较对象的引用。然而,许多类会覆盖 equals() 方法,以便在内容上比较对象。
我们先来看下Object equals()方法的源码:
public boolean equals(Object obj) { return (this == obj); }
可以看到,它使用的也是 == 操作符去判断的,所以我们如果要使用equals()判断我们自定义的对象的值是否相等时需要重写 equals() 方法,java 中其它的一些类基本都会重写equals()方法;
String 类的源码:
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,是的话在比较两个String 的值是否相同;
Integer 类源码:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
AbstractMap 类源码:
public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Map)) return false; Map<?,?> m = (Map<?,?>) o; if (m.size() != size()) return false; try { Iterator<Entry<K,V>> i = entrySet().iterator(); while (i.hasNext()) { Entry<K,V> e = i.next(); K key = e.getKey(); V value = e.getValue(); if (value == null) { if (!(m.get(key)==null && m.containsKey(key))) return false; } else { if (!value.equals(m.get(key))) return false; } } } catch (ClassCastException unused) { return false; } catch (NullPointerException unused) { return false; } return true; }
我们自定义的User 类
import java.util.Objects; public class User { private String name; private String address; private String userId; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return Objects.equals(userId, user.userId); } @Override public int hashCode() { return Objects.hash(userId); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } }
可以看到如果User对象不为null的话我们equals() 方法只需比较两个User对象的userId的值是否相同,相同的话即为同一对象,不需要比较其他属性。
区别详解
现在,让我们总结一下 == 操作符和 equals() 方法的区别:
- == 操作符比较对象的引用,判断是否为同一对象。
- equals() 方法比较对象的内容,但默认情况下与 == 的行为相同(比较引用)。
- 一些类会覆盖 equals() 方法以便在内容上进行比较,例如 String、Integer、Double 等。
当你需要比较对象的内容时,务必使用适当的方法。同时要注意处理参数为 null 的情况,以及在自定义类中正确地覆盖 equals() 方法,以便在语义上正确地比较对象内容。
总结
在 Java 编程中,理解 == 操作符和 equals() 方法的区别是至关重要的。通过本文的解释,相信你已经对这两种方法有了更清晰的认识。根据具体情况,选择正确的比较方式将有助于你编写更健壮和可靠的代码。
到此这篇关于Java中的==和equals()区别小结的文章就介绍到这了,更多相关Java ==和equals()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!