"=="和 equals 方法究竟有什么区别?

  这是一个比较java经典的问题,面试的时的出场率非常高,尤其是对于初级程序员来说,这些都是比较比较重要的,相对他们了解的透彻,需要对栈内存和堆内存的区别。

  Java堆内存

  堆内存在Java运行时被使用来为对象和JRE类分配内存。不论什么时候我们创建了对象,它将一直会在堆内存上创建。垃圾回收运行在堆内存上来释放没有任何引用的对象所占的内存,任何在堆上被创建的对象都有一个全局的访问,并且可以在应用的任何位置被引用。

  Java栈内存

  Java的栈内存被用来线程的执行,他们包含生命周期很短的具体值的方法和在堆中使用这个方法对象的引用。栈内存是LIFO(后进先出)序列。当方法被调用的时候,堆内存中一个新的块被创建,保存了本地原始值和在方法中对其他对象的引用。这个方法结束之后,这个块对其他方法就变成可用的了。栈内存与堆内存相比是非常小的。
  
  所以在创建对象的时候,会在堆内存中存放对象,而在栈内存中存放堆内存的对象的地址。
  “==”比较的栈内存之中的地址,而在同一堆内存之中,所以指向的就同一个对象。
  例如:
    Object O = new Object();
    Object B = O;
    Object J = O;
    B == J;
  "equal"方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
  例如,对于下面的代码:
    String a=new String("foo");

    String b=new String("foo");
 
 两条 new 语句创建了两个对象,然后用 a,b 这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即 a 和 b 中存储的数值是不相同的,所以,表达式 a==b 将返回 false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回 true。

  所以说a.equals(b)返回 true,但是a==b不一定true,但是a==b返回 true,a.equals(b)返回 true。

 
    
原文地址:https://www.cnblogs.com/mzmy/p/equals.html