说说你对 == 与equals 的理解

这道题目前出现在笔试题中相当多,其实很简单的。

==

基本数据类型

如果是基本数据类型的比较,则比较的是值。

int a = 1000;
int b = 999;
if(a == b){
    System.out.println("a == b");
}

这里 == 比较的是a的值1000和b的值999是否相当。

基本数据类型:

byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。

short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。

int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。

long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。

float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。

double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。

boolean:只有true和false两个取值。

char:16位,存储Unicode码,用单引号赋值。

如果 == 用于以上八种基本数据类型比较的时候,比较的是值。

包装类(引用类)

如果是包装类或者引用类的比较,则比较的是对象地址。

User user1 = new User("张三",20);
User user2 = new User("老田",20);
if(user1 == user2){
   System.out.println("老田就是张三");
}

这时候比较的是user1指向的地址和user2指向的地址是否一致。

equals

没有重写equals方法

是Object的方法。

alt

网上都说,equals是比较的是内容,很多都是瞎说。具体问题具体分析。

如果比较的类没有重写Object中的equals方法,那么比较的就是两个对象的地址,就是使用==来比较的。

重写equals方法

重写了equals方法后,还得看equals方法是如何写的。

典型的String/Integer等这些都是重写了eqauls方法的。

在Integer中

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

比较的就是对应的数字。

在String中

    public boolean equals(Object anObject) {
        //同一个对象地址,直接返回true
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            //字符串长度不一直,就直接返回false
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                //长度一样的字符串,然后比较字符串中的内容
                while (n-- != 0) {
                    //挨个比较,只要有不一致的就返回false
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }


比较的是字符串内容。

String aa = "abcd";
String bb = "abcde";
aa.equals(bb)

把字符串拆成char数组进行一个一个比较。

自定义类中重写equals方法

public class User {
    private Long id;
    private String userName;

    public User() {
    }

    public User(Long id, String userName) {
        this.id = id;
        this.userName = userName;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    //equals方法爱怎么写就怎么写
    //比如说一个正常的人比较,只要身份证号一样,那就肯定是同一个人了。
    //所以在equals的时候我们也可以只比较身份证号就可以了。
    @Override
    public boolean equals(Object o) {
        //同一个对象地址,直接返回true
        if (this == o) {
            return true;
        }
        //为null或者Class不一致返回false
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        User user = (User) o;
        //当两个对象的id相同并且userName相同才返回true
        return Objects.equals(id, user.id) &&
                Objects.equals(userName, user.userName);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, userName);
    }
}

上面Objects.equals

public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
}

总结

== 用于基本数据类型比较的是值

==用于包装类(引用类)比较的是对象地址。

equals方法没有重写还是比较对象地址。重写equals方法后还得看是如何重写的。

欢迎评论区一起探讨技术,提升自我,早日实现自己的梦想!

全部评论

相关推荐

大方的大熊猫准备进厂:1.教育背景:你希望从事什么专业的工作你的主修课就是什么;成绩优秀是你应该做的,没什么可描述的,成绩不优秀也许人家在大学忙着创业呢?(成绩优秀不一定是好事,只能说明多元化的大学你上成了高中,没有真正上明白大学,反而体现了你死板,不爱社交,没有别的突出能力) 2.实践经历:你想表达的意思没有说清楚。你是说你会个性化服务,还是你有实习经历。如果没有带来,经济收益,表彰,更好的发展前景,那你还不如说说提升了自己哪些技能。你说有人给你送锦旗我都能明白你优秀,但是你说你会xxxx,你说这话谁信,证据呢。 3.入伍经历:你描述的就是你的工作职责或者你应该做的,并没有体现出来你把这个事情做好了,而且入伍经历并不能证明你能干好你要应聘的工作,不如只写经历其余所有内容都不写。 4.荣誉技能:重点突出一下,但不要过多描述,这些荣誉的含金量懂得都懂。 重点:你要应聘什么工作(具体岗位,实习生不具体),你的期望薪资
点赞 评论 收藏
分享
自由水:笑死了,敢这么面试不敢让别人说
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务