1.==运算符
- 当比较类型是基本数据类型时,比较的是值是否相等,如:
int n1 = 1;
double n2 = 1.0;
System.out.println(n1 == n2);//true
2.当比较类型是引用数据类型时,比较两个对象的内存地址是否相等,也就是判断它们是否是同一个对象。特殊情况:在Java中,String类型是引用数据类型,但是有一个特殊的性质,即字符串常量池。当我们使用双引号创建一个字符串时,Java会先检查字符串常量池中是否存在相同内容的字符串,如果存在,则直接返回该字符串的引用,如果不存在,则在常量池中创建一个新的字符串,并返回其引用。如:
String n3 = "hello";
String n4 = "hello";
System.out.println(n3 == n4);//true
在上述例子中,n3和n4都是使用双引号创建的字符串"hello",因此它们实际上引用的是同一个字符串对象,即它们的地址是相同的。所以,n3 == n4的比较结果是true。
如果使用new关键字创建字符串对象,比如: String n3 = new String("hello"); String n4 = new String("hello"); 那么n3和n4将引用不同的字符串对象,它们的地址是不同的,n3 == n4的比较结果将是false。
2.equals()方法
equals方法是Object类中的一个方法,用于比较两个对象的内容是否相等。默认情况下,equals方法也是比较两个对象的内存地址是否相等。但是,我们可以在自定义类中重写equals方法,从而实现自己的比较逻辑。
例如,我们可以在自定义类中重写equals方法,比较类中的某些属性是否相等,来判断两个对象是否相等。这样我们就可以用equals方法来判断两个对象是否相等,而不仅仅是比较它们的内存地址。
public class Person {
String name;
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);
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person("Tom", 20);
Person person2 = new Person("Tom", 20);
// 使用"=="运算符比较两个对象
if (person1 == person2) {
System.out.println("person1 == person2");
} else {
System.out.println("person1 != person2");
}
// 使用equals方法比较两个对象
if (person1.equals(person2)) {
System.out.println("person1 equals person2");
} else {
System.out.println("person1 not equals person2");
}
}
}
这里我们定义了一个Person类,重写了equals方法,比较了其name和age属性是否相等。在main方法中,我们创建了两个相同内容的Person对象,并使用"=="运算符和equals方法分别比较它们是否相等。
最终输出的结果为:
person1 != person2
person1 equals person2