Java的知识点21——String类、StringBuffer和StringBuilder、不可变和可变字符序列使用陷阱
String類
String 類對象代表不可變的Unicode字符序列,因此我們可以將String對象稱為“不可變對象”
substring()是對字符串的截取操作,但本質是讀取原字符串內容生成了新的字符串。
String測試代碼
package cn.dym10;public class test02 {public static void main(String[] args) {String s1=new String("abcdef");String s2=s1.substring(2,4);System.out.println(Integer.toHexString(s1.hashCode()));// 打印:c61, 顯然s1和s2不是同一個對象System.out.println(Integer.toHexString(s2.hashCode()));} }?在遇到字符串常量之間的拼接時,編譯器會做出優化,即在編譯期間就會完成字符串的拼接。因此,在使用==進行String對象之間的比較時,需要特別注意
字符串常量拼接時的優化
package cn.dym10;public class test03 {public static void main(String[] args) {//編譯器做了優化,直接在編譯的時候將字符串進行拼接String str1="hello"+" java"; //相當于str1="hello java"String str2="hello java";System.out.println(str1==str2);String str3="hello";String str4=" java";//編譯的時候不知道變量中存儲的是什么,所以沒有辦法在編譯的時候優化String str5=str3+str4;System.out.println(str2==str5);} }String類常用的方法有:
? ? ? 1. String類的下述方法能創建并返回一個新的String對象: concat()、 replace()、substring()、 toLowerCase()、 toUpperCase()、trim()。
? ? ??2. 提供查找功能的有關方法: endsWith()、 startsWith()、 indexOf()、lastIndexOf()。
? ? ??3. 提供比較功能的方法: equals()、equalsIgnoreCase()、compareTo()。
? ? ??4. 其它方法: charAt() 、length()。
StringBuffer和StringBuilder
?StringBuffer和StringBuilder非常類似,均代表可變的字符序列。 這兩個類都是抽象類?AbstractStringBuilder 的子類,方法幾乎一模一樣。
? ? ??1.?StringBuffer JDK1.0版本提供的類,線程安全,做線程同步檢查, 效率較低。
? ? ??2. StringBuilder JDK1.5版本提供的類,線程不安全,不做線程同步檢查,因此效率較高。
常用方法列表:
? ? ??1. 重載的public StringBuilder append(“xxx”)方法
? ? ? ??可以為該StringBuilder 對象添加字符序列,仍然返回自身對象。
? ? ??2. 方法 public StringBuilder delete(int start,int end)
? ? ? ??可以刪除從start開始到end-1為止的一段字符序列,仍然返回自身對象。
? ? ??3. 方法 public StringBuilder deleteCharAt(int index)
? ? ? ??移除此序列指定位置上的 char,仍然返回自身對象。
? ? ??4. 重載的public StringBuilder insert(int index,“xxx”)方法
? ? ? ??可以為該StringBuilder 對象在指定位置插入字符序列,仍然返回自身對象。
? ? ??5. 方法 public StringBuilder reverse()
? ? ? ??用于將字符序列逆序,仍然返回自身對象。
? ? ??6. 方法 public String toString() 返回此序列中數據的字符串表示形式。
? ? ??7. 和 String 類含義類似的方法:
public int indexOf(String str) public int indexOf(String str,int fromIndex) public String substring(int start) public String substring(int start,int end) public int length() char charAt(int index)StringBuffer/StringBuilder基本用法:?
package cn.dym10;public class TestStringBufferAndBuilder {public static void main(String[] args) {/**StringBuilder*/StringBuilder sb=new StringBuilder();for(int i=0;i<7;i++) {sb.append((char)('a'+i)); //追加單個字符}System.out.println(sb.toString());//轉換成String輸出sb.append(",I can sing my abc!");System.out.println(sb.toString());/**StringBuffer*/StringBuffer sb2=new StringBuffer("中華人民共和國");sb2.insert(0,"愛").insert(0, "我");System.out.println(sb2);sb2.delete(0,2);//刪除子字符串System.out.println(sb2);sb2.deleteCharAt(0).deleteCharAt(0);//刪除某個字符System.out.println(sb2.charAt(0));System.out.println(sb2.reverse());}}不可變和可變字符序列使用陷阱
String使用的陷阱:String一經初始化后,就不會再改變其內容了。對String字符串的操作實際上是對其副本(原始拷貝)的操作,原來的字符串一點都沒有改變。比如:
? ? ??String s ="a"; 創建了一個字符串
? ? ??s = s+"b"; 實際上原來的"a"字符串對象已經丟棄了,現在又產生了另一個字符串s+"b"(也就是"ab")。 如果多次執行這些改變串內容的操作,會導致大量副本字符串對象存留在內存中,降低效率。如果這樣的操作放到循環中,會極大影響程序的時間和空間性能,甚至會造成服務器的崩潰。
? ? ??相反,StringBuilder和StringBuffer類是對原字符串本身操作的,可以對字符串進行修改而不產生副本拷貝或者產生少量的副本。因此可以在循環中使用。
String和StringBuilder在頻繁字符串修改時效率測試:
package cn.dym10;public class test04 {public static void main(String[] args) {//使用String進行字符串的拼接String str8="";//本質上使用StringBuilder拼接,但是每次循環都會產生一個StringBuilder對象long num1=Runtime.getRuntime().freeMemory(); //獲取系統剩余內存空間long time1=System.currentTimeMillis();//獲取系統的當前時間for(int i=0;i<5000;i++) {str8=str8+i;//相當于產生了5000個對象}long num2=Runtime.getRuntime().freeMemory();long time2=System.currentTimeMillis();System.out.println("String占用內存:"+(num1-num2));System.out.println("String占用時間:"+(time2-time1)); //使用StringBuilder進行字符串的拼接StringBuilder sb1=new StringBuilder("");long num3=Runtime.getRuntime().freeMemory();long time3=System.currentTimeMillis();for(int i=0;i<5000;i++) {sb1.append(i);}long num4=Runtime.getRuntime().freeMemory();long time4=System.currentTimeMillis();System.out.println("StringBuilder占用內存:"+(num3-num4));System.out.println("StringBuilder占用時間:"+(time4-time3)); } }要點:
? ? ??1. String:不可變字符序列。
? ? ??2. StringBuffer:可變字符序列,并且線程安全,但是效率低。
? ? ??3. StringBuilder:可變字符序列,線程不安全,但是效率高(一般用它)
總結
以上是生活随笔為你收集整理的Java的知识点21——String类、StringBuffer和StringBuilder、不可变和可变字符序列使用陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的知识点20——包装类基本知识、
- 下一篇: Java的知识点22——时间处理相关类、