==比较的是地址,可以比较对象和属性;
equals只用来比较对象,equals内部是由==实现的,所以比较的也是地址,因为每个对象都继承了Object自带equals方法,但有些类库重写了equals方法。
1.首先对于属性的,因为是八种基本数据类型之一:byte,short,char,int,long,float,double,boolean,只能用==比较,而且比较的是他们的数值。
2.对于一般对象的比较,equals和==的效果相同,都是判断两个对象的地址是否相同,即是否是指相同一个对象。
但是,有几个特例:在一些类库当中equals这个方法被重写了,如String、Integer、Date。在这些特殊的对象中,==比较的还是地址,但是equal比较的是值。
例如我们声明了一个String对象a=“SSSS”,"SSSS"会被放到常量池中,再声明了一个String对象b="SSSS"时,只是指向常量池中同一个字符串的引用,所以,equals和==一样,都是true。如果写b=new String(“SSSS”),指定b偏不用常量池中的数据,结果就变成了false。
Integer在-127-128之间也是默认放到常量池中
代码:
public class LearnEquals {
int a1 = 128;
String sss = "SSSSSSSSS";
public static void fun1() {
//==八种基本类型,直接比较的值
LearnEquals learnEquals1 = new LearnEquals();
LearnEquals learnEquals12 = new LearnEquals();
//true
System.out.println(learnEquals1.a1 == learnEquals12.a1);
//比较一般对象,==和equal一样,比较的地址
//false
System.out.println(learnEquals1 == learnEquals12);
//false
System.out.println(learnEquals1.equals(learnEquals12));
//Integer是对象,int是属性。由于-127-128之间的数在常量池中,所以对象地址相同。
Integer i1 = 127;
Integer i2 = 127;
Integer ic = new Integer(127);
//true
System.out.println(i1 == i2);
//equals这里比较的是值 true
System.out.println(i1.equals(i2));
//false
System.out.println(i1 == ic);
//equals这里比较的是值 true
System.out.println(i1.equals(ic));
Integer i3 = 128;
Integer i4 = 128;
//false
System.out.println(i3 == i4);
//true
System.out.println(i3.equals(i4));
}
public static void fun2() {
LearnEquals learnEquals1 = new LearnEquals();
LearnEquals learnEquals12 = new LearnEquals();
System.out.println(learnEquals1.equals(learnEquals1));
String A = "SSSSSSSSS";
String B = "SSSSSSSSS";
//常量池 全是true
System.out.println(A.equals(B));
System.out.println(A == B);
System.out.println(A.equals(learnEquals1.sss));
System.out.println(A == learnEquals1.sss);
}
}
总结:
比较八种数据类型,只能用==,且是值比较。
比较一般对象(除String、Integer、Date)==和equals一样都是比较地址,看是不是同一个对象。
比较String、Integer、Date时,==还是比较地址(这里还要注意是不是常量池),equals是比较的值。