1.equals比的是双方对象中的内容是否相等.
2."=="比较时分两种情况
(1)如果比较的双方是java的基本数据类型(char,byte,short,int,long,float,double,boolean),那么'=='比较的依据是双方的直是否相等.
int i=2;
int k=2;
System.out.println(i==k); //返回ture
String str1 = "abc";
String str2 = "abc";
//以上两个语句都创建对象.引号内包含文本是String类特有创建对象的方式.但是"=="返回的结果是true,为什么呢?因为在JVM内,存在字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率.字符串池由String类维护,我们可以调用intern()方法来访问字符串池。当运用引号内包含文本创建对象时,所创建的对象是加入到字符串池里面的.如果要创建下一个字符串对象,JVM首先会到字符串池中寻找,是否存在对应的字符串对象,如果存在,则返回一个己存在对象的对象的引用给要创建的对象引用.如果不存在,才会创建一个新的对象,并返回一个新对象的对象引用给要创建的对象引用.以上这段话理解起来可能比较拗口.用代码理解就是str2和str1是两个对象引用,并指向了同一个对象.所以'=='返回的是true.
重点:只有引号内包含文本创建对象才会将创建的对象放入到字符串池. String str = new String("abc")这种方法创建的字符串对象是不放入到字符串池的.所以,引号内包含文本创建对象的性能要比后来那种方法创建字符串对象的性能要好.
String str3 = str1+str2; //这种创建方式是不放入字符串池的.
String str4 = str1+"cd"; //这种创建方式是不放入字符串池的.
String str5 = "ab"+str2; //这种创建方式是不放入字符串池的.
String str6 = "ab"+"cd" //这种创建方式是放入字符串池的.这种情况实际上是创建了1个对象,abcd"1个对象
System.out.println(str1==str2); //返回ture
System.out.println(str1.equals(str2)); //返回ture
(2)如果比较的双方是对象的变量类型,那么'=='比较的依据是双方的对象的引用是否是指向同一个对象.
Date d1 = new Date();
try
{
Thread.sleep(500);
}
catch(Exception e)
{
e.printStackTrace();
}
Date d2 = new Date();
Date d3 = d1;
System.out.println(d1==d2); //返回false
System.out.println(d1==d3); //返回true
System.out.println(d1.equals(d2)); //返回false
System.out.println(d1.equals(d3));//返回true
如果没有线程休息, System.out.println(d1.equals(d2));返回ture,因为在一个时间点内创建了两个Date对象.也就是说两个对象代表的时间是相等的.