資料結構 七---字串

來源:互聯網
上載者:User
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個點號,兩個空格被代替。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.