简介
"=="操作符的作用
- 用于基本数据类型的比较
- 判断引用是否指向内存中的同一块地址
equals 的作用:
- 默认情况下:判断两个变量是否是对同一个对象的引用,即指向的堆内存中的地址是否相同
- 也可重写,实现自己的比较逻辑
理论知识介绍
(一)Java中的基本数据类型和引用数据类型
- 基本数据类型: byte,short,char,int,long,float,double,boolean
- 引用数据类型: 接口、类、数组等
(二)Java的栈内存、堆内存和常量池
- 栈中存放的是基本数据类型的值和对象的引用
- 堆中存放的是new出来的对象和数组
- 常量池中存放字符串常量和final类型的变量
(三)Object类中的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
Object类是所有类的直接或间接父类,所有类中的equals()方法都继承自Object类。Object类中equals方法是用==判断对象引用是否指向同一内存地址。
(四)String类对equals方法进行了重写,如下:
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;
}
String类中equals方法首先判断对象的内存地址是否相等,相等则返回true。如果不满足,之后会判断括号内的对象是否是String类型,是的话则会判断两个字符串对象的的长度是否相等,最后转成char[]数组,判断每个位置的字符是否相等,如果相等则返回true。其实就是比较内容是否相等。
实例分析
例子一:
int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); //true
num1 和num2都是int类型,值都为10,因此使用”==”相等。
例子二:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2)); // true
System.out.println(s1 == s2); // true
首先在常量池中创建字符串“abc”,之后会在栈中创建引用s1和s2,并且都指向常量池中的“abc”,所以内存地址一样,值也一样。
例子三:
String s3 = new String("abc");
String s4 = new String("abc");
System.out.println(s3 == s4); // false
System.out.println(s3.equals(s4)); // true
s3和s4指向的是new出来的对象,开辟的是不同的堆内存,所以内存地址不同,但是值相同。
例子四:
String s1 = "abc";
String s3 = new String("abc");
String s5 = s3;
System.out.println(s1 == s3); // false
System.out.println(s1.equals(s3)); // true
System.out.println(s5==s3); // true
s3和s5是同一个对象的不同引用,指向的是相同的内存地址。
例子五:
class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
Student other = (Student) obj;
return this.age == other.age;
}
}
public class Test {
public static void main(String[] args) {
// s1和s2是两个不同的对象
Student s1 = new Student("Tom", 23);
Student s2 = new Student("Tom", 23);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
输出
false // 不同对象,引用地址不同
true // 重写了equals方法,比较的是年龄是否相同