Java中 ==与equals知识点的一些补充

使用==时

基本类型变量:值相同即相同
引用类型变量:指向的地址相同即相同

String s1 = "aaa" ;
String s2 = "aaa" ;
System.out.println(s1 == s2);
//返回true
String s3 = new String("aaa");
String s4 = new String("bbb");
System.out.println(s3 == s4);
//返回false

==号与equals其实没有区别,同样要求两个引用变量指向同一个对象才会返回true。因此object类提供的equals方法其实没有实际意义

通过重写自定义相等标准,采用重写equals方法来实现。String类本身就已经重写了equals方法。只要字符串包含的字符序列相同,就返回true

String s1 = "abc" ;
	String s2 = "a" ;
	String s3 = "bc" ;
	
	String s4 = "a" + "bc" ;
	String s5 = "a" + "b" + "c" ;
	String s6 = s2 + s3 ;
	String s7 = new String("abc") ;
	
	System.out.println(s1 == s4);	//true
	System.out.println(s1 == s5);	//true
	System.out.println(s1 == s6);	//false
	System.out.println(s1 == s7);	//false

jvm常量池会保证相同的字符串只有一个,不会产生多个副本。
故s1、s4、s5 其实在编译期就已经确定下来了,他们都是引用常量池一个字符串对象

使用new String创建的字符串对象在运行期创建出来的,他被保存在运行时的栈内存中,不会进入常量池。

判断是否为同一个类 A.getClass == B.getClass

重写equals方法应该满足下列条件:

自反性: x.equals(x)一定为true
对称性: x.equals(y)为true,反过来也成立
传递性: x.equals(y)为true,y.equals(z)为true,则x对z也成立
对任何非null的x,x.equals(null)一定为false

object默认提供的equals方法比较的是对象的地址,对于object类而言,equals于==号是结果完全一样的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章