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


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

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

一.概述:

我們平時上網發帖,帖子的標題、內容,QQ的聊天內容都是字符串。因為很常用,編程語言常常會把字符串封裝成一類,實現方法,添加功能,以方便我們編程時的日常操作。

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM