天天看點

String類

String字元串是由一個char數組構成的,由于這個數組是由final修飾的,是以String也叫做不可變字元串。

例如字元串:String  s = ”1234”; 其實就是char[] value={‘1’,’2’,’3’,’4’};

String s=”123”; 和String s1=new String(“123”);,雖然申請的兩個字元串内容一樣,但是它們的記憶體位址是不一樣的,前者引用的是字元串池裡的字元串,後者是建立一個記憶體位址來存儲。是以比較的時候需要使用equals();方法來比較才能的出正确的結果。

例如:

<a href="https://s2.51cto.com/oss/201710/26/6803a4ce5e52e495a841134389328a77.png" target="_blank"></a>

運作結果:

<a href="https://s1.51cto.com/oss/201710/26/854680620f401ddbd465da379a510811.png" target="_blank"></a>

什麼是字元串優化池?字元串池就是裡面養了一堆的字元串,所有這種方式申請的方式:String s=”123”; 都是指向的字元串池裡的字元串。

為什麼會有個字元串優化池呢?因為如果有一百個字元串内容是重複的,那麼假如沒有字元串池的話就會在記憶體中申請一百個記憶體位址來存儲。這樣的話就太耗費記憶體資源了,如果是一萬個十萬個字元串的話直接把記憶體給耗沒了。是以用字元串池解決了這個問題,String s=”123”;這種方式申請的字元串,所有重複的都是指向字元串池裡的同一個字元串,這樣即便有一萬個重複的字元串也隻需要一個記憶體位址就可以儲存了。

  String類有許多的構造器,這些構造器可以把byte數組、char數組等等轉換成字元串:

<a href="https://s4.51cto.com/oss/201710/26/bececcee23c549a1cc9ee97060cadec8.png" target="_blank"></a>

代碼示例:

<a href="https://s2.51cto.com/oss/201710/26/fdd44ac2323e1ad58462abd2c7dd2c50.png" target="_blank"></a>

運作結果

<a href="https://s5.51cto.com/oss/201710/26/0051f798938658021f634f6d6f0aa66b.png" target="_blank"></a>

charAt方法:

按字元串下标拿出那個下标的字元方法。例如:

<a href="https://s2.51cto.com/oss/201710/26/eafd944c35145a8ca108bd922511f4b5.png" target="_blank"></a>

indexOf方法:

按字元串内容查找,查找到了就傳回這個字元串内容第一個字元的下标,沒找到就傳回-1

<a href="https://s4.51cto.com/oss/201710/26/6ad29ae493c7524b8e7267b2dd05cb69.png" target="_blank"></a>

lastIndexOf方法:

按字元查找,找到就傳回那個字元的下标

<a href="https://s1.51cto.com/oss/201710/26/f8ecf79805865e2c6456ff3aa660acca.png" target="_blank"></a>

length方法:

    此方法用于獲得字元串的長度

<a href="https://s1.51cto.com/oss/201710/26/ad21e8d68d3295a26b175df0a53ed7b4.png" target="_blank"></a>

其餘方法如下圖:

<a href="https://s1.51cto.com/oss/201710/26/e213dfa83a3870d21198e4d04dee7962.png" target="_blank"></a>

<a href="https://s5.51cto.com/oss/201710/26/b5a866f0fde14c3c461f9d60784f192c.png" target="_blank"></a>

  由于String字元串是不可變字元串,在進行字元串追加或更改的時候,效率就會十分的慢。

  做個小實驗就知道了:

<a href="https://s4.51cto.com/oss/201710/26/982bfa254c1034eb1c3b7f69caeb1177.png" target="_blank"></a>

<a href="https://s4.51cto.com/oss/201710/26/048c35f9c17aff300a186ea3f8160ebd.png" target="_blank"></a>

添加100000個字元就需要耗去15.473秒的時間,可見效率之低。

既然有不可變字元串,那麼就有可變的字元串,那就是StringBuffer類,由于StringBuffer是可變字元串,是以适合追加,修改之類的操作,速度比起String是相當的快。

做個小實驗就知道了:

<a href="https://s1.51cto.com/oss/201710/26/461936b591f356b75789d615b196fc4e.png" target="_blank"></a>

<a href="https://s3.51cto.com/oss/201710/26/5c42874c74a3dd24adf1057873ac9c1e.png" target="_blank"></a>

  同樣的添加次數,StringBuffer隻需要10毫秒就完成了,而String卻需要15.473秒也就是15473毫秒才能完成,是以StringBuffer創造出來就是用來解決這一問題的。

StringBuilder:

  StringBuilder是和StringBuffer基本上一樣的,兩者都是繼承與AbstractStringBuilder,它們最大的差別在于前者的方法是沒有synchronized同步鎖的,而後者則有。是以在于資料的安全性上StringBuffer要安全些,裡面的資料不容易混亂。

  從以下兩個類的部分代碼對比就可以到StringBuffer的方法都帶有synchronized關鍵字:

StringBuilder類的部分代碼:

<a href="https://s2.51cto.com/oss/201710/26/3c0e03f730fad4b8c29b02ddcfbabf21.png" target="_blank"></a>

StringBuffer類的部分代碼:

<a href="https://s2.51cto.com/oss/201710/26/ca61d93abd5a266a4050cab6cf7152c2.png" target="_blank"></a>

本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/1976507,如需轉載請自行聯系原作者