Java中字符串的學習(一)String類的概述及常見方法使用

 轉載請註明出處http://www.cnblogs.com/devtrees/p/4347079.htmlhtml

(拓展:Api:編程語言對外給咱們提供的應用程序接口。)java

一.概述:面試

咱們平時上網發帖,帖子的標題、內容,QQ的聊天內容都是字符串。由於很經常使用,編程語言經常會把字符串封裝成一類,實現方法,添加功能,以方便咱們編程時的平常操做。正則表達式

Java中將字符串封裝成java.lang包下的String類。編程

查看javaapi,咱們發現string是final所修飾的。表明着string這個類不能有子類。(也就是指類中對字符串操做的功能是不能被咱們複寫。)api

String類表明字符串。Java程序中的全部字符串字面值(如「abc」)都做爲此類的實例實現。也就是說,java中,只要是被「」歸納的內容都是字符串,都是string的一個具體對象。數組

查看java的api,咱們發現string類有無參構造函數,也就是說:編程語言

String s = new String();等同於:String s = 「」;函數

這樣咱們很容易發現第二種更簡便,因此第一種初始化很少見。學習

下面來個小示例:

String s1 = 「abc」;

對於這樣一個string例子,s1是一個類類型變量,類類型變量,必定指向對象。因此」abc」是一個對象。因此字符串(即全部用雙引號引發來的)是一個特殊的對象。

字符串最大特色:(對象)一旦被初始化,就不能夠改變。(字符串常量)

String s = 「abc」;

s = 「kk」;

System.out.println(s);

打印輸出的是kk。

可能有的朋友會有疑問,說不能改變,但爲何還會打印kk呢?

正如前面所說,s是一個類類型變量,s是可變的,它在一開始指向的是字符串對象(或者說常量)」abc」,而」abc」纔是咱們說的字符串對象,它這裏面的內容是不會被其餘東西改變的。一樣」kk」也是同樣。變的是s,不變的是」abc」和」kk」。同時」abc」和」kk」在內存中是同時存在的。

 

仍是看api,咱們發如今string的有參構造函數中,還能夠傳入字符串。

注意:

String s = 「abc」;

String s1 = new String(「abc」);

在使用上都是同樣的,可是有區別:

System.out.println(s == s1); //false,緣由在於「abc」是一個對象,new String()是另外一個對象。二者地址值不一樣。

System.out.println(s.equals(s1));//true,雖然String的父類Object類的equals()方法比較的是地址值,可是String類複寫了父類的這一方法,該方法用於判斷字符串是否內容相同

面試題:

String s = 「abc」;

String s1 = new String(「abc」);

有什麼區別?

s在內存中有一個對象

s1在內存中有兩個對象

有關字符串常量池的簡單說明

字符串是存儲在一個叫常量池的內存中,以數組的形式進行存儲像」a」,」b」和」c」這樣的字符。

咱們都知道,字符串是由字符數組組成。

當咱們存」abc」時,內存將其放在數組中,而後咱們又存一個「efg」,內存一樣把它們分解放在數組中,而當咱們再存儲」abf」這個字符串時,內存會在數組中找到相應的字符來拼這個字符串。

引伸出一道小練習:

String s1 = 「abc」;

String s2 = new String(「abc」);

String s3 = 「abc」;

System.out.println(s1==s2);

System.out.println(s1==s3);

答案分別輸出:

false;

true

關於第一個,咱們上一部分已經說了。

那麼第二個是怎麼回事呢?

S1指向一個對象字符串,s3也指向一個字符串, s1建立的字符串以前已經在內存中存在。字符串做爲一種特殊的對象,且是在常量池裏存儲的數據。S3在初始化時發現,字符串中的字符已經在內存中存在的話,由於字符串內容相同(字符數組相同),s3就不會再獨立開闢內存空間了。

若是s3再開闢內存空間就會產生浪費空間的現象:字符串已經存在且不會再改變,因此就不會再開闢空間。

二.常見方法

前面已經說了String類是用於描述字符串事物。那麼它就提供了多個方法對字符串進行操做。常見的操做有哪些?

1.獲取

1。1字符串中包含的字符數(長度)

int length();

注意:數組也有長度,也是length,可是數組的長度是屬性,沒有括號。

1.2根據位置獲取位置上的某個字符。

char charAt(int index)當訪問到字符串中不存在的腳標時,會發生字符串腳標越界異常:StringIndexOutOfBoundsException.

1.3根據字符獲取該字符在字符串中的位置。

int indexOf(int ch);接收傳入的參數是ascii碼,返回的是ch在字符串中第一次出現的位置。

int indexOf(int ch,int fromIndex):從fromIndex指定位置開始,獲取ch在字符串中所在位置。

訪問不到(字符串中沒有這個字符)返回-1.

1.4根據字符串獲取該字符串在字符串中的位置(大的字符串中找小字符串)

int indexOf(String str);接收傳入的參數是ascii碼,返回的是str在字符串中第一次出現的位置。

int indexOf(String str,int fromIndex):從fromIndex指定位置開始,獲取str在字符串中所在位置。

1.5根據字符反向獲取該字符在字符串中的位置

int lastIndexOf(int ch);接收傳入的參數是ascii碼,返回的是ch在字符串中第一次出現的位置。

int lastIndexOf(int ch,int fromIndex):從fromIndex指定位置開始,獲取ch在字符串中所在位置。

1.6根據字符串反向獲取該字符串在字符串中的位置

int lastIndexOf(String str);接收傳入的參數是ascii碼,返回的是str在字符串中第一次出現的位置。

int lastIndexOf(String str,int fromIndex):從fromIndex指定位置開始,獲取str在字符串中所在位置。

2.判斷

2.1字符串中是否包含某一個子串。

boolean contains(String str);

特殊變種:indexOf(String str)能夠因此str第一次出現的位置,若是返回-1,表示該str不在字符串中存在。因此,也能夠用於對指定字符串進行判斷是否包含。並且該方法既能夠判斷,又能夠獲取出現的位置。

應用:若是隻爲判斷,用contains,若是既要判斷,又要獲取位置用indexOf

2.2字符串中是否有內容

boolean isEmpty();原理就是判斷長度是否爲0

2.3字符串是否以指定內容開頭

boolean startsWith(String str)

2.4字符串是否以指定內容結尾

boolean endsWith(String str)

2.5判斷字符串的內容是否相同

boolean equals(String str)  複寫了Object類中的equals方法。

2.6判斷字符串內容是否相同並忽略大小寫

boolean equalsIgnoreCase()

3.轉換

3.1將字符數組轉換成字符串

構造函數:在字符串的構造函數中就有一個構造函數是傳入字符數組的,

String(char[] value)

在字符串初始化的時候,就能完成字符數組轉換成字符串的操做。

還有它的一個的重載構造函數

String(char[] value,int offset,int count):將字符數組中的一部分轉換成字符串

其中 第二個參數是偏移位,第三個參數是個數

同理:還有一個字節數組的構造函數也是同樣的。僅僅是多了一個編碼集

靜態函數  static String copyValueOf(char[] data),注意是靜態的,由於其內部並無操做特有數據。一樣他也有重載函數,將字符數組中的一部分轉化成字符串

                       static String copyValueOf(char[] data,int offset,int count)

                       static String valueOf(char[] data)

 

3.2將字符串轉換成字符數組**

查找api技巧:確定不是構造,轉成數組,就會有返回值,且是char類型數組因此根據方法的返回值類型去找

char[] toCharArray(),這裏爲何沒有傳入一個字符串參數呢?由於方法是由對象調用的,這裏調用這個方法的對象就是一個字符串,因此括號內有隱藏的this.

3.3將字節數組轉換成字符串(IO)

String(byte[] value)

String(byte[] value,int offset,int count) 將字節數組中的一部分轉換成字符串

3.4將字符串轉換成字節數組

byte[] getBytes()

3.5 將基本數據轉換成字符串。

static String valueOf(int)

static String valueOf(double)

示例:String.valueOf(3)==」3」== 3+」」

 

 

特殊:字符串和字節數組在轉換過程當中,是能夠指定編碼表的。

 

 

4.替換

String replace(char oldChar,char newChar),須要注意的是,返回的是一個新字符串,由於字符串一旦被建立就沒法修改,因此返回的是一個新串。

若是要替換的字符不存在,返回的仍是原字符串。可是這樣一個字符一個字符的替換很麻煩。Java給咱們提供了另一個方法

String replace(CharSequence target,CharSequence replacement)這個方法能夠直接接收、替換字符串。前一個參數是老串,後一個參數是新串。

還有其餘兩種方法:

String replaceAll(String regex,String replacement);

String replaceFirst(String regex,String replacement);

由於涉及正則表達式,暫時先不學習。瞭解其是按指定的規則進行替換便可。

5.切割

注意:將一個字符串分隔成若干個字符串,返回的是字符串數組。

String[] split(String regex);

這裏傳入的參數也是一種規則,但這種規則有點特殊,不用指定規則(正則表達式),寫入通常的字符串也能夠。

String s = 「zhangsan,lisi,wangwu」;

String[] arr = s.split(「,」);

for(intx = 0;x<arr.length;x++){

System.out.println(arr[x]);

}

注意:分割不等於獲取,在本例中字符串中有」,」,而分割後獲取獲得的數組中沒有」,」,分割字符串的標準字符串是獲取不到的。

 

6.子串。獲取字符串中的一部分(能夠放在獲取裏)

String substring(int beginIndex):從指定位置到結尾。

String substring(int beginIndex,int endIndex)包含頭,不包含尾。

若是腳標不存在,會出現字符串腳標越界異常。

在切割的案例中,咱們能夠將逗號的腳標索引出來,在用這裏的方法獲取姓名。就是麻煩,沒有切割快。

7.轉換

將字符串轉換成大寫或者小寫。

String toUpperCase();

String toLowerCase();

8.去除空格

將字符串兩端的多個空格去除

String trim();

 

9比較

對兩個字符串進行天然順序(字典順序)的比較

int compareTo(String str)

會有三種結果:大於、小於、等於

對象等於傳入的參數返回0

對象小於傳入的參數返回負數

對象大於傳入的參數返回正數

返回的值是兩個字符串中相同腳標對應字符的ASCII碼值相比的結果,若相同就會會一直比下去,直到比出不一樣的,若不一樣,輸出結果,再也不繼續比。

10

JDK1.5中,String類新增了一個頗有用的靜態方法String.format(): 
format(Locale l, String format, Object... args) 使用指定的語言環境、格式字符串和參數返回一個格式化字符串。 
format(String format, Object... args) 使用指定的格式字符串和參數返回一個格式化字符串。

參考:http://blueram.iteye.com/blog/441683

相關文章
相關標籤/搜索