從Java中堆內存和棧內存分配中詳談String使用equals和==比較的區別

Java把內存分成兩種,一種叫做棧內存,一種叫做堆內存

在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧內存中分配。當在一段代碼塊中定義一個變量時,java就在棧中爲這個變量分配內存空間。

比如

void func()
{
    Object obj = new Object();//這個obj在函數的棧裏。
}

class Test
{
   private Object obj = new Object();//這個obj隨對應的Test對象分配在堆裏
}

堆內存用於存放由new創建的對象和數組。

 "=="操作符的作用

1、用於基本數據類型的比較

2、判斷引用是否指向堆內存的同一塊地址。

equals的作用:

用於判斷兩個變量是否是對同一個對象的引用,即堆中的內容是否相同,返回值爲布爾類型


String作爲一個對象來使用

例子一:對象不同,內容相同,"=="返回false,equals返回true

String s1 = new String("java");
String s2 = new String("java");

System.out.println(s1==s2);            //false
System.out.println(s1.equals(s2));    //true

詳解:s1和s2只是兩個引用,存放在函數的棧中,就是堆內存中存放對象的地址,new String("java")這兩個對象在函數堆內存中分別創建了對象,所以地址值不一樣,==返回爲false,而equals 則比較兩個對象的值,所以返回true。

例子二:同一對象,"=="和equals結果相同

String s1 = new String("java");
String s2 = s1;

System.out.println(s1==s2);            //true
System.out.println(s1.equals(s2));    //true
詳解:引用變量s1在棧中存放了字符串對象new String("java")在堆內存的地址;s2 = s1 將s1的引用變量地址賦予了s2,所以 == equals 都返回true。


String作爲一個基本類型來使用

如果值不相同,對象就不相同,所以"==" 和equals結果一樣

String s1 = "java";
String s2 = "java";

System.out.println(s1==s2);            //true
System.out.println(s1.equals(s2));    //true
詳解,java有常量池這個概念,首先 String s1 = "java" 這個語句我們可以拆分, 先定義變量s1,它會在棧中創建s1的引用變量,再查找棧中是否有“java”這個值,如果沒有,自己在棧中佔一個位置,把“java“這個值存進來,如果棧中有”java“這個值,s1則會直接指向這個值。 所以 圖中代碼 s2引用變量相當於指向了s1棧中所存放的值,所以==返回true, equals 因爲地址都相同了,所以值也相同。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章