• JAVA equals和==的区别


    一句话:

    ==比较的是内存地址,如果内存地址相同,则相同;

    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;
            }
        }
    
    }
    

      

  • 相关阅读:
    UVa 1592 Database(巧用map)
    TZOJ 4746 Xiangqi(模拟棋盘数组)
    TZOJ 1545 Hurdles of 110m(01背包dp)
    TZOJ 2754 Watering Hole(最小生成树Kruskal)
    TZOJ 1242 求出前m大的数(预处理)
    TZOJ 5280 搜索引擎(模拟字符串)
    TZOJ 4865 统计单词数(模拟字符串)
    TZOJ 5279 马拉松比赛(广搜)
    [luogu4735]最大异或和
    小奇回地球
  • 原文地址:https://www.cnblogs.com/guanjie20/p/10843535.html
Copyright © 2020-2023  润新知