String 比較時的困惑

2021-08-06 07:18:36 字數 1044 閱讀 9554

string 是我們在開發中經常用的, 比較值時我們大多用 equals;當然也有apache的工具類等等,但面試中總會問一些 string == 比較的問題;

先舉個栗子 ;

string nice = "nice";

string ni = "ni";

string ce = "ce";

string str = new

string("nice");

system.out.println(nice ==ni+ce);

system.out.println(nice == "nice");

system.out.println(nice == ni+"ce");

system.out.println(str == nice);

如上看看是否和你的預想的結果一樣呢;

false

true

false

false

好了,開始解答;

首先區分 string st = 「abc」, string st = new string(「abc」)

前者的值存在在堆記憶體的永久代中的字串常量池中, 後者則是堆記憶體中 和常量池中都建立了 , 但引用的是堆中的值(注意 不是常量池中的值);所以 位址不同 肯定是 false 的。 也就是如上的 第四個輸出;

再來看 nice == ni+」ce」 和 nice ==ni+ce;

你一定在想沒有new的話,肯定在常量池中,常量池內部是使用 equals 來比較是否一致,如果一致則可以引用,不一致(也就是不存在)才新建;但是ni +」ce」的操作是 1個引用 和1 個字面值, 相加在堆中會產生乙個字串物件,(個人理解,如果操作含有乙個或乙個以上的字串引用時,則會在堆中建立乙個字串物件) 所以最後和 字串常量池中的」nice」比較 還是false ;

nice == 「nice」

理解了前面兩個 這個就好理解, 都是在字串常量池中,所以位址相同 true;

string和CString 的比較

一 概述 string和cstring均是字串模板類,string為標準模板類 stl 定義的字串類,已經納入c 標準之中 cstring typedef cstringt cstring 為visual c 中最常用的字串類,繼承自c stringt類,主要應用在mfc和atl程式設計中,主要資料...

String賦值的方式比較

string的賦值原則 1 new方式賦值的話,首先到pool中查詢是否有相應的值,假如沒有,在pool中建立這個物件 有的話,就到堆中例項化該物件,然後返回物件記憶體位址。2 字面值方式賦值的話,直接在pool中查詢,假如有的話,返回該物件 沒有的話,在pool中建立這個物件。例項1 結果 fal...

比較String位址相等

比較string值相等和位址相等 package com public class a 比較結果如下 true false true false true false true false true true true true false true 得到的結論 1.new出來的string是重新分...