您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java中String類、StringBuffer和StringBuilder怎么使用”,在日常操作中,相信很多人在Java中String類、StringBuffer和StringBuilder怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中String類、StringBuffer和StringBuilder怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
String類屬于引用數據類型,不屬于基本數據類型。
在Java中只要是" "(雙引號)中的,都是String對象。
java中規定,雙引號中的字符串是不可變的,也就是說"abc"自出生到死亡都不可能變成"abcd",也不能變成"ab"。
在JDK中雙引號括起來的字符串都是存儲在方法區的字符串常量池當中的。(因為在實際開發中,字符串的使用頻率十分高,為了執行效率,就把字符串放在了方法區中的字符串常量池當中)
通過 String s = “abc” 這種方式,會在方法區中的字符串常量池創建對象,s會保存該字符串在字符串常量池中的地址。
通過 String s = new String(“abc”)的方式創建對象,首先會在字符串常量池中創建"abc"對象(如果字符串常量池中已經有了"abc"則不會再次創建),然后會在堆區創建String類對象,它會儲存" abc "在方法區中的地址,s又會保存堆中String對象的地址。
看以下代碼:
public class StringTest01 { //這兩行代碼表示創建3個字符串對象,且都在字符串常量池中 String A = "abc"; String B = "abc" + "de"; //通過 new 來創建字符串對象,會先在字符串常量池中尋找"abc" //找不到的話就會在字符串常量池中創建一個"abc"對象 //在堆中創建創建字符串對象,并且保存"abc"在字符串常量池中的地址 String C = new String("abc"); }
按照以上代碼畫出JVM內存簡圖如下:
知道了String類字符串的存儲原理之后,就可以很容易知道以下代碼的編譯結果:
public class StringTest01 { public static void main(String[] args) { //沒有在堆中創建對象 //s1與s2都存的是"hello"在字符串常量池中的地址 String s1 = "hello"; String s2 = "hello"; //在堆中創建了對象 //m,n分別存的是他們在堆中對象的地址 String m = new String("你好!"); String n = new String("你好!"); System.out.println(s1 == s2);//結果為true System.out.println(m == n);//結果為false } }
//String類構造方法的使用 public class StringTest02 { public static void main(String[] args) { byte []x1 = { 97 , 98 , 99 }; char []x2 = {'我','是','中','國','人'}; //String s = new String(byte數組); String y1 = new String(x1); System.out.println(y1);//ABC //String s = new String(byte數組,偏移量,長度) String y2 = new String(x1,1,2); System.out.println(y2);//BC //String s = new String(char數組) String y3 = new String(x2); System.out.println(y3);//我是中國人 //String s = new String(char數組,偏移量,長度) String y4 = new String(x2,2,3); System.out.println(y4);//中國人 } }
public class StringTest03 { public static void main(String[] args) { //public char charAt(int index)方法 //返回索引值處的char類型字符 char s1 = "中國人".charAt(1); System.out.println(s1);//國 //public int compareTo(String anotherString)方法 //按字典序比較兩個字符串 System.out.println("abc".compareTo("abd"));//負整數 System.out.println("abc".compareTo("abc"));//0 System.out.println("abc".compareTo("abb"));//正整數 //public boolean contains(CharSequence s)方法 //判斷字符串是否包含s System.out.println("abcdefg".contains("efg"));//true System.out.println("abcdefg".contains("hij"));//false //public boolean endsWith(String suffix)方法 //判斷字符串是否以suffix結尾 System.out.println("abcde".endsWith("cde"));//true System.out.println("abcde".endsWith("qwe"));//false //public boolean equalsIgnoreCase(String anotherString) 方法 //判斷兩個字符串是否相等,忽略大小寫 System.out.println("ABcd".equalsIgnoreCase("abCD"));//true //public byte[] getBytes() //將字符串轉換成byte數組,并返回 byte [] s2 = "abcdefg".getBytes(); for (int i = 0; i < s2.length; i++) { System.out.print(s2[i] + " "); }//97 98 99 100 101 102 103 //public int indexOf(String str) //判斷某個子字符串在當前字符串中第一次出現處的索引 //若子字符串不存在,返回-1 System.out.println("abcdefghigk".indexOf("hig"));//7 System.out.println("abc".indexOf("fgh"));//-1 //public int lastIndexOf(String str) //判斷某個子字符串最后一次出現在當前字符串中的索引 System.out.println("abcdhdhdabc".lastIndexOf("abc"));//8 //public boolean isEmpty() //判斷字符串是否為空串 //底層調用length()方法,空串長度為0 //注意:判斷數組長度是length屬性,判斷字符串長度是length()方法 System.out.println("".isEmpty());//true //public String replace(char oldChar,char newChar) //返回一個將原字符串中所有的oldChar替換為newChar的新字符串,不改變原字符串 String s3 = "aaatttooo"; System.out.println( s3.replace('t','q'));//aaaqqqooo //public String replace(CharSequence target,CharSequence replacement) //CharSequence可以看出String //將原字符串中的 target 全部換成 replacement String s4 = "abcsgdjsssjabcjdjjdjabc"; System.out.println(s4.replace("abc","www"));//wwwsgdjsssjwwwjdjjdjwww //public String[] split(String regex) //以regex為分界線,將字符串分割保存在一個字符串數組當中,并返回 String s5 = "2022-3-19"; String [] str = s5.split("-"); System.out.println(str[0] + str[1] + str[2]);//2022319 //public String substring(int beginIndex) //返回一個以索引beginIndex開始直至結尾的字符串 System.out.println("abcdefgh".substring(4));//efgh //public String substring(int beginIndex,int endIndex) //返回一個以索引值beginIndex開始,以索引值endIndex結束(不包含該索引值處的字符)的子字符串 System.out.println("abcdefgh".substring(2,5));//cde //public char[] toCharArray() //將一個字符串以字符數組的形式返回 char[] str2 = "abcdefg".toCharArray(); for(int i = 0 ; i < str2.length ; i++){ System.out.println(str2[i]); } //public String toLowerCase() //返回一個將原字符串中所有字符變成小寫的新字符串 System.out.println("ABcDeFG".toLowerCase());//abcdefg //public String toUpperCase() //返回一個將原字符串中所有字符變成大寫的新字符串 System.out.println("aCbcdEfg".toUpperCase());//ABCDEFG //public String trim() // 返回一個去除字符串的前后空白(空格)的新字符串 System.out.println(" abcdefg ".trim());//abcdefg //public static String valueOf(參數列表) //參數列表可以是int型,char型,int數組,對象 等等....... //String類中唯一一個靜態方法,可以直接調用 //將非字符串轉換為字符串 //println()底層調用的就是valueOf()方法,只要是打印在控制臺上的都是字符串 System.out.println(String.valueOf(true)); } }
思考:
頻繁使用字符串拼接會有什么影響?
java中字符串是不可變的,每拼接一次都會產生一個新的字符串
字符串是存在字符串常量池中的,頻繁使用字符串拼接會占用大量的方法區空間
為了避免以上問題我們就可以使用到StringBuffer類
//java.lang.StringBuffer public class StringBufferTest { public static void main(String[] args) { //創建一個初始化容量為16個 byte[] 數組(字符串緩沖區對象) StringBuffer strBuffer = new StringBuffer(); //拼接字符串調用 append()方法 //append()方法底層會調用 System.arraycopy()方法,效率較低 //append()再追加時,如果byte[]滿了之后會自動擴容 strBuffer.append(1); strBuffer.append('q'); strBuffer.append(3.14); strBuffer.append("abc"); System.out.println(strBuffer);//1q3.14abc //StringBuffer可以進行一定的優化 //在創建StringBuffer時盡可能可能給定一個合適的初始化容量 //從而減少底層數組的擴容次數 //指定初始化容量的字符串緩沖區 StringBuffer newstrBuffer = new StringBuffer(100); } }
它的用法與StringBuffer十分相似,但是也有很大的區別:
StringBuffer中的方法都有synchronized關鍵字修飾,表示StringBuffer在多線程編譯環境下是安全的
StringBuilder中方法沒有synchronized關鍵字修飾,表示StringBuilder在多線程編譯環境下是不安全的
到此,關于“Java中String類、StringBuffer和StringBuilder怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。