Java中的equals和==

来源:互联网 发布:国密sm3算法 编辑:程序博客网 时间:2024/05/22 10:37

今天第一次创建自己的博客,也是自己第一次开始正儿八经写博客文章,给自己定个小目标,以后每天都能有一篇博客上线,每天一篇小博文,两周一篇中型博文,一个月一篇大型博文,希望毕业之后能进阿里,好了直接进入正题。
之前有看过一些关于equals和==的比较的问题,但是自己没有做过总结总感觉记不住也理解不了,所以我认为最好的学习方法还是要自己总结一遍。想弄清楚这个问题,我认为需要分为基本数据类型和其他数据类型、类来看。
首先来看一下基本数据类型在这个问题中的表现,首先我们需要了解,”.”点运算符只能用于类的成员或者方法,所以基本的数据类型(逻辑型boolean,字符型char,整型byte,short,int,long,浮点型float,double)都不能使用.equals进行判断,此时只能使用“==”进行判断,此时“==”的意义只是数字上的和字符上的相等。
再来看看其他的数据类型在这个问题上的表现,其中最为代表性的就是String这个既不是基本的数据类型但是却非常频繁的被使用的这么一种数据结构,先对“==”进行测试,代码如下:

String sentence1 = "例句";String sentence2 = "例句";System.out.println(sentence1 == sentence2);//trueSystem.out.println(sentence1.equals(sentence2));//true

“==”和“.equals()”的情况一样其结果为true。其实这个时候我是很疑惑的,为什么他们的结果都是相同的呢?在java.lang.String的源码中,“.equals”方法是这样被定义的:

public boolean equals(Object anObject) {        if (this == anObject) {            return true;//如果调用.equals()方法中的参数是本身,则返回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;    }

所以可以从源码中看到,实际上.equals是在进行值的分析(一个一个char进行比较)。而我推测“==”是专门用于地址的比较。我用了下面的代码进行证明

String sentence1 = new String("a");String sentence2 = new String("a");System.out.println(sentence1 == sentence2);//falseSystem.out.println(sentence1.equals(sentence2));//truesentence1 = sentence2;//此时让两个例句的地址相等System.out.println(sentence1 == sentence2);//true

这几天又遇到新的问题:既然String是这样,那Object又如何呢?
秉承着有源码看源码的思想,找到代码如下:

public boolean equals(Object obj) {    return (this == obj);}

在Object类的源码中,找到这样一行代码,this==obj,OMG难道可以这么偷懒的吗,所以我们也就知道了,在Object中的equals方法和String方法不同,Object中的equals方法是比较地址是否相同,我们用代码来验证一下:

Object o1 = new Object();Object o2 = new Object();System.out.println(o1.equals(o2));//false

我们先创建了两个“相同的”空对象,然后用.equals进行比较,结果是false,也证实了我们的猜想。
总结一下:.equals()用于判断值,==用于判断地址。