今天,和同學說後2者的時候,把特性說反了。自己也覺得好像有點不對。那麼我就直接翻了官方原始碼!發現,我確實是講錯了!為了讓自己更加清除!我就寫一篇學習日誌把!我也是小白,說得不好的地方請大牛指正!
1.String:字串類
a.字串的定義:4種方式
String name1 = "hello";
String name2 = new String("hello");
char [] chary ={'h','e','l','l','o'};
String name3 = new String(chary);
字串本質上就是一個的字元陣列,而每一個字元
對應一個ASCII,而ASCII的取值範圍-128到127
byte [] buf = {72,69,76,76,79};
String name4 = new String(buf);
b.字串如何轉換成 char陣列 byte 陣列。
char [] ch = name1.toCharArray();
<span style="white-space:pre"> </span>byte [] buf1 = name1.getBytes();
c.字串的比較。
== 比較的是地址是否相同。
equals 比較的是兩個字串的內容是否相同。
String name1 = "nihao";
String name2 = new String(name1);
字串本質上就是一堆的ASCII碼組成的。而
ASCII是常量,而常量開闢記憶體在棧區的常量池
中,而字串最初都是在常量池中構造出來的。
常量池中的內容有一個特點,一旦有一個nihao
就不會產生另一個nihao,唯一性。
+的本質,並不是將一個字串拼接到另一個字串
的後面,而是在堆區重新開闢記憶體。
字串最初構造在常量池,因此,字串具有常量
的特點:不變性。
而+號會要在堆區開闢記憶體,因此如果頻繁對字串
做+的操作,是要消耗記憶體的,減低效能的。
所以,如果要做字串頻繁的+的操作,請用下兩者
2.StringBuffer:
jdk1.1的時候出現
帶有緩衝的字串類。初始化容量是16字元,
如果有其他字元拼接,是追加到字串的後面。
這個字串的容量是以一倍的形式擴充。
append();
原始碼我不貼出來了,裡面大多的方法都是使用了同步程式碼塊關鍵字synchronized,因此,它的這些追加方法,是執行緒安全的。那麼就會失去效能!後來為了效率,出現了
StringBuilder
3.StringBuilder:
我們先來看看原始碼:該類,是jdk1.5的時候才有的。並且和StringBuffer功能上差不多,而且該類其中的所有方法都沒有同步程式碼塊,所以是非執行緒安全的,那麼這樣的話,和StringBuffer相比追加字串的時候就會更加效率!
<pre name="code" class="java">/**
* A modifiable {@link CharSequence sequence of characters} for use in creating
* strings. This class is intended as a direct replacement of
* {@link StringBuffer} for non-concurrent use; unlike {@code StringBuffer} this
* class is not synchronized.
*
* <p>For particularly complex string-building needs, consider {@link java.util.Formatter}.
*
* <p>The majority of the modification methods on this class return {@code
* this} so that method calls can be chained together. For example:
* {@code new StringBuilder("a").append("b").append("c").toString()}.
*
* @see CharSequence
* @see Appendable
* @see StringBuffer
* @see String
* @see String#format
* @since 1.5
*/
public final class StringBuilder extends AbstractStringBuilder implements
Appendable, CharSequence, Serializable {
private static final long serialVersionUID = 4383685877147921099L;
/**
* Constructs an instance with an initial capacity of {@code 16}. //初始容量16,和StringBuffer一樣
*
具體用到什麼地方:當我們在對流的操作的時候,我們就可以使用StringBuffer或者StringBuilder,代替String類。這樣會提高效率哦。
到這裡,我想你肯定熟悉這3個類的了。那就自己試試把!