轉載請注明出處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) 使用指定的格式字符串和參數返回一個格式化字符串。