在Object类中,==和equals()方法的作用是一样的,都是用来比较两个元素在内存中存放的地址。java的其他类继承了Object方法,并且一般都重写了equals()方法,比如String类等等。equals()方法用来比较两个对象的内容是否一致。
下面通过几个例子说明:
public class EqualsDemo_01 {
public static void main(String[] args){
String s1 = new String("hello");
String s2 = new String("hello");
if(s1 == s2){
System.out.println("s1 == s2" + (s1 == s2));
}
if(s1.equals(s2)){
System.out.println("s1.equals s2");
}
}
}
输出:
s1.equals s2
通过new关键字,是新建对象,所以,两个对象在内存中地址不一样,s1==s2为false,但是两者的内容相同。
public class EqualsDemo_02 {
public static void main(String[] args){
String s1 = "hello";
String s2 = "hello";
if(s1 == s2){
System.out.println("s1 == s2 ? " + (s1 == s2));
}
if(s1.equals(s2)){
System.out.println("s1.equals s2");
}
s1 = s1+"world";
String s3 = "helloworld";
if(s1 == s3){
System.out.println("s1 == s3 ? " + (s1 == s3));
}
if(s1.equals(s3)){
System.out.println("s1.equals s3");
}
}
}
输出为:
s1 == s2 ? true
s1.equals s2
s1.equals s3
尽管拼接以后的s1和s3是一样的,但是他们仍是两个不同的对象,占用不同的内存空间。
public class EqualsDemo_03 {
public static void main(String[] args){
String s1 = "hello";
String s2 = new String("hello");
if(s1 == s2){
System.out.println("s1 == s2" + (s1 == s2));
}
if(s1.equals(s2)){
System.out.println("s1.equals s2");
}
s2 = s2.intern();
if(s1 == s2){
System.out.println("s1 == s2? " + (s1 == s2));
}
if(s1.equals(s2)){
System.out.println("s1.equals s2");
}
}
}
输出:
s1.equals s2
s1 == s2? true
s1.equals s2
在这里,使用了一个intern()方法,这个方法会检查现在的字符串池,如果创建的字符串已经存在,就返回已经存在的字符串引用,如果不存在,就在字符串池中添加这个字符串的引用。