1、= = 的比较(两部分)
(1)基本数据类型的比较:
= = 在基本类型中比较的是内容,相同返回true,不同返回false。如:
int i = 10;
int j = 10;
System.out.println(i == j); //true
(2)引用类型的比较:
= = 在String类型中比较的是地址值,即变量名指向堆内存中的同一个地址值。相同返回true,不同返回false。如:
public class Test {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //false
System.out.println(s3 == s4); //false
}
}
先声明一点:
字符串创建对象之后,在堆内存中开辟空间,将对象放在其中,每new一个对象,即重新在堆内存中开辟新的空间,将其放入,即s3、s4都开辟了新的空间。当运行 String s1 = "hello";时,会在字符串常量池中寻找此字符串,若没有,则将此字符串放入字符串常量池中,在赋给s1。在执行 String s2 = "hello";时,同样地,在字符串常量池中寻找此内容,如果有,则直接赋给s2。如图:
总结: = = 的比较在基本数据类型中比较的是内容,而在String类型中比较的是地址值。
2、equals ( ) 的说明
(1)在Object类中:
equals ( ) 是Object根类的一个方法。在Object类中equals ( ) 比较的是地址值。
public boolean equals (Object obj){
return this == obj;
}
(2)在String类中:
在String类中,重写了equals方法,内容如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}
即:先判断地址值是否相等,相同返回true。如若不同,在判断是否是字符串类型以及内容相同,相同,返回内容。若不同,返回false。
3、 equals ( ) 在String类中的比较
public class Test {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
String s3 = "he" + "llo";
String s4 = "llo";
String s5 = "he" + s4;
String str = new String("hello");
String str1 = new String("hello");
System.out.println(s1.equals(s2)); //true
System.out.println(s1.equals(s3)); //true
System.out.println(s1.equals(s5)); //true
System.out.println(s1.equals(str)); //true
System.out.println(str.equals(str1)); //true
}
}
因为equals()方法重写之后比较的是内容是否相等,所以返回true。
最后,在比较中加入内存分析图以及了解String的深入理解会更直观的看出 = = 和 equals 方法的不同,= = 和 equals ()方法的比较就说到这,关于对于String的深入理解我会在下期的文章写道。还有,对于文章内的错误和不同的看法欢迎大家下方评论!!!