一句话:
==比较的是内存地址,如果内存地址相同,则相同;
equals 内存地址相同则相同,如果内存地址不相同,看子类equals重写方法的具体实现。
package JavaCoreTechDemo.base; import sun.misc.Unsafe; import java.lang.reflect.Field; /** * Created by IntelliJ IDEA. * User: zz * Date: 2015/5/10 */ public class JavaEqualsAndDoubleEqual { public static void main(String[] args) throws Exception { testInt(); testNotOverrideEquals(); testStringEquals(); testNewStringEquals(); } private static void testInt() { System.out.println("=====================testInt========================="); int a = 1; int b = 1; System.out.println(String.format("a mem addr=%s,b mem addr=%s", AddressPrint.addressOf(a), AddressPrint.addressOf(b))); if (a == b) { System.out.println("a==b"); } Integer c = new Integer(a); Integer d = new Integer(b); System.out.println(String.format("c mem addr=%s,d mem addr=%s", AddressPrint.addressOf(c), AddressPrint.addressOf(d))); if (c == d) { System.out.println("Integer c == Integer d"); } System.out.println("this.value=" + c.intValue()); System.out.println("(Integer)var1=" + (Integer) d); if (c.equals(d)) { System.out.println("Integer c equals Integer d"); } } private static void testNotOverrideEquals() { System.out.println("=====================testNotOverrideEquals========================="); TestA testA1 = new TestA(); TestA testA2 = new TestA(); System.out.println(String.format("testA1 mem addr=%s,testA2 mem addr=%s", AddressPrint.addressOf(testA1), AddressPrint.addressOf(testA2))); if (testA1 == testA2) { System.out.println("TestA testA1 == TestA testA2"); } else { System.out.println("TestA testA1 != testA2"); } if (testA1.equals(testA2)) { //默认实现的equals比较的是对象的内存地址 System.out.println("TestA testA1 equals testA2"); } else { System.out.println("TestA testA1 not equals testA2"); } } private static void testStringEquals() { System.out.println("=====================testStringEquals========================="); String s1 = "Monday"; String s2 = "Monday"; System.out.println(String.format("s1 mem addr=%s,s2 mem addr=%s", AddressPrint.addressOf(s1), AddressPrint.addressOf(s2))); //==比较的是内存地址,s1和s2内存地址一样 if (s1 == s2) { System.out.println("s1 == s2"); } else { System.out.println("s1 != s2"); } if (s1.equals(s2)) { System.out.println("s1 equals s2"); } else { System.out.println("s1 not equals s2"); } } private static void testNewStringEquals() { System.out.println("=====================testNewStringEquals========================="); String s1 = "Monday"; String s2 = new String("Monday"); //==比较的是内存地址,s1和s2内存地址不一样 System.out.println(String.format("s1 mem addr=%s,s2 mem addr=%s", AddressPrint.addressOf(s1), AddressPrint.addressOf(s2))); if (s1 == s2) { System.out.println("s1 == s2"); } else { System.out.println("s1 != s2"); } //String类重写了equals,比较的是每个字符 if (s1.equals(s2)) { System.out.println("s1 equals s2"); } else { System.out.println("s1 not equals s2"); } } } class TestA { } class AddressPrint { private static Unsafe unsafe; static { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); unsafe = (Unsafe) field.get(null); } catch (Exception e) { e.printStackTrace(); } } public static String addressOf(Object o) { Object[] array = new Object[]{o}; long baseOffset = unsafe.arrayBaseOffset(Object[].class); int addressSize = unsafe.addressSize(); try { long objectAddress; switch (addressSize) { case 4: objectAddress = unsafe.getInt(array, baseOffset); break; case 8: objectAddress = unsafe.getLong(array, baseOffset); break; default: throw new Error("unsupported address size: " + addressSize); } return (Long.toHexString(objectAddress)); } catch (Exception e) { System.out.println("unsupported address size:" + addressSize); return null; } } }