常用類--String
一、String
1.1 String是不可變對象
- String的底層是一個 char類型字元數組
- String類是final修飾的,不能被繼承,不能改變,但引用可以重新賦值
- String採用的編碼方式是Unicode方式
- 通過 new 創建的字元串對象,每一次new都會申請一個記憶體空間,雖然內容相同,但是地址值不同;
- 以「」方式給出的字元串,只要字元序列相同(順序和大小),無論在程式程式碼中出現幾次,JVM都會建立一個 String 對象,並在 字元串池 中維護。
- String是一個引用類型
1.2 String常量池
- java為了提高性能,靜態字元串在 常量池 中創建並且是同一對象,使用時 直接拿去用;
- 對於重複的字元串直接量會在jvm會去常量池中查找,如果有則返回,無則創建
public class string01 { public static void main(String[] args) { //在常量池中查找,沒有創建一個 String s="Hello"; //在常量池中查找,有的話不會創建新對象 String s1="Hello"; System.out.println(s==s1);//true String s2=new String("Hello");//新建一個對象 System.out.println(s1==s2);//false } }
- String s= new String("a");創建了幾個對象?
- 兩個或一個,如果常量池中有a則返回總共1個,如果沒有則創建a,加上new關鍵字是2個
1.3 String構造方法
package cn.tedu.day02; import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; import java.io.UnsupportedEncodingException; public class String02 { public static void main(String[] args) throws UnsupportedEncodingException { /* * String的構造方法:1、無參構造*/ String s=new String(); System.out.println(s); /* * utf-8*/ String s1=new String(new byte[]{'1','2','3','4'},1,3,"utf8"); System.out.println(s1); String s2=new String(new char[]{'H','e','l','l','o'}); System.out.println(s2); String s3=new String(new char[]{'A','B','C'},1,2); System.out.println(s3); String s4=new String(new int[]{'1','2','3'},1,2); System.out.println(s4); String s5=new String(new StringBuffer("high")); System.out.println(s5); String s6=new String(new StringBuilder("agh")); System.out.println(s6); } }
1.4.1 String的判斷方法
boolean equals(Object obj):比較字元串的內容是否相同
boolean equalsIgnoreCase(String str): 比較字元串的 內容 是否 相同,忽略大小寫
boolean startsWith(String str): 判斷 字元串對象 是否 以指定的 str 開頭
boolean endsWith(String str): 判斷 字元串對象 是否 以指定的 str 結尾
package cn.tedu.day02; public class String03 { public static void main(String[] args) { String s="abc"; String s1="Aac"; String s2=new String("abc"); /*第一種比較的方式*/ System.out.println(s==s2);//f 比較的對象,比較的地址值 System.out.println(s.equals(s2)); //2、不區分大小寫 System.out.println(s.equalsIgnoreCase(s1)); //3、判斷以什麼開始 System.out.println(s.startsWith("ab")); //4、判斷以什麼結束 System.out.println(s.endsWith("c")); } }
1.4.2 String的截取
- int length(): 獲取 字元串 的 長度,其實也就是字元個數
- char charAt(int index): 獲取 指定 索引處 的 字元
- int indexOf(String str): 獲取 str 在字元串 對象 中第一次出現的索引
- String substring(int start): 從 start 開始 截取 字元串
- String substring(int start,int end): 從 start 開始,到 end 結束 截取字元串。前包後不包
public class String04 { public static void main(String[] args) { String s="Hello"; String s1="liyimeng"; String s2=new String(new char[]{1,2,3}); System.out.println(s.length());//5 System.out.println(s1.length());//8 System.out.println(s2.length());//3 //第一種;charAt:根據索引找字元串 System.out.println(s.charAt(2));//h //第二種:indexOf:根據字元串找索引 System.out.println(s.indexOf("H"));//0 System.out.println(s1.indexOf('y',2));//2 //第三種:substring System.out.println(s.substring(1));//ello //第四種:substring(前包後不包)字元串沒變,創建了一個新串 System.out.println(s.substring(1,4));//ell
1.4.3 String的轉換
- char[] toCharArray():把字元串轉換為字元數組
- String toLowerCase():把字元串轉換為小寫字元串
- String toUpperCase():把字元串轉換為大寫字元串
import java.util.Arrays; import java.util.Locale; public class String05 { public static void main(String[] args) { String s="l y m"; //1、toCharArray把字元串轉化為字元數組 char c[]=s.toCharArray(); System.out.println(Arrays.toString(c)); c=new char[]{'H','e','l','l','o'}; String s1=new String(c); System.out.println(s1); //2、toUpperCase全部變大寫 System.out.println(s.toUpperCase(Locale.ROOT)); //3、toLowerCase全部變小寫 System.out.println(s.toLowerCase(Locale.ROOT)); } }
1.4.4 其他方法
- String trim(): 去除 字元串 兩端空格
- String[] split(String str): 按照 指定符號 分割 字元串
import java.util.Arrays; public class String06 { public static void main(String[] args) { String s=" hello world "; //trim:去除字元串兩端空格(中間的不去)字元串不可變 System.out.println(s.trim()); //split:分割字元串 System.out.println(s.length()); System.out.println(Arrays.toString(s.split("h"))); System.out.println(s.length()); String s2="www.baidu.com"; //1、獲取兩個點的索引 int start=s2.indexOf("."); int end=s2.lastIndexOf("."); String result=s2.substring(start+1,end); System.out.println((result)); //String api中的方法進行測試 } }
1.5 StringBuilder
1.5.1 可變字元串
- StringBuilder 是 一個執行緒 非安全 的 可變字元序列
- StringBuilder 底層 在其父類中 封裝了 一個 char類型 的數組
- StringBuilder 創建了一個 初始容量 為 16
//構造方法 public class StringBuilder01 public class StringBuilder01 { public static void main(String[] args) { //構造方法 StringBuilder sb=new StringBuilder(); System.out.println("無參構造方法:"+sb); System.out.println("初始容量:"+sb.capacity()); // StringBuilder sb1=new StringBuilder(32); System.out.println("自定義容量:"+sb1.capacity()); // StringBuilder sb2=new StringBuilder("hello"); System.out.println("容量:"+sb2.capacity()); System.out.println(sb2); } } public static void main(String[] args) { //構造方法 StringBuilder sb=new StringBuilder(); System.out.println("無參構造方法:"+ sb); System.out.println("初始容量:"+sb.capacity()); StringBuilder sb1=new StringBuilder(32); System.out.println("自定義容量:"+sb1.capacity()); StringBuilder sb2=new StringBuilder("hello"); System.out.println("容量:"+sb2.capacity()); System.out.println(sb2); } }
1.5.2 常用方法
-
append(任意內容):追加字元串,數組放滿,容量翻倍
-
追加擴容問題:
- 擴容實現原理:數組的 arrays.copyOf() 方法
• 擴容演算法: 原數組容量 * 2 + 2
• 測試:
public class String02 { public static void main(String[] args) { StringBuilder stringBuilder=new StringBuilder("hello"); System.out.println(stringBuilder. append("lllllllllllllllllllll")); System.out.println("sb的容量:"+stringBuilder.capacity()); System.out.println("sb的內容:"+stringBuilder); System.out.println("sb的長度:"+stringBuilder.length()); System.out.println(stringBuilder. append("lllllllllllllllllllllllll"));//超出的字元串長度*2+2 System.out.println("sb的容量:"+stringBuilder.capacity()); System.out.println("sb的內容:"+stringBuilder); System.out.println("sb的長度:"+stringBuilder.length()); } }
- insert(int ,任意類型):插入
- delete(int start,int end):刪除
- replace(int start,int end,String s):替換
- reverse():反轉
public class StringBuilder04 { public static void main(String[] args) { //insert: StringBuffer stringBuffer=new StringBuffer("hello"); stringBuffer.insert(2,"lym"); System.out.println(stringBuffer); //delete: StringBuffer stringBuffer1=new StringBuffer("lym"); System.out.println(stringBuffer1.delete(1,3)); //replace: StringBuffer stringBuffer2=new StringBuffer("zhangsan"); System.out.println(stringBuffer2.replace(1,5,"qqq")); //reverse:反轉 System.out.println(stringBuffer.reverse()); } }
- 方法返回值問題
- 因為這些 方法 的 返回值語句 是 return this; 因此 可以 連續調用
public class String05 { public static void main(String[] args) { StringBuilder stringBuilder=new StringBuilder(); stringBuilder.append("hello").append("lym").append(1).replace(2,5,"zhang").reverse(); System.out.println(stringBuilder); } }
1.5.4 StringBuilder和StringBuffer的區別:
- StringBuffer 是 執行緒安全 的
• StringBuilder是 執行緒非安全 的,因此 運行速率 較快
1.5.5 StringBuilder和String相互轉化:
1、StringBuilder轉換為String
public String toString(): 通過 toString()就可以實現把StringBuilder轉換為String
2、String轉換為StringBuilder
pubilc StringBuilder(String s): 通過 構造方法 就可以實現String轉換為StringBuilder
