String類 建立字串
String greeting = "beijing";
編譯器會使用該值建立一個 String 對象。和其它對象一樣,可以使用關鍵字和構造方法來建立 String 對象。注意String類型是特殊的參考型別(前邊有final),所以String 類是不可改變的,所以你一旦建立了 String 對象,那它的值就無法改變了如果需要對字串做很多修改,那麼應該選擇使用 StringBuffer & StringBuilder 類。
String s = "Google";System.out.println("s = " + s);s = "Runoob";System.out.println("s = " + s);
GoogleRunoob
從結果上看是改變了,但為什麼門說String對象是不可變的呢。原因在於執行個體中的 s 只是一個 String 對象的引用,並不是對象本身,當執行 s = “Runoob”; 建立了一個新的對象 “Runoob”,而原來的 “Google” 還存在於記憶體中。
字串長度
String 類的一個訪問器方法是 length() 方法,它返回字串對象包含的字元數。
public class StringDemo { public static void main(String args[]) { String site = "www.runing.com"; int len = site.length(); System.out.println( "長度 : " + len ); }}
14
連接字串
使用concat方法
string1.concat(string2);
使用“+”操作符
"Hello," + " runing" + "!"
常用的string方法 字串尋找
1 char charAt(int index) 返回指定索引處的 char 值。
public class Test { public static void main(String args[]) { String s = "www.runoob.com"; char result = s.charAt(8); System.out.println(result); }}結果為: o 字串比較
1 int compareTo(String anotherString) 按字典順序比較兩個字串。
按字典順序比較兩個字串。
如果參數字串等於此字串,則傳回值 0;
如果此字串小於字串參數,則返回一個小於 0 的值;
如果此字串大於字串參數,則返回一個大於 0 的值。
2 int compareToIgnoreCase(String str) 按字典順序比較兩個字串,不考慮大小寫。
其餘常用類見菜鳥教程,感謝該教程的支援
http://www.runoob.com/java/java-string.html StringBuffer 和 StringBuilder 類
當對字串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。和 String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,並且不產生新的未使用對象。StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是安全執行緒的(不能同步訪問)。由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程式要求安全執行緒的情況下,則必須使用 StringBuffer 類。
public class Test{ public static void main(String args[]){ StringBuffer sBuffer = new StringBuffer("我後邊可以append字串哦:"); sBuffer.append("www"); sBuffer.append(".runoob"); sBuffer.append(".com"); System.out.println(sBuffer); }}
運行結果: 我後邊可以append字串哦:www.runoob.com
Java 中 StringBuffer 和 String 是有一定的區別的,首先,String 是被 final 修飾的,他的長度是不可變的,就算調用 String 的concat 方法,那也是把字串拼接起來並重新建立一個對象,把拼接後的 String 的值賦給新建立的對象,而 StringBuffer 的長度是可變的,調用StringBuffer 的 append 方法,來改變 StringBuffer 的長度,並且,相比較於 StringBuffer,String 一旦發生長度變化,是非常耗費記憶體的。 筆試題中的字串(錯題本)
1,順序執行下列程式語句後,則b的值是()
String a="Hello";String b=a.substring(0,2); //He
substring 方法將返回一個包含從start到最後(不包含end )的子字串的字串。 length和capacity的區別
定義有StringBuffer s1=newStringBuffer(10);s1.append(“1234”)則s1.length()和s1.capacity()分別是多少?
解析:length 返回當前長度,如果字串長度沒有初始化長度大,capacity返回初始化的長度,如果append後的字串長度超過初始化長度,capacity返回增長後的長度。
PS:如果沒有明確初始化,則按預設的來
StringBuffer和StringBuilder的預設大小為16
ArrayList和LinkedList的預設大小10
StringBuffer s = new StringBuffer(x); x為初始化容量長度
s.append(“Y”); “Y”表示長度為y的字串
length始終返回當前長度即y;
對於s.capacity():
1.當y <=x時,值為x
以下情況,容器容量需要擴充
2.當x<=y<=2*x+2時,值為 2*x+2
3.當y>=2*x+2時,值為y String, StringBuffer,StringBuilder的區別
java中String、StringBuffer、StringBuilder是編程中經常使用的字串類,他們之間的區別也是經常在面試中會問到的問題。現在總結一下,看看他們的不同與相同。 1.可變與不可變
String類中使用字元數組儲存字串,如下就是,因為有“final”修飾符,所以可以知道string對象是不可變的。
private final char value[];
String 為不可變對象,一旦被建立,就不能修改它的值. . 對於已經存在的String對象的修改都是重新建立一個新的對象,然後把新的值儲存進去.
StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字元數組儲存字串,如下就是,可知這兩種對象都是可變的。
char[] value;
StringBuffer:是一個可變對象,當對他進行修改的時候不會像String那樣重建立立對象 , 它只能通過建構函式來建立, 如: StringBuffer sb = new StringBuffer();
不能通過賦值符號對他進行付值. , 如 sb = “welcome to here!”;//error
對象被建立以後,在記憶體中就會分配記憶體空間,並初始儲存一個null.向StringBuffer中賦值的時候可以通過它的append方法. sb.append(“hello”); 2.是否多安全執行緒
String中的對象是不可變的,也就可以理解為常量, 顯然安全執行緒 。
AbstractStringBuilder是StringBuilder與StringBuffer的公用父類,定義了一些字串的基本操作,如expandCapacity、append、insert、indexOf等公用方法。
StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是 安全執行緒的 。看如下源碼:
1 public synchronized StringBuffer reverse() {
2 super .reverse();
3 return this ;
4 }
5
6 public int indexOf(String str) {
7 return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法
8 }
StringBuilder並沒有對方法進行加同步鎖,所以是 非安全執行緒的 。
3.StringBuilder與StringBuffer共同點
StringBuilder與StringBuffer有公用父類AbstractStringBuilder( 抽象類別 )。
抽象類別與介面的其中一個區別是:抽象類別中可以定義一些子類的公用方法,子類只需要增加新的功能,不需要重複寫已經存在的方法;而介面中只是對方法的申明和常量的定義。
StringBuilder、StringBuffer的方法都會調用AbstractStringBuilder中的公用方法,如super.append(…)。只是StringBuffer會在方法上加synchronized關鍵字,進行同步。
最後,如果程式不是多線程的,那麼使用StringBuilder效率高於StringBuffer。
效率比較String < StringBuffer < StringBuilder,但是在String S1 =“This is only a”+“simple”+“test”時,String效率最高(編譯器最佳化的作用)。
這裡詳見我另一篇部落格,關於編譯器最佳化的問題
http://blog.csdn.net/sinat_33087001/article/details/74228500 null的特殊用法
public class TestClass { private static void testMethod(){ System.out.println("testMethod"); } public static void main(String[] args) { ((TestClass)null).testMethod(); }}
運行正常,輸出testMethod
解析: null可以被強制類型轉換成任意類型(不是任意類型對象),於是可以通過它來執行靜態方法。 replace和replaceAll是的區別:
1)replace的參數是char和CharSequence,即可以支援字元的替換,也支援字串的替換(CharSequence即字串序列的意思,說白了也就是字串);
2)replaceAll的參數是regex,即基於Regex的替換,比如,可以通過replaceAll(“\d”, “*”)把一個字串所有的數字字元都換成星號;
public static void main (String[] args) { String classFile = "com.jd.". replaceAll(".", "/") + "MyClass.class"; System.out.println(classFile);}
輸出結果://///////MyClass.class
題目中“.”,在Regex中表示任何符號,所以答案是C,五個字母,2個點號,兩個空格被代替。