前言
面試是類似演講演說的過程,網上的資料都是文字的,沒法讓面試者直觀的體驗到面試過程,本人已經將相關內容製作成音頻節目,有興趣的朋友可以去喜馬拉雅搜索《2020年Java面試208題》收聽音頻版節目。
《2020年Java面試208題》整理了208個Java程序員的面試題,主要是針對三年以內開發經驗的JAVA程序員提出的問題。
題目
本期要說的是《2020年Java面試208題》的第8題,面試官提了這樣一個問題:
使用StringBuffer類如何實現字元串反轉:
要求:
1 不要使用reserve方法
2 盡量節省內存的開銷
不需要寫代碼,只要說出思路和理由就可以了。
知識點解析
這個題目看起來簡單,但其中涉及到StringBuffer對字元串管理的內存機制,其實還是值得講一講的。
在演示面試之前,我先說1個知識點,否則可能有些基礎薄弱的看不懂我的回答。
就是StringBuffer中的字元串在內存中是如何管理的?
StringBuffer的字元串,其實就是字元數組,其實也不僅僅StringBuffer是這樣,字元串本身在內存中就是字元數組,也不僅僅Java這麼處理 —- 所有計算機編程語言都是這樣的。
StringBuffer的獨特之處在於,它為了提高字元串操作的性能,採取了空間換時間的策略,它的字元數組的長度並不是字元串的長度,它的字元數組會多分配一些空間,準確地說,StringBuffer默認是申請長度為16的字元數組內存空間,這個空間是在堆內存開闢的。
同時,StringBuffer在操作字元串的時候,如果堆內存中的字元數組長度夠用,就直接使用;如果字元數組的長度不夠了,就新創建一個字元數組,長度為當前字元數組的兩倍,然後將當前字元數組中的內容複製到新字元數組中,然後將舊的字元數組丟棄給垃圾回收。
好,StringBuffer的內存管理的知識點講完了。
再說一下StringBuffer的reserve方法,這個方法就是對字元串進行反轉的,比如字元串為123,reserve後就變成321了。題目要求不使用reserve,那其實就是讓自己寫代碼實現reserve。
這個題其實是從以前C的題目變化過來的,在C語言裡面操作字元串都要自己操作內存實現。Java直接提供了常用的字元串操作方法,面試官為了看出程序員在內存和StringBuffer源代碼的熟悉程度,特意出了這樣的題目。
演示面試
那麼現在就由我來演示一下面試:
你好,面試官。
1 我先說一下我的實現思路。
我會將StringBuffer中管理的字元串,循環取出第1個字元和最後1個字元、第2個字元和倒數第2個字元、第3個字元和倒數第3個字元,然後依次調換,最終就實現了字元串反轉了。
2 這裡有一個問題,兩個字元變數 a 和 b 要想調換值,必須將a的值先賦值給 c,然後將b的值賦值給a,再將c的值賦值給b。這就好像甲乙兩人每人端著一大盆水,他倆想把水盆互相換給對方端著,必須由甲先把水盆放地上,然後甲就空出手來接乙手裡的水盆了,乙把水盆交給甲後,自己騰出手來了才能端起之前甲的那盆水。
所以,兩個字元變數a和b要調換值, 得有一個字元的空間作為字元交換的臨時空間或者叫緩存空間。
一般的方法,都是新創建一個字元變數來作為緩存空間,但本題目要求的是盡量節省內存的開銷,新創建一個字元變數就會在棧里壓入一個這個變數,循環交換字元的過程,就是循環的壓棧出棧的過程,這就會在棧裡面有一個字元的開銷。
3 我考慮的是StringBuffer的特性,StringBuffer寫入字元串的時候,實際內存中的形式的是字元數組,並且申請的內存數組的長度並不是與字元串的長度一樣的,一般都會比字元串的長。那麼我們可以這麼想像一下,比如字元串為 abcdefg,一共7個字元,但StringBuffer在內存中字元數組默認是16個字元的空間 —- 這個是StringBuffer的特性,如此一來,我就可以把字元數組的第8個字元的位置當做是緩存,來完成字元串abcdefg的反轉。
這就是我的思路,我的回答結束了。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/234190.html
微信掃一掃
支付寶掃一掃