区别:html
“==” 比较的是两个引用在内存中指向的是否是同一对象(即同一内存空间),也就是说在内存空间中的存储位置是否一致。java
若是两个对象的引用相同时(指向同一对象时),“==”操做符返回true,不然返回flase。app
注:若是有对内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)感兴趣的能够去看看这篇博客,里面写的很详细。对我还在学基础的人来讲帮助很大,理解了不少内容,还有待消化。post
equals方法是由Object类提供的,能够由子类来进行重写this
Object类默认的实现以下:url
1 public boolean equals(Object obj) { 2
3 return (this == obj); 4
5 }
默认的实现只有当对象和自身进行比较时才会返回true, 这个时候和 “==”是等价的。spa
Java中不少类(String类 Date类 File类)等都对equals方法进行了重写,这里拿常见的String类举例。code
1 public class Test { 2 public static void main(String[] args) { 3 String str1 = "abc"; 4 String str2 = "abc"; 5 System.out.println(str1==str2);//true
6
7
8 String str3 = new String("abc"); 9 String str4 = new String ("abc"); 10 System.out.println(str3==str4);//false
11 System.out.println(str3.equals(str4));//true
12 } 13 }
上例中第5行,咱们看到str1 == str2 的结果是trueorm
分析缘由:htm
先看第3行代码,先在栈中建立一个对 String类的对象引用变量str1,而后经过引用去字符串常量池 里找有没有"abc",若是没有,则将"abc"存放进字符串常量池。这里常量池中并无“abc”。即在编译期已经建立好(直接用双引号定义的)“abc”,存储在了常量池中。(若是有对常量池不理解的能够看看我上面推荐的博客)
第4行代码又建立了对String类的对象引用str2,而后经过引用去字符串常量池 里找有没有"abc",若是没有,则将"abc"存放进字符串常量池 ,并令str2指向”abc”,若是已经有”abc” 则直接令str2指向“abc”。这里咱们在第三行代码中已经将“abc”这个字符串存储进了常量池。因此str2和str1指向的是同一个“abc”,返回true。
第8行和第9行代码分别建立了2个对象,str3和str4指向的是不一样的对象,即上面所说的内存空间中存储位置不一样。故str3 == str4 返回的确定是false。
第11行代码 str3.equals(str4) 返回true
由于String类重写了equals方法,比较的是内存空间存放的数据是否相同。这里存放的都是字符串“abc” 故返回true。
总结:
Java 语言里的 equals方法实际上是交给开发者去覆写的,让开发者本身去定义知足什么条件的两个Object是equal的。
因此咱们不能单纯的说equals到底比较的是什么。你想知道一个类的equals方法是什么意思就是要去看定义。(以上是来自知乎用户的回答)
咱们要理解的是equals存在的目的。
若是要看更详细的介绍能够去看这篇博客http://www.cnblogs.com/bluestorm/archive/2012/03/02/2377615.html
个人第一篇博客就到此结束了,身为java初学者,为了总结所学知识以上写的内容还很粗浅,若有不足和错误欢迎指正。