用此blog记录我学习的过程,文中若有不恰当的地方,还望友情指出互相学习。
一、== 主要有两种比较形式 基本数据类型(也称原始数据类型):byte,short,double,char,int,long,float,boolean.他们之间的比较应该用==,比较的是他们的值是否相等。 引用数据类型:当他们在用==比较的时候,比较的是他们在内存中的存放地址。(除非是同一个new出来的对象,他们比较的结果是true,否则都是false,因为每一次new都会重新开辟一块内存空间出来。) 二、equals()方法Java中所有的类都继承自Object类,equals()方法就在Object类中被定义,源码为:
public boolean equals(Object obj) {
return (this == obj);
}
可以看到,这个方法初始默认是比较的两个对象的地址值,但是在一些类中被重写了,如Sting类重写了equals()方法,一般都是用来比较两个成员变量的值是否相同,而不是再比较两个对象在内存中的存放地址。
做个小结
==的作用:
基本数据类型:比较的是值是否相等
引用数据类型:比较的是地址是否相等
equals()的作用
默认情况下比较的是地址的值
若重写了equals方法(一般都是自动生成)比较的是对象的值是否相等
三、关于String类的equals()方法
下面举例说明:
public class Test {
public static void main(String[] args) {
Student a = new Student();
Student b = new Student(); //每new一次都会开辟一块新的内存空间
System.out.println(a==b); //false a与的b地址不同
System.out.println(a.equals(b)); //false a与b的地址不同
String aa = "ab"; //放在常量池中
String bb = "ab"; //从常量池中查找
//***这里值得注意
System.out.println(aa==bb); //true aa与bb指向同一个对象
System.out.println(aa.equals(bb)); //true 两对象的值都是“ab”
}
}
关于倒数第二个为什么是true呢,要先来讲讲String pool(字符串常量池)了,下面先引用一张图片进行说明:
我们看到在创建str1时,在堆内存中的String pool中开辟了一块内存空间装入“Hello World” ,值得注意的是,在这个String pool常量池中,仅创建和存储一个值为“ Hello World”的String对象。任何其他获得值“ Hello World”的字符串将引用池中的同一String对象。所以上面的例子中aa==bb为true。
现在在看这样一个例子:
public static void main(String[]args){
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str2);//true
System.out.println(str1 == str3);//false
}
第一个为true我们可以理解,那为什么str1==str3是false呢,这意味着str3没有指向String pool中与str1相同的String对象,上面我们说过,在String pool中仅仅会创建和存储一个值相同的String对象,而当用new关键字创建String对象时,会在堆中创建一个全新的String对象,此String实例并不存储在String pool中,而是存储在普通的堆中。
注:以后在判断两个字符串是否相等的时候就使用equals()方法就行了
参考:
https://examples.javacodegeeks.com/core-java/lang/string/java-string-pool-example/
https://www.cnblogs.com/qianguyihao/p/3929585.html
作者:世银