大家先来做个题目,以下看下自己能不能作对。
public class Test1{
public static void main(String args[]){
String a="1234";
String b="1234";
String c = new String("1234");
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a.equals(c));
}
}
正确答案是答案是:1.true 2.false 3.true
下面我来分析下过程:
①第一次String a="1234"时,会在常量池中创建一个常量1234,String b=1234时,常量 池中已经有了该常量,所以直接取,a和b的地址一样,所以地址值相等;
②String c = new String("1234")重新new了对象,在堆内存中开辟了新的空间,所以地址值不相等,
③String 类中重写的 equals 方法,所以只比较字符串内容 , 不比较地址值所以为true
(但在一些类库当中这个方法 被重写 了,如 String,Integer,Date 在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。)
最后我再总结下equals()与==的区别:
①对于==号来说,如果是作用于基本数据类型的变量,比较的是他们的值是否相等;
如果是作用于引用类型的变量,是判断两个对象内存地址是不是相等。
②对于equals()来说,如果没有重写equals()办法,等价于通过“==号”比较这两个对象。
如果重写equals()办法,作用是比较内容是否相同。如果内容相等,则返回true。
(如String,Data中的这个方法重写了,作用比较内容是否相同。)