跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 工具系统 > 数据分析 > 【Java扫盲篇】==和equals的区别

【Java扫盲篇】==和equals的区别

时间:2024-03-24 18:47:55 来源:网络cs 作者:往北 栏目:数据分析 阅读:

标签: 区别  扫盲 

这是一道面试经典题,面试官对你说:小伙子,请你说说==和equals的区别

==

对于==来说

如果比较的是基本数据类型,那么==比较的是数据的值是否相同。注意:(与数据类型无关)
        int a = 10;        int b = 10;        System.out.println(a==b);//结果为true        int c = 10;        float d = 10;        System.out.println(c == d);//结果为true
如果比较的是引用数据类型,那么==比较的是两个对象的地址是否相同,即两个引用是否指向同一块地址
        String s1 = "hello world";        String s2 = "xiaoguo";        System.out.println(s1 == s2); //结果为flase        String s3 = "tyut";        String s4 = "tyut";        System.out.println(s3 == s4);//结果为true
class Student{    public int age;    public String name;    public  Student(int age,String name){        this.age = age;        this.name = name;    }    public static void main(String[] args) {        Student student1 = new Student(18,"张三");        Student student2 = new Student(18,"张三");        System.out.println(student1 == student2);//结果为false    }}

明明student1 和 student2的内容相同,为什么结果却是false呢?

这是因为在堆中,会为每一个对象分配内存地址值,此时student1和student2指向不同的地址值,结果就为flase了
那你肯定有疑问,为什么s3和s4结果就为true呢?因为Java虚拟机中,字符串常量是共享的,在拥有“tuyt”的情况下,再创建s4时,就不需要再创建新的对象指向“tyut”,而是和s3一样,指向同一个地址值,所以结果为true

equals

如果类中重写了equals方法,其比较的是存放的内容是否相等
String、Date、File、包装类都重写了Object类的equals方法。

注意:
如果类中没有重写equals方法,比较地址值是否相等(是否指向同一个地址值)。

        String s1 = "hello xiaohua";        String s2 = "hello xiaohua";        System.out.println(s1.equals(s2));//结果为true

这是为什么呢?这是因为String重写了equals方法

public boolean equals(Object anObject) {        if (this == anObject) {        //这里的==是判断地址,如果地址相同那么肯定内容就相同        //但内容相同,地址不一定相同哦,        //因为完全有可能将多个内容相同的字符串存放到不能的位置            return true;        }        if (anObject instanceof String) {        //这里就是简单枯燥的一个字符一个字符比较        //如果不是String类型,会被强转成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;    }

再看下一个例子,请你给出判断结果

   public static void main(String[] args) {        Student student1 = new Student(18,"张三");        Student student2 = new Student(18,"张三");        System.out.println(student1.equals(student2));    }

结果为false,这又是为什么呢?
首先我们要复习一个知识,Java所有的类的父类都是Object类,自定义的Student类也是如此。
这时你是否恍然大悟,是时候该到Object的源码里查找equals方法了
在这里插入图片描述
此时我们找到Objec类,找到equals方法,可以看到equals方法底层是通过==来进行判断的。
那为什么String进行比较结果就是true呢?还记得前面提到过String、Date、File、包装类都重写了Object类的equals方法。
既然这样,当我们想要判断里面存放的内容相同时,就要重写equals方法了。

  public boolean equals(Object obj) {       if (this == obj){           return true;       }       if (obj instanceof Student){           Student stu = (Student) obj;           return this.age == stu.age && this.name.equals(stu.name);       }        return false;    }

再次运行结果为true
那么每次都要手写吗?
当然不是,idea提供了快捷键,可以一键重写方法

    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Student student = (Student) o;        return age == student.age && Objects.equals(name, student.name);    }

alt+insert (或者右键)然后选择equals()and hashsCode()
之后一路next就可以了

在这里插入图片描述

以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!

本文链接:https://www.kjpai.cn/news/2024-03-24/148088.html,文章来源:网络cs,作者:往北,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论