String類:
String類即字符串類型,並不是Java的基本數據類型,但可以像基本數據類型一樣使用,用雙引號括起來進行聲明。在Java中用String類的構造方法來創建字符串變量。
聲明字符串:聲明一個字符串就是創建一個字符串對象。
//可以聲明單個也可以同時聲明多個字符串對象,聲明不賦值,這個對象就是空, 也就是 String a= null; String a; String b,c;
創建字符串:給字符串賦值就是創建字符串的過程。
1.給字符串賦值的四種方法:
(1).引用字符串常量
String a="hi"; String b="hello",c="world"; String d; d="hello world";
(2).利用構造方法直接實例化
// 1. String a=new String("hello "); // 2. String b=new String(a);
(3).利用字符數組實例化
char[] charArr={'t','i','m','e'}; String a=new String(charArr); String b=new String(charArr,0,2);//從數組第0個索引開始,取2個數
(4).利用字節數組實例化
2.把任何類型轉換為字符串:
valueOf() 方法
System.out.println(String.valueOf(6)); //將6轉換為字符串
3.連接字符串
+
//使用 + 號拼接 String a="123"+456; String b=a+"hello"; //使用 += 拼接 b+="您好"; System.out.println(b);
4.獲取字符串的長度:
length() 方法
String a="123 456 789"; //獲取a的長度(包括空格)賦值給s int s=a.length(); System.out.println(s);
5.獲取指定索引位置的字符:
char() 方法
String str = " a new world a new start "; System.out.println(str.charAt(3));// 取出字符串中制定索引位置的字符
6.判斷一個字符串是否包含另一個字符:
contains() 方法
String str = " a new world a new start "; System.out.println(str.contains("abc"));// 判斷一個字符串是否包含另一個字符串
7.獲取指定位置的字符 返回索引:
indexOf() 獲取指定位置的字符四種方法:
String str="we are the world"; System.out.println(str.indexOf("e")); System.out.println(str.indexOf("e",2));//索引2之后e出現的索引 System.out.println(str.lastIndexOf("e")); System.out.println(str.lastIndexOf("e",8));//索引8之前出現的e
8.截取字符串:
String id="123456199410207890"; //獲取第十五位索引到最后的數字 String e4=id.substring(15); //獲取第六位到十四位索引,即生日 String bir=id.substring(6,14); System.out.println("您的生日是:"+bir);
9.判斷字符串是否相等:
需要特別注意的是,如果定義兩個字符串再用 == 去判斷它們是否相等,那么他們的結果一定是false。這是因為這兩個字符串的值都會保存在內存的堆棧中,首先我們創建 name 和 dbValue 兩個引用,然后用 new 方法在堆中創建了 String 的對象實體,並讓兩個引用指向各自的對象實體,然后兩個對象實體又會分別在棧中創建字面值內容。name 和 dbValue 始終指向的是兩個獨立的內存區域,而 == 判斷的是內存地址,所以用 == 判斷字符串結果一定false,這和他們保存的什么樣的字面值沒有任何關系。
判斷字符串相等要使用 equales方法:
equales方法比較的是兩個字符串的內容
equalsIgnoreCase 方法: 忽略大小寫的比較方法
特殊情況:
如果創建的字符串不是用 new 方法創建的,而是直接用引用字符串常量。結果會有不同。
我們讓 name 創建引用字符串常量 tom 的時候,Java虛擬機首先會在棧中創建 tom 然后會自動創建一個匿名的字符串對象指向 tom ,最后將匿名字符串對象的地址交給 name 引用。然后再當我們讓 dbValue也引用常量 tom 的時候, Java虛擬機會先到棧的常量區中尋找是否有相同的常量,發現有相同的常量,就直接將這個常量的匿名對象交給了dbValue引用。這時 name 和 dbValue 指向的就是同一個匿名對象,這樣他們 == 返回的結果就是 true。
常量池:String 直接引用創建字符串的時候,Java會從常量池中找這個“tom”,如果找到了,他會將找到的這個直接給他,如果找不到則新建
如下:
10. 判斷字符串的開始和結尾:
endsWith 方法和 startsWith方法
11.字符串替換
12.去除首尾空格和去除所有空白:
trim()方法
replaceAll("\\s","") 方法
13.大小寫轉換
toUpperCase() 方法
toLowerCase() 方法
14.字符串分割
.split()
需要注意的是不能用 “.” 進行分割,因為支持正則表達式,所以要用時應使用轉義字符,如 “.” 應使用 “\\.”
15.查找字符串
indexOf() 方法
16.格式化字符串
format方法
http://tool.oschina.net/apidocs/apidoc?api=jdk-zh 格式化字符在線API文檔
Date tim=new Date(); String str=String.format("%tF", tim); System.out.println(tim); System.out.println(str); //格式化為年 System.out.println(str.format("%tY",tim)); //格式化為月 System.out.println(str.format("%tB",tim)); //格式化為日 System.out.println(str.format("%td",tim));
System.out.println(String.format("字母a: %c",'a')); System.out.println(String.format("123+456= %d",123+456)); System.out.println(String.format("保留三位小數 %.3f",3.141592652545)); System.out.println(String.format("判斷2<3 %b",2<3)); System.out.println(String.format("科學計數法 %e",12000000.1)); System.out.println(String.format("天才是%d%%的汗水和%d%%的靈感",1,99));//要注意在 這種方法中要輸出%號需要寫兩個%%
StringBuffer類
是線程安全的可變字符序列。一個類似於String的字符串緩沖區。String創建的字符串對象是不可修改的,StringBuff類創建的是可修改的字符串序列,且實體容量會隨着存放的字符串增加而自動增加。
StringBuilder類
即字符串生成器,新創建的StringBuilder對象初始容量是16個字符,可以自行指定初始長度,也可以動態地執行添加、刪除和插入等字符串的編輯操作,大大提高了頻繁增加字符串的效率。如果附加的字符超過可容納的長度,則StringBuilder對象將自動增加長度以容納被附加的字符。
三者的關系:
在執行速度方面的比較:StringBuilder > StringBuffer > String
三者之間相互轉換:
三者之間的不同之處:
String只能賦值1次,每一次改變內容都生成了一個新的對象,然后原有的對象引用了新的對象,所以說String本身是不可改變,每一次改變String的內容,都會在內存創建新的對象,而每一次生成新對象都會對系統性能產生影響,這會降低Java虛擬機的工作效率。如下圖所示:
而StringBuilder和StringBuffer不同,每次操作都是對自身對象的操作,而不是生成新的對象,其所占空間會隨着字幅內容增加而增加,做大量修改操作時,不會因生成大量匿名對象而影響系統性能。如下圖所示:
StringBuffer類:
作用:String雖然提供了很多API方法,但是始終是對字符串常量進行操作,不僅無法改變常量的值,還會占用大量內存空間。StringBuffer類則是一個非常靈活的工具,節約內存空間的同時還保障了線程安全。
創建:
//創建一個StringBuilder類對象必須用new方法,不能像String對象那樣直接引用字符串常量 StringBuffer sbf1=new StringBuffer(); //創建一個對象無初始值 StringBuffer sbf2=new StringBuffer("abc"); //創建一個對象,初始值 “abc” StringBuffer sbf3=new StringBuffer(32); //創建一個對象,初始容量為32個字符
常用操作:
追加字符串:
append() 方法
StringBuffer sbf =new StringBuffer("誰將"); sbf.append("新樽"); //追加字符串 StringBuffer s1=new StringBuffer("辭舊月"); sbf.append(s1); //追加新的字符串中的內容 int a=2333; sbf.append(a); //追加int型變量a System.out.println(sbf);
修改指定索引處的字符:
setChar() 方法
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月"); sbf.setCharAt(6,'日'); //替換索引6的字符 System.out.println(sbf);
插入字符串:
insert() 方法
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月"); sbf.insert(2,"我的"); //在索引2插入 System.out.println(sbf);
字符串的反序:
reverse() 方法
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月"); sbf.reverse(); System.out.println(sbf);
刪除子字符串:
delete() 方法
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月"); sbf.delete(4,6); System.out.println(sbf);
其他常用方法:
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月"); System.out.println(sbf.length()); //獲取字符串序列長度 System.out.println(sbf.charAt(5)); //獲取索引為5的內容 System.out.println(sbf.indexOf("DEF")); //獲取DEF所在的索引位置,沒有返回 -1 System.out.println(sbf.substring(0,2)); //獲取索引0-2的內容 System.out.println(sbf.replace(2,5,"wode")); //將索引2-5的內容替換
StringBuilder類和StringBuffer類具有兼容的API,所以兩者使用方法也相同
StringBuilder sbd=new StringBuilder(); sbd.append("我是StringBuilder"); //追加字符 sbd.length(); //長度 sbd=sbd.insert(5,"///"); //插入 sbd=sbd.delete(sbd.length()-1,sbd.length() ); //刪除最后一個字符 sbd=sbd.reverse(); //反序
String字符串練習整理:
public class Test2 { public static void main(String[] args){ String str="像勇士這樣的球隊,只有防守一松懈,他們才能抓住機會,打完了三場,爵士還是沒找到應對勇士的辦法"; //1, 寫代碼找出關鍵字"球隊","機會"所在字符串str的索引位置, 找出字符串中第二個"勇士"的位置, 並輸出在控制台上 System.out.println(str.indexOf("球隊")); System.out.println(str.indexOf("機會")); System.out.println(str.indexOf("勇士",2)); //2, 定義int型變量m, 取值為第一題中所有索引值的和 int m=str.indexOf("球隊")+str.indexOf("機會")+str.indexOf("勇士",2); System.out.println(m); //3, 在控制台上輸出m作為char型時顯示的內容 System.out.println((char)m); //4, 寫代碼實現將str字符串用","分割成數組, 並輸出索引值為4的值 String strs[]= str.split(","); System.out.println(strs[4]); //5, 寫代碼實現將str字符串中"爵士"用"勇士"代替, "勇士"用"爵士"代替,並將結果輸出到控制台上(禁用replace方法) String strg[]= str.split(""); for(int g=0;g<strg.length;g++){ if(strg[g].equals("爵")){ strg[g]="勇"; }else if(strg[g].equals("勇")){ strg[g]="爵"; } System.out.print(strg[g]); } System.out.println(); //6, 編寫代碼從str字符串中取一部分在控制台上打印這樣一句話: 勇士抓住機會,找到應對辦法 int a1= str.indexOf("勇士"); int a2= str.indexOf("抓住機會"); int a3= str.indexOf(","); int a4= str.indexOf("找到應對"); int a5= str.indexOf("辦法"); System.out.println(str.substring(a1,a1+2)+str.substring(a2,a2+4)+str.substring(a3,a3+1)+str.substring(a4,a4+4)+str.substring(a5,a5+2)); //7, 寫一段代碼, 可以取出任意qq郵箱地址中的qq號碼 String qe="931375261@qq.com"; String str1[]=qe.split("@"); System.out.println(str1[0]); //8, 使用for和if打印一個空心正方形 for(int i=0;i<10;i++){ System.out.print('*'); } System.out.println(); for(int i=0;i<=3;i++){ System.out.print("* *"); System.out.println(); } for(int i=0;i<10;i++){ System.out.print('*'); } System.out.println(); int M, N; int h, j; M=N=6; for(h=0;h<M;++h) { if(h==0||h==M-1) { for(j=0;j<N;++j) { System.out.print("* "); } } else { System.out.print("* "); for(j=0;j<N-2;++j) { System.out.print(" "); } System.out.print("* "); } System.out.println(""); } //9, 使用for循環打印一個菱形 int lineCount = 9;// 輸出的菱形有多少行,請賦值成奇數 int maxLineNum = (lineCount + 1) / 2;// 菱形最多一行 for (int i = 1; i <= maxLineNum; i++) {// 循環菱形數量越來越多的幾行 for (int space = 1; space <= maxLineNum - i; space++) {// 輸出空格,數量=最后一行-當前行數 System.out.print(" "); } for (int star = 1; star <= (i * 2) - 1; star++) {// 輸出星號,數量=行數*2-1 System.out.print("*"); } System.out.println();// 換行 } int declineCount = lineCount - maxLineNum;// 計算剩下的幾行,這幾行星號的數量是遞減的 for (int i = 1; i <= declineCount; i++) {// 循環菱形數量越來越少的行數 for (int space = 1; space <= i; space++) {// 輸出空格,數量等於當前的行數 System.out.print(" "); } for (int star = 1; star <= (declineCount - i + 1) * 2 - 1; star++) {// 輸出星號,數量等於(總數-當前行數)*2-1 System.out.print("*"); } System.out.println(); } //10, 使用for循環打印一個空心菱形(選做題)*/ int max=9; int mid=(max+1)/2; for(int v=1;v<=mid;v++){ // 輸出空格,數量=最后一行-當前行數 for(int sp=1;sp<=mid-v;sp++){ System.out.print(" "); } // 輸出星號,數量=行數*2-1 for(int sp=1;sp<=(v*2)-1;sp++){ if(sp==1){ System.out.print("*"); }else if(sp==(v*2-1)){ System.out.print("*"); }else{ System.out.print(" "); } } System.out.println(); } int end=max-mid; // 循環菱形數量越來越少的行數 for(int f=1;f<=end;f++){ for(int sp=1;sp<=f;sp++){ System.out.print(" "); } for(int st= 1;st<=(end-f+1)*2-1;st++){ if(st==1){ System.out.print("*"); }else if(st==(end-f+1)*2-1){ System.out.print("*"); }else{ System.out.print(" "); } } System.out.println(); } } }