结论:
一般 == 表示完全相同 equals表示对象内容相同
1、“==”底层实现
“==”默认比较内存地址,即是否是同一对象。如果是基本类型则表示值相等
2、equals底层实现
Object类中的实现:也是完全相等
public boolean equals(Object obj) { return (this == obj); }
3、String类中重写equals方法
1.若是同一对象则相等
2.若不是同一对象且是String类型,则挨个挨个比较字符
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
补充:
JDK提供的一些类,如String、Date、包装类等,重写了Object的equals方法,调用这些类的equals方法, x.equals (y) ,当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回 true 否则返回 false。
易错提醒
1、为什么Java中1000==1000为false而100==100为true?(也可以参考自动装箱)
JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,所以地址不一样。