String類:
String類即字元串類型,並不是Java的基本數據類型,但可以像基本數據類型一樣使用,用雙引號括起來進行聲明。在Java中用String類的構造方法來創建字元串變數。
聲明字元串:聲明一個字元串就是創建一個字元串對象。
//可以聲明單個也可以同時聲明多個字元串對象,聲明不賦值,這個對象就是空, 也就是 String a= null; String a;
創建字元串:給字元串賦值就是創建字元串的過程。
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'};
(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的長度(包括空格)賦值給sint 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);
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對象那樣直接引用字元串常量
常用操作:
追加字元串:
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);
字元串的反序:
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="[email protected]";
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;
}
}
}
更多IT乾貨,歡迎關注微信:ujiuyesx
或者加入山西優就業QQ交流群:285240034
更多優質內容推薦:
有錢任性,某公司豪擲500萬幫助20左右年輕人找工作,起因是做善良的人:
http://www.ujiuye.com/zt/qgsqxly/?wt.mc_id=17009334