在Java中,`==`和`equals()`是用于比較對象的兩種不同方法,它們有著不同的用途和行為。以下是它們的區別:
`==` 運算符
- **用途**:用于比較兩個變量是否引用同一個對象。
- **比較內容**:比較的是兩個引用是否指向同一個內存地址。
- **適用范圍**:可以用于比較基本數據類型和引用類型。
- **示例**:
```java
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // 輸出 false,因為它們是不同的對象
```
`equals()` 方法
- **用途**:用于比較兩個對象的內容是否相同。
- **比較內容**:比較的是對象的實際內容,而不是內存地址。
- **適用范圍**:主要用于比較引用類型,尤其是字符串和自定義對象。
- **示例**:
```java
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // 輸出 true,因為它們的內容相同
```
具體區別
1. **基本數據類型**:
- `==`:比較的是值是否相等。
- `equals()`:不能用于基本數據類型。
2. **引用類型**:
- `==`:比較的是引用是否相同,即是否指向同一個對象。
- `equals()`:比較的是對象的內容是否相同。
3. **字符串比較**:
- `==`:比較的是字符串對象的引用是否相同。
- `equals()`:比較的是字符串的內容是否相同。
自定義對象的比較
對于自定義對象,如果需要使用`equals()`方法進行內容比較,需要重寫`equals()`方法。例如:
```java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
```