首先看看下面的圖,看清楚了圖咱們要說的知識點也就說說清楚了一半
jvm中有堆heap,棧stack,常量池constant。
我們的基本物件,包括int,double等都放在棧裡,引用型別如string,person(person 就是乙個pojo類而已)引用(如上面的c,d)放在棧裡,真實的資料放在堆中。
== 比較的是兩個物件在棧中存放的資料是否一樣
b==f 比較的就是兩個105的位址 (105就是指ss在常量池中的位址)
c==e 乙個1063乙個1095 自然就不相等了
equals 比較的事堆中的內容
c.equsls(e) 就是兩個kkk在比較 答案不言自明
objeck的equals方法如下
public boolean equals(object obj)
換句話說object的類的==與equals就是一回事
有興趣的可以看看string的equals方法
關於==與equals說完了,再說說字串的構建
對字串的構建 我們最常使用的有兩種
string a1="bbb";
string a2=new string("ccc");
兩種方式有不同
第一種方式,通過上面的圖大家也看到了,bbb這個資料存放在常量池裡;準確的說是用string a1="bbb"這種方式產生字串,jvm首先會在常量池裡查詢是否有bbb這個資料,如果有就把bbb這個資料的位址給a1,否則就在常量池裡新建乙個資料單元裡面存放bbb,然後把這個單元的位址給a1。(上圖中的兩個105 就是這個例子)
第二種方式在於 在編譯的時候會有乙個ccc在常量池,等到執行的時候,會在堆區在建立乙個資料單元裡面存放ccc,然後a2裡面就存放堆裡面那個資料單元的位址!另外即使堆中已經有了這個字串,通過new的方式,還會再產生乙個堆區的資料(如上圖中的1063與1095)
所以string a=new string("bbb");
產生了兩個物件,乙個在堆乙個在常量池。
string a=new string("bbb");
string c=new string("ccc");
產生了四個物件,兩個在堆兩個在常量池。
string a1=new string("sss");
string a2=new string("sss");
對於這種情況,堆區肯定有兩個物件,那常量池裡面呢? 乙個sss還是兩個sss 我不敢肯定 但我估計應該是兩個。
java 與equal 的區別
判定的是物件的等價性,必須是實實在在地是同乙個物件才返回true。判定基本型的值是否相等。int i1 47 int i2 47 system.out.println i1 i2 output true 基本型包裝類 integer n1 new integer 47 integer n2 new ...
對比C 中 與equal方法
c 中equal與 的區別 收藏 對於值型別,如果物件的值相等,則相等運算子 返回 true,否則返回 false。對於string 以外的引用型別,如果兩個物件引用同乙個物件,則 返回 true。對於 string 型別,比較字串的值。操作比較的是兩個變數的值是否相等。equals 方法比較的是兩...
java中 與 equal 的區別
看一段 string str1 new string str string str2 new string str system.out.println 比較 str1 str2 system.out.println equal比較 str1.equals str2 結果 比較 false equa...