String,StringBuffer,StringBuillder的一些底层实现
生活随笔
收集整理的這篇文章主要介紹了
String,StringBuffer,StringBuillder的一些底层实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、StringBuffer
-
線程安全
通過synchronized來保證多線程下的數據安全。
- 底層通過 char[] 數組實現
- 添加字符串的過程
-->先檢查內部char[]數組是否需要擴容
-->如需要擴容則進行擴容,然后將原來元數據copy到新數組中。
-->再將新添加的元數據加入到新char[]數組中
public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();//檢查char[]數組是否需要擴容,擴容,并將原來的數據copy進去新擴容的數組中ensureCapacityInternal(count + len);//將新添加的數據添加到StringBuilder中的char[]數組中,實現字符串的添加str.getChars(0, len, value, count);count += len;return this;}/** *元數組char[]的擴容過程 */void expandCapacity(int minimumCapacity) {int newCapacity = value.length * 2 + 2;if (newCapacity - minimumCapacity < 0)newCapacity = minimumCapacity;if (newCapacity < 0) {if (minimumCapacity < 0) // overflowthrow new OutOfMemoryError();newCapacity = Integer.MAX_VALUE;}value = Arrays.copyOf(value, newCapacity);}/** *擴容實現 */public static char[] copyOf(char[] original, int newLength) {char[] copy = new char[newLength];System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));return copy;} 復制代碼StringBuilder
-
線程非安全的字符串操作類
-
字符串的添加沒有加同步處理,涉及到數組擴容,容易產生臟數據,破壞數據正確性
-
底層結構和StringBuffer實現基本一樣,只是沒有做同步處理。
String
-
String類沒有提供用于修改字符串的方法。
-
String類對象為不可變字符串,如字符串string=”HELLO”永遠只包含HELLO這幾個字母,而不能修改其中任何一個字符。當然可以修改字符串變量string的引用,讓它引用另一個字符串。
不可變字符串有一個優點:編譯器可以讓字符串實現共享。實際上只有字符串常量(使用“ ”聲明,存儲在字符串常量池中)是共享的,subStrng,+等操作產生的結果不能共享。 比較字符串值是否相等時使用equals()方法,不能使用==,==比較的是字符串的地址是否相同。如果字符串在常量池中,可以使用==比較,因為指向的都是同一個字符串。 復制代碼
4.三者在執行速度方面的比較:StringBuilder > StringBuffer > String
5.Test.java
public class Test {public static void main(String[] args) { // String a="abc"; // String b=new String(a); // //【true】a和b比較的是內容。便利各自的char[]數組進行比較 // System.out.println("a和b比較==>"+a.equals(b)); // //【false】 a和b比較的是地址。a在常量池中 b在堆內存中 // System.out.println("a和b比較==>"+a==b);test02();}public static void test01(){/*** 你會很驚訝的發現,生成str對象的速度簡直太快了,而這個時候StringBuffer居然速度上根本一點都不占優勢。其實這是JVM的一個把戲,實際上:String str = “This is only a” + “ simple” + “test”;其實就是:String str = “This is only a simple test”;所以不需要太多的時間了。但大家這里要注意的是,如果你的字符串是來自另外的String對象的話,速度就沒那么快了,譬如:String str2 = “This is only a”;String str3 = “ simple”;String str4 = “ test”;String str1 = str2 +str3 + str4;這時候JVM會規規矩矩的按照原來的方式去做。*/}public static void test02(){//string3指向常量池中的字符串second//string4指向堆中的字符串second//所以值相同,引用不同String string3="second";String string4=new String("second");System.out.println(string3==string4);System.out.println(string3.equals(string4));//string5指向常量池中的字符串third//string6一開始指向堆中的字符串third,但是調用intern()方法之后,且該方法調用時先檢查常量池中是否有值為string6//的字符串,如果有則返回該字符串的引用,否則在常量池中創建該字符串,并返回引用//所以一開始引用不相等,后來相等String string5="third";String string6=new String("third");System.out.println(string5==string6);string6=string6.intern();System.out.println(string5==string6);} } 復制代碼轉載于:https://juejin.im/post/5b7e7ed651882542e90bffee
總結
以上是生活随笔為你收集整理的String,StringBuffer,StringBuillder的一些底层实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小菜鸡进阶之路_Second week之
- 下一篇: window.open()新开浏览器窗口