1. 程式人生 > 實用技巧 >leetcode日誌(200803) 字串相加及string相關類

leetcode日誌(200803) 字串相加及string相關類

今天開啟每日一題的推薦,是一道簡單難度的題目,那就可以一試。

哎呀呀,怎麼看起來這麼熟悉,這不是去年複試的時候寫的題目嗎,當時還是c++寫的。

簡單回憶一下,就是string當成char陣列,然後從最後一位依次轉int相加,超10就向上一位+1。

注意一下如果最高位有進位需要在前面補個1,別的就沒啥了。

然後再把結果輸出出來就可以了。

思路明確,主要問題是解決字串和字元陣列的操作函式

不如直接看一下優秀的題解:

額,說實話第一眼有點懵B,竟然可以這樣!倒著運算通過迴圈進行計算,同時append對結果儲存至一個全新字串中,進位使用carry計算,對本位來說使用對10的餘數,對於高位來說使用對10的商。結果最後再使用reverse函式進行反向輸出,整體簡潔規範,實在是秒!!!

這就是程式中的藝術嗎,果然程式的成長沒有極限的,除非突破人類!!!

除了學習這個思想之外,在此總結一下string,stringbuffer,stringBulider的相關知識(來自網路搜尋資料):

1.String

他是一個不可類,在此類的一個物件被宣告之後,此類則不會被修改,如果有新的賦值變化時,會在堆區重新宣告新的空間,並將引用指向新的空間,舊的空間如果沒有再次被引用則會垃圾回收。

原文很生動,在此引用儲存一下:

String a = "123";
a = "456";
// 打印出來的a為456
System.out.println(a)

對於 a物件來說,首先賦值123,再次賦值456時,並不會更改原有值,而是宣告全新的物件,a重新指向新的物件,而原有“123”物件則會等待回收。

2.StringBuffer

StingBuffer是一個可變的字串類,在被建立之後,提供append()、insert()、reverse()、setCharAt()、setLength()等方法對字串資料進行更改,然後通過tostring方法將此物件轉化為string物件。

StringBuffer b = new StringBuffer("123");
b.append("456");
// b列印結果為:123456
System.out.println(b);

這裡也引用了原文的例子,下面是b物件的記憶體空間,可以看到b物件並沒有新空間變化,而是原有的空間上進行更改

3.StringBuilder

StringBuilder與StringBuffer功能相似,都可以在建立後進行修改,但是有一個特殊的地方就是:StringBuffer是執行緒安全的,而StringBuilder則沒有實現執行緒安全功能,所以效能略高。

對於StringBuffer實現執行緒安全需要新增synchronized鎖

而stringBuilder則不用新增

因此stringBuilder是執行緒安全的。

Java9的改進

  Java9改進了字串(包括String、StringBuffer、StringBuilder)的實現。在Java9以前字串採用char[]陣列來儲存字元,因此字串的每個字元佔2位元組;而Java9的字串採用byte[]陣列再加一個encoding-flag欄位來儲存字元,因此字串的每個字元只佔1位元組。所以Java9的字串更加節省空間,字串的功能方法也沒有受到影響。

總結的非常簡潔,站在巨人肩膀上才能不斷進步,繼續加油。