「005期」JavaSE面試題(五):String類

2020-12-24 酷扯兒

本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫

開篇介紹

大家好,我是Java面試題庫提褲姐,本篇文章是面試系列文章的第五篇,主要介紹了JavaSE中String相關的面試題,在之後會順著開篇的思維導圖一直總結下去,做到日更!如果我能做到百日百更,希望你也可以跟著百日百刷,一百天養成一個好習慣。

Q:

String、StringBuffer、StringBuilder 的區別?

都是final類,都不允許被繼承String長度是不可變的,StringBuffer和StringBuilder長度是可變的。StringBuffer是線程安全的,StringBuilder是線程不安全的,但他們兩個中的所有方法都是相同的,StringBuffer在StringBuilder的方法之上加了synchronized修飾,保證線程安全。StringBuilder比StringBuffer擁有更好的性能。如果一個String類型的字符串,在編譯時就可以確定是一個字符串常量,則編譯完成之後,字符串會自動拼接成一個常量。此時String的速度比StringBuilder和StringBuffer的性能更好。

String str="aaa" 與 String str=new String("aaa")一樣嗎?

不同,內存分配的方式不同。

String str="aaa",創建了1個對象,創建的"aaa"是常量,jvm將其分配在常量池中;String str=new String("aaa"),創建了2個對象,一個是在常量池中,一個在堆內存中。

String str="aa" ,String s="bb" ,String aa=aa+s;

一共創建了幾個對象?

一共有2個引用,3個對象;

"aa"與"bb"都是常量,常量的值不能改變,當執行字符串拼接的時候,會創建一個新的常量"aabb",將其存到常量池中。

String s = "Hello";

s = s + " world!";

這兩行代碼執行後,原始的 String 對象中的內容到底變了沒有?

沒有。

因為 String 被設計成不可變(immutable)類,所以它的所有對象都是不可變對象。在這段代碼中,s 原先指向一個 String 對象,內容是 "Hello",然後我們對 s 進行了「+」操作,那麼 s 所指向的那個對象是沒有發生變化的。這時,s 不指向原來那個對象了,而指向了另一個 String 對象,內容為"Hello world!",原來那個對象還存在於內存之中,只是 s 這個引用變量不再指向它了。結論,如果經常對字符串進行各種各樣的修改,或者說,不可預見的修改,那麼使用 String 來代表字符串的話會引起很大的內存開銷。因為 String 對象建立之後不能再改變,所以對於每一個不同的字符串,都需要一個 String 對象來表示。這時,應該考慮使用 StringBuffer 類,它允許修改,而不是每個不同的字符串都要生成一個新的對象。並且,這兩種類的對象轉換十分容易。同時,如果要使用內容相同的字符串,不必每次都 new 一個 String。例如要在構造器中對一個名叫 s 的 String 引用變量進行初始化,把它設置為初始值,應當這樣做:

1public class Demo {2 private String s;3 ...4 s = "Initial Value";5 ...6}

而非

s = new String("Initial Value");

後者每次都會調用構造器,生成新對象,性能低下且內存開銷大,並且沒有意義,因為 String 對象不可改變,所以對於內容相同的字符串,只要一個 String 對象來表示就可以了。也就說,多次調用上面的構造器創建多個對象,他們的 String 類型屬性 s 都指向同一個對象。上面的結論還基於這樣一個事實:對於字符串常量,如果內容相同,Java 認為它們代表同一個 String 對象。而用關鍵字 new 調用構造器,總是會創建一個新的對象,無論內容是否相同。至於為什麼要把 String 類設計成不可變類,是它的用途決定的。其實不只 String,很多 Java 標準類庫中的類都是不可變的。在開發一個系統的時候,我們有時候也需要設計不可變類,來傳遞一組相關的值,這也是面向對象思想的體現。不可變類有一些優點,比如因為它的對象是只讀的,所以多線程並發訪問也不會有任何問題。當然也有一些缺點,比如每個不同的狀態都要一個對象來代表,可能會造成性能上的問題。所以 Java 標準類庫還提供了一個可變版本,即 StringBuffer。

判斷下面代碼的執行結果

1String s1 = new String("abc"); 2String s2 = "abc";3System.out.println(s1 == s2); //false4System.out.println(s1.equals(s2)); //true

原因:s1記錄的是堆內存中對象的地址,s2記錄的是常量池中的地址

1String s1 = "a" + "b" + "c";2String s2 = "abc";3System.out.println(s1 == s2); //true 4System.out.println(s1.equals(s2)); //true

原因:java中有常量優化機制,編譯時就把 "a" + "b" + "c"變成「abc」賦值給s1

1String s1 = "ab";2String s2 = "abc";3String s3 = s1 + "c";4System.out.println(s3 == s2); //false5System.out.println(s3.equals(s2)); //true

原因:因為s1是一個變量,jvm運行的時候不認為s3="abc",也就是無法使用常量池。因此s3會重新創建一個對象。

相關焦點

  • 面試: String 五連殺 !你還滿血嗎 ?
    作者 | Anthony_tester來源 | blog.csdn.net/u011541946/article/details/79865160這篇來看看關於 Java String 類的 5 道面試題,這五道題,我自己在面試過程中親身經歷過幾道題目,本篇就帶你了解這些題的答案為什麼是這樣。
  • 「003期」JavaSE面試題(三):JavaSE語法(1)
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫開篇介紹大家好,我是Java面試題庫的提褲姐,今天這篇是JavaSE系列的第三篇,
  • 「002期」JavaSE面試題(二):基本數據類型與訪問修飾符
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫開篇導讀大家好,我是Java面試題庫的提褲姐,今天這篇是JavaSE系列的第二篇,
  • golang面試之精編100題
    Golang精編100題能力模型選擇題1. 【初級】下面屬於關鍵字的是()A. funcB. defC. structD. class參考答案:AC2.【初級】定義一個包內全局字符串變量,下面語法正確的是()A. var str stringB. str := ""C. str = ""D. var str = ""參考答案:AD3. 【初級】通過指針變量 p 訪問其成員變量 name,下面語法正確的是()A. p.nameB.
  • 「2021國考進面分數線及名單」國考進面試比例
    「2021國考進面分數線及名單」國考進面試比例由國家公務員考試網考試快訊欄目由提供,更多關於國考面試,國家公務員考試網,國家公務員考試考試快訊的內容,請關注國家公務員考試網/廣東公務員考試網!
  • 「第15期」中考押中哪類題型提分快?萬唯獨家解密!
    一到考試前,最容易慌亂的是哪類學生?臨時抱佛腳,哪類題型最容易提分?各種偷分技巧,怎麼做才能100%拿分?萬唯中考研究院特別策劃【中考現代文閱讀文章猜押】欄目,每天跟著小萬萬一起閱讀3篇文章,打敗閱讀題!
  • 面試官:String長度有限制嗎?是多少?
    是的有,而且在JVM編譯中還有規範,而且有的家人們在面試的時候也遇到了。本人就遇到過面試的時候問這個的,而且在之前開發的中也真實地遇到過這個String長度限制的場景(將某固定文件轉碼成Base64的形式用字符串存儲,在運行時需要的時候在轉回來,當時文件比較大),那這個規範限制到底是怎麼樣的,咱們話不多說先瞜瞜去。
  • 「英語教資面試VS綜藝節目」第一期,抽考題
    首先恭喜大家順利通過2020年下半年英語教師資格證的筆試,明年1月份就是面試時間了,面試需要注意什麼呢?【英語教資面試VS綜藝節目】系列中將以輕鬆的方式給大家分享面試過程中需要注意的地方。關注我,乾貨滿滿,面試路上不迷路。
  • 動畫「五等分的花嫁」第二期番宣CM公開
    動畫「五等分的花嫁」第二期番宣CM公開 動漫 178動漫整編 ▪ 2020-09-30 09:38:45
  • 005期排列三、排列五和002期七星彩開獎結果,美夢再次破滅
    文/東莞阿元各位彩民晚上好,今天是1月5日星期日,在結束這個周末的同時,排列三、排列五、七星彩的開獎結果也與大獎見面了,讓我們一起來看一下本期的開獎結果有沒有心目中的號碼呢?首先讓我們看一下005期排列三的開獎結果本期排列三開獎號碼是:5、6、9。本期銷量18156090元,本期中獎總金額17308566元。本期直選中獎14317注,單注獎金1040元;本期組六中獎13982注,單注獎金173元。
  • 漢「五尾人柱力」的普攻有幾段?火影忍者每日一題答案1月13日
    漢「五尾人柱力」的普攻有幾段?火影忍者每日一題答案1月13日時間:2021-01-13 12:38   來源:今日頭條   責任編輯:毛青青 川北在線核心提示:原標題:漢「五尾人柱力」的普攻有幾段?火影忍者每日一題答案1月13日 漢「五尾人柱力」的普攻有幾段?火影忍者1月13日每日一題答案是什麼?
  • 10道虐心的Java面試題,被面試官虐哭了,同事一題都沒答對
    有一天,小王告訴我,他去一家公司面試 Java 崗,結果被面試官虐哭了。整整 10 道 Java 面試題,小王一道也沒答正確。  他沮喪地給我說,「哥,說點我的情況,你願意聽嗎?我和一個女孩相處,女孩大我兩歲,我非科班。本來打算國慶換一家薪水高點的,好確認關係。
  • 國家公務員面試2017年3月2日國稅系統面試題
    【導讀】華圖國家公務員考試網同步華圖教育發布:國家公務員面試2017年3月2日國稅系統面試題,詳細信息請閱讀下文!如有疑問請加【2021國家公務員考試微信客服】 ,更多資訊請關注寧夏華圖微信公眾號(ningxiaht),國家公務員培訓諮詢電話:0951-6028571/6027571 18295188220,微信號:HT15202602573   2017年3月2日國稅系統面試題   1.請你閱讀桌上的題籤(請考生注意,不要再題籤上寫字或做記號)
  • 700個面試題(MBA最全的面試訓練)
    象政治時事這類問題應提前做好充分準備: 對歷年面試的主要題型、政治、經濟方面的熱點加以關注,平時注意多讀報紙,對熱點問題要有獨到的見解,提出自己的看法(一定要基於宏觀的基礎上,用理性的 方式加以分析。);象知識問答這類題目大多是管理基本知識和市場營銷的東西,例如:組織結構、需求、激勵、企業文化、績效、營銷等問題,應提前流覽一下管 理學的知識點,回答時,多結合自己實際工作具體談某一點。
  • 沒錯,看完這篇Exception 和 Error,和面試官扯皮就沒問題了
    // 返回拋出異常的詳細信息public string getMessage();public string getLocalizedMessage();//返回異常發生時的簡要描述public public String toString();  // 列印異常信息到標準輸出流上public void printStackTrace
  • 《面試攻略》別被對方問倒了!一篇文破解最常見的3大面試問題
    面試問題百百種!其中又以「為何離職」、「你的缺點是什麼」、「為何選擇跨產業、非原本職務」幾乎是面試官必問的三大挑戰,要如何回答才不會演變成誤踩禁忌的災難呢?一起跟小編來看看三大問題要如何化解!一、面試官:「你為什麼離開上一份工作?」
  • 公務員面試題庫:2016國家公務員考試結構化面試模擬題每日一練(04...
    2016國家公務員面試熱點匯總歷年國家公務員面試試題模擬題匯總 【國考公告】【筆試分數線】【面試公告匯總】【面試試題匯總】> 國家公務員面試題庫:國家公務員考試網為國考考生提供公務員面試題庫及面試題目答案,幫助參加2016國考考生順利通過面試。
  • 「面試」Offer收割機的書單!
    redis設計與實現這部門主要從面試的角度和項目中的使用的角度來闡述redis,可能對於面試來說還可我的第一本算法書推薦原因:去面試之前,最好自覺把這本書的算法手寫兩遍。尤其的中大廠,只要讓你寫算法,百分之七八十都會有其中一道題。
  • 「江蘇省人力資源和社會保障網」江蘇省公務員成績查詢官網
    廣東人事考試網同步江蘇公務員考試網信息:「江蘇省人力資源和社會保障網」江蘇省公務員成績查詢官網,更多關於江蘇省考成績,江蘇人事考試網,江蘇公務員考試網的信息,請關注人事信息考試網/廣東人事考試網。
  • 公務員面試每道題之間,是連答還是中間可以停頓思考?
    經過一系列的「廝殺」,我們即將進入面試的「戰場」。相比於筆試,公務員面試成績更加靈活。考生具體「優秀」的表現包括哪些?這就值得我們需要探討了。下面就面試考試過程中,題目作答之間,是連答還是中間可以停頓思考?這個細節問題讓我們來討論下。