String方面的面試事項

2021-08-19 04:45:44 字數 2433 閱讀 9491

馬上就要面臨面試,最近也在準備些面試的東西,不總結總結,總歸不得勁。理解的不深,文筆也不好,算是寫給自己看看吧。

今個說說string,stringbuffer,stringbuilder.

通過api知道,string類是乙個final類,不能被繼承;類中方法也都為final修飾;類中的substring,replace等方法都是生成乙個新的string物件,原物件並沒有被改變,其實,對string物件的任何操作都不會改變原本的物件,最多隻會生成乙個新的物件。

作為新手的一重點:string str1="hello"; 和 string str2=new string(「hello」)的區別:

第一種方式,在jvm中,會有乙個字串常量池專門存放此字串,而當另乙個字串賦值的時候,虛擬機會先去常量池檢視,有沒有和將要賦值的常量值相等的常量,如果有,則將新定義的常量指向已有的常量值,如果沒有,另開闢乙份空間用來放置新定義的常量。即:string str3="hello",str1==str3 為true;

第二種方式,是生成的乙個新的物件,儲存在堆中。假設定義 string str4=new string("hello"); str4==str2 返回false,因為只會比較兩者是否為同乙個物件,和本身的值,沒有關係。

另乙個,stringbuilder,stringbuffer的作用。

為啥要使用stringbuilder和buffer?

我們可以用下面的例子引出

string string ="";

for(int i=0;i<10000;i++)

stringbuilder sb=new stringbuilder();

for(int i=-;i<10000;i++)

前後加上system.nanotime()可以看出兩者的執行效率區別,顯然,stringbuilder效率更高,而且不是幾倍的問題。

反編譯位元組碼檔案可以看到

,string+=i;被jvm優化成了

stringbuilder str = new stringbuilder(string);

str.tostring();

上面提到,string的任何改變都不會改變原本的物件,只會生成新的物件,所以,他本質是把原本的string指向的物件取出來,與i拼接,生成另乙個物件,在將string指向新生成的物件。而new stringbuilder是在迴圈裡進行的,也就是要new 1000個物件。

反編譯stringbuilder的class檔案可以看到。

stringbuilder和stringbuffer的區別:

檢視源**,對比,就會發現他倆幾乎相同,唯一的區別在於stringbuffer中加入了synchronized 關鍵字,也就是說stringbuffer是執行緒安全的。安全和效率一直是程式開發中相斥的兩個因素,相對安全意味著相對的效率低。通常情況下,stringbuffer效率低於stringbuilder。而兩者效率都高於string的直接相加。

jvm會自動優化,我們知道。比如,str=「hello」+「world」;str1=「hello」;str2=「world」;str3=str1+str2;

在程式編譯的時候,str已經成為了helloworld,而str3還是兩個變數的相加,在執行期間才會真正賦值;所以,後者效率要低於前者。

乙個問題:str==str3 返回true還是false呢?  obviously,false;

因為「==」只會比較左右兩邊是否是同乙個物件,並不會關心他倆的位址是否相同,值是否相同。str是在常量池放置的乙個物件,而str3因為引用了另乙個物件,會在執行時,在堆裡建立物件,即使這倆的hashcode和值都相等,但是並不是同乙個物件。

另一題:

public static voidmain(string args) 

private static voidchangestring(stringbuffer ss1, stringbuffer ss2)

怎麼輸出?

s1方法之前:356573597    s2: 1735600054

ss1方法賦值之前:356573597    ss2: 1735600054

ss1:hello    ss2: hello

ss1方法賦值之後:356573597    ss22222: 356573597

ss11111:helloworld    ss22222: helloworld

s1: helloworld

s2: hello

為啥?ss2=ss1這一步,改變了ss2指向的位址,相當於乙個新的物件,而s2指向的位址沒有改變,所以對s2沒有任何影響;

好吧,先說這麼多了。不知道過些日子回頭看看什麼樣,有人看到錯誤,不同見解請指出,筆者正在學習路上行走。。

關於OkHttp方面的Android面試題

最近好多學生出去面試都或多或少的問到了一些三方網路框架的使用以及內部實現原理。對於三方框架的使用自然不用多說 手到擒來。但是每每問到內部實現原理時就相形見絀了。因此最近專門花了點時間準備寫幾篇對於網路請求框架的分析部落格供學生們參考。就拿okhttp開刀吧 首先鄙人總結了一下關於okhttp方面都有...

JSON方面的轉換和String字串的拼接問題

json方面的轉換和string字串的拼截問題 1 將json字串轉換成hashmap格式的寫法hashmap namemap json.parseobject jsonstr,hashmap 2 將json字串中的 替換成 的寫法jsonstr.replace 3 從轉換後的hashmap裡取值n...

金融方面的證書

個人收集的一些金融方面的證書,還有一些由於精力有限未能收集,比如金融英語考試等等.希望對你有所幫助.1 從業資格證書。此為入門證書,是進入 行業的必要證書。共考五科 基礎,交 易,發行與承銷,技術分析和 2 註冊國際投資分析師 ciia 考試簡介 註冊國際投資分析師 certified intern...