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