1.'=='操作符
什么是'=='?
==
是 Java 中的比较操作符,用于比较两个变量或对象的内存地址或数值。
- 基本数据类型:
==
用于比较变量的数值是否相等。 - 引用数据类型:
==
用于比较两个对象的引用地址是否相同,判断它们是否指向同一个对象。
示例 1:==
比较基本数据类型
int a = 5;
int b = 5;
System.out.println(a == b); // 输出:true,因为 a 和 b 的值都是 5
示例 2:==
比较引用类型
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // 输出:false,因为 str1 和 str2 是不同的对象,内存地址不同
尽管 str1
和 str2
内容相同,但 ==
比较的是它们在内存中的地址,因此结果为 false
。
2. equals()
方法
什么是 equals()
?
equals()
是 Object
类中的方法,默认情况下也用于比较两个对象的引用地址,即判断两个对象是否为同一个对象。然而,许多类(如 String
、Integer
)都会重写 equals()
方法,使其能够比较对象的内容。
示例 1:equals()
比较字符串内容
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // 输出:true,因为 `String` 类重写了 `equals()`,比较的是字符串内容
在 String
类中,equals()
方法被重写为比较字符串的内容,因此尽管 str1
和 str2
是不同的对象,但它们的内容相同,equals()
返回 true
。
示例 2:equals()
的默认行为
如果自定义的类没有重写 equals()
方法,则会继承 Object
类的默认实现,比较的是引用地址。
class Person {
String name;
Person(String name) {
this.name = name;
}
}
Person p1 = new Person("Alice");
Person p2 = new Person("Alice");
System.out.println(p1.equals(p2)); // 输出:false,因为 `Person` 没有重写 `equals()`,默认比较引用地址
尽管 p1
和 p2
的 name
属性相同,但它们是不同的对象,因此 equals()
默认返回 false
。
3. ==
和 equals()
的区别总结
4. ==
和 equals()
在字符串中的区别
String
是 Java 中最常见的引用类型之一。由于 String
类重写了 equals()
,使得两个字符串对象的比较基于它们的内容,而不仅仅是内存地址。
示例:字符串池和 ==
Java 中有一个字符串池机制,字面量字符串会存储在池中。如果两个字面量字符串相同,它们会共享同一块内存,因此使用 ==
比较时结果为 true
。
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2); // 输出:true,因为 s1 和 s2 指向相同的字符串池中的地址
System.out.println(s1.equals(s2)); // 输出:true,因为内容相同
然而,用 new
关键字创建的字符串每次都会创建新的对象,即使内容相同,==
也会返回 false
,因为它们是不同的对象。
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // 输出:false,因为它们是不同的对象
System.out.println(s1.equals(s2)); // 输出:true,因为内容相同
5. 如何重写 equals()
方法
在自定义类中,如果希望根据对象的内容而不是内存地址来判断两个对象是否相等,通常需要重写 equals()
方法。
示例:重写 equals()
class Person {
String name;
int age;
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 && name.equals(person.name);
}
}
Person p1 = new Person("Alice", 25);
Person p2 = new Person("Alice", 25);
System.out.println(p1.equals(p2)); // 输出:true,因为内容相同
在这个例子中,Person
类重写了 equals()
方法,以根据 name
和 age
判断对象是否相等。
6. hashCode()
和 equals()
的关系
在 Java 中,hashCode() 和 equals() 之间有一个重要的约定:如果两个对象根据 equals() 是相等的,那么它们的 hashCode() 值也必须相等。否则,在使用哈希表(如 HashMap、HashSet)时会出现问题。
示例:重写 equals()
和 hashCode()
class Person {
String name;
int age;
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 && name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
总结
==
:用于比较基本数据类型的值或引用类型的内存地址。equals()
:用于比较引用类型的内容(需重写)。
标签:JAVA,name,age,equals,Person,------,new,String From: https://blog.csdn.net/weixin_66834439/article/details/143477265