日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java的知识点21——String类、StringBuffer和StringBuilder、不可变和可变字符序列使用陷阱

發布時間:2025/4/16 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

?StringBufferStringBuilder非常類似,均代表可變的字符序列。 這兩個類都是抽象類?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、不可变和可变字符序列使用陷阱的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。