zoukankan      html  css  js  c++  java
  • 【java基础】==和equals

    我是 啤酒就辣条,一个Java。
    学而时习之,不亦说乎?希望通过博客的形式,总结、分享,梳理自己、帮助他人。
    另外,啤酒就辣条,味道不错哦~

    两种相等

    ==是比较两个对象引用所指向的地址是否相同。

    equals本身等同于==,但是由于经常被重写,所以常被用来判断两个对象内容是否相同。

    示例展示

    首先新建一个类CPU

    public class CPU {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    public class EqualsTest {
        public static void main(String[] args) {
            CPU cpu1 = new CPU();cpu1.setName("因特尔");
            CPU cpu2 = new CPU();cpu1.setName("因特尔");
            CPU cpu3 = cpu1;
            System.out.println(cpu1 == cpu2);//false
            System.out.println(cpu1.equals(cpu2));//fasle
            System.out.println(cpu1 == cpu3);//true
            System.out.println(cpu1.equals(cpu3));//true
        }
    }
    

    直接看,==equals等价,这是为什么呢?要看一下万物之祖Object

    public class Object {
        public boolean equals(Object obj) {
            return (this == obj); //所以说,`equals`本身等同于`==`
        }
    }
    

    常常被重写的equals

    我们常常需要比较两个对象内容是否相同,而不是他们的地址。所以,JDK中多数类都重写了equals方法。

        // String 的 equals方法比较的是字符串内容本身
        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;
        }
        // Integer 的 equals方法比较的是数值内容本身
        public boolean equals(Object obj) {
            if (obj instanceof Integer) {
                return value == ((Integer)obj).intValue();
            }
            return false;
        }
    
    public class EqualsTest {
        public static void main(String[] args) {
            Integer integer1 = new Integer(500);
            Integer integer2 = new Integer(500);
            System.out.println(integer1 == integer2); //fasle
            System.out.println(integer1.equals(integer2)); //true
        }
    }
    

    从上面的例子可以看出equals此时比较的是数值内容。

    关于Integer的小秘密

    我们将上面的例子稍微改造一下:

    public class EqualsTest {
        public static void main(String[] args) {
            Integer integer1 = 500;
            Integer integer2 = 500;
            System.out.println(integer1 == integer2);//false
            System.out.println(integer1.equals(integer2));//true
        }
    }
    

    和上面的例子相比,此时integer1和integer2需要装箱操作,但是不影响结果。

    but,我们将数值调小一点:

    public class EqualsTest {
        public static void main(String[] args) {
            Integer integer1 = 50;
            Integer integer2 = 50
            System.out.println(integer1 == integer2);//true
            System.out.println(integer1.equals(integer2));//true
        }
    }
    

    此时发现integer1 == integer2居然相等,说明指向同一块内存。这一现象的原因是:Integer的[-128,127]这个范围的数值缓存在常量池,所以无论多少引用,只要数值在这个范围内,引用都指向同一地址

    所以对于Integer比较数值大小,无论数值是否需要经历装箱,都是用equals比较大小

  • 相关阅读:
    OPENDS 5.0 OPEN SOURCE DRIVING SIMULATION
    求推荐计算机图形学,渲染,shader方面的入门书籍
    交通流仿真|万字综述
    Hbase数据备份导入导出
    hadoop用法之mapreduce的应用场景
    mapreduce
    google论文四 Bigtable:结构化数据的分布式存储系统(上)
    经典SQL语句大全
    socket编程之登峰造极完成端口
    BCGControlBar的使用
  • 原文地址:https://www.cnblogs.com/pjjlt/p/12408074.html
Copyright © 2011-2022 走看看