1、“==” 和 equals() 区别?
1.1 使用场景不同
- ==的使用场景:
- 用于八种基本数据类型的比较,比较的是数据的值是否相等。
- 用于引用数据类型的比较,比较的是内存地址是否相等。
- equals()的使用场景:
- equals()方法是用于引用数据类型的比较,是在Object类中的方法,默认情况下,比较的是内存地址是否相等。
- 我们会根据不同的使用条件,在其他地方进行equals()方法的覆写,如String类中就覆写了equals()方法,实现了字符串的比较。
1.2 通过代码分析:
实例1:
public class JavaDemo {
public static void main(String[] args) {
int x = 10 ; //定义基本数据类型;
int y = 10 ;
String strA = new String("hello"); //定义字符串对象。会开辟新的内存空间。
String strB = new String("hello");
// 1、==用于基本数据类型的比较时,比较数据的值;
System.out.println(x == y);
// 2、==用于引用数据类型的比较时,比较的是数据的内存地址
System.out.println(strA == strB);
// 3、equels()方法对于引用数据类型的比较
System.out.println(strA.equals(strB));
}
}
程序执行结果:
true (用 ==判断 x 和 y 的数据值相同)
false (用 ==判断 strA和strB的内存地址不同)
false (用 equals()判断 strA和strB的内存地址不同)
实例2:
public class JavaDemo {
public static void main(String[] args) {
String strC = "hello" ;
String strD = "hello" ;
System.out.println(strC == strD);
System.out.println(strC.equals(strD)) ;
}
}
程序执行结果:
true
true
在这里之所以strC
和 strD
相等的原因在于引入字符串常量池的概念。程序在执行strC = "hello" ;
时,如果常量池中没有"hello"对象,那么就会在常量池中创建一个"hello"对象,当strD = "hello" ;
执行的时候,发现常量池中就不会开辟新内存空间,直接从常量池中获取,导致strC
和strD
的内存地址相同。即使用“==”判断也依旧为true。
但是值得我们注意的是,System.out.println(strC.equals(strD)) ;
执行的结果是true,然而它并不是像之前一样去判断strC
和 strD
的内存地址,而是对于字符串内容的判断。这是因为我们之前提到过的,在String类中,覆写了Object父类的equals()方法(同时也覆写了hashcode()
方法),方便我们对于字符串的比较。
之所以出现上述两个实例的原因,同时也和String 类的两种实例化方法有关,想要更深入的理解这个问题,可以对相关知识点进行复习(只针对像我一样的菜鸟)
注:如果文中有什么错误,希望各位大佬和小伙伴们不吝赐教,同时有什么地方需要改进,也希望各位能够提出宝贵的意见。