String 不是java中的基本類型,在java中,字符串屬於對象,Java 提供了 String 類來建立和操做字符串。java
String 類是不可改變的,因此你一旦建立了 String 對象,那它的值就沒法改變了數組
String message = "hello"; System.out.println(message); char [] mes_1= {'h','e','l','l','o'}; String message_1 = new String(mes_1); System.out.println(message_1);
在執行到雙引號包含字符串的語句時,如String a = "123",JVM會先到常量池裏查找,若是有的話返回常量池裏的這個實例的引用,不然的話建立一個新實例並置入常量池裏。因此,當咱們在使用諸如String str = "abc";的格式定義對象時,老是想固然地認爲,建立了String類的對象str。擔憂陷阱!對象可能並無被建立!而可能只是指向一個先前已經建立的對象。只有經過new()方法才能保證每次都建立一個新的對象。安全
5.關於equals和==多線程
(1)對於==,若是做用於基本數據類型的變量(byte,short,char,int,long,float,double,boolean ),則直接比較其存儲的"值"是否相等;若是做用於引用類型的變量(String),則比較的是所指向的對象的地址(便是否指向同一個對象)。app
(2)equals方法是基類Object中的方法,所以對於全部的繼承於Object的類都會有該方法。在Object類中,equals方法是用來比較兩個對象的引用是否相等,便是否指向同一個對象。ui
(3)對於equals方法,注意:equals方法不能做用於基本數據類型的變量。若是沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址;而String類對equals方法進行了重寫,用來比較指向的字符串對象所存儲的字符串是否相等。其餘的一些類諸如Double,Date,Integer等,都對equals方法進行了重寫用來比較指向的對象所存儲的內容是否相等。線程
6. String、StringBuffer、StringBuilder的區別對象
(1)可變與不可變:String是不可變字符串對象,StringBuilder和StringBuffer是可變字符串對象(其內部的字符數組長度可變)。繼承
(2)是否多線程安全:String中的對象是不可變的,也就能夠理解爲常量,顯然線程安全。字符串
StringBuffer 與 StringBuilder 中的方法和功能徹底是等價的,只是StringBuffer 中的方法大都採用了synchronized 關鍵字進行修飾,所以是線程安全的,而 StringBuilder 沒有這個修飾,能夠被認爲是非線程安全的。
(3)String、StringBuilder、StringBuffer三者的執行效率:
StringBuilder > StringBuffer > String 固然這個是相對的,不必定在全部狀況下都是這樣。
好比String str = "hello"+ "world"的效率就比 StringBuilder st = new StringBuilder().append("hello").append("world")要高。
所以,這三個類是各有利弊,應當根據不一樣的狀況來進行選擇使用: 當字符串相加操做或者改動較少的狀況下,建議使用 String str="hello"這種形式; 當字符串相加操做較多的狀況下,建議使用StringBuilder,若是採用了多線程,則使用StringBuffer。