自动化测试学习之路--java String、StringBuilder
Java中的String和StringBuilder類:
1.String對象是不可變的。每一個看起來修改了String值的方法,實際上都是創建了全新的String對象。代碼示例如下:
String str12="abc";str12.toUpperCase();System.out.println(str12);上面程序輸出結果為 abc
str12.toUpperCase();該方法是將str12大寫,但實際上是給大寫之后的字符串重新開辟了空間,絲毫不會影響str12的值。在計算機的程序設計中,對字符串的操作是非常頻繁的。為了提高效率,不會為每一個字符串都開辟空間。相當于一個“拘留池”,創建的字符串變量都存儲在拘留池中,當有新的String變量時,jdk會先判斷
一下,拘留池中是否已經存在該字符串。如果有,直接將變量的引用指向該字符串,如果沒有才會去開辟空間。
注意:
這個拘留池效應,只針對非new出來的字符串,如果是String str=new String("abc");那么不管拘留池中是否已經存在“abc”這個字符串,都會給重新開辟空間。因為這個語句的執行順序是:先為abc開辟
一個空間,然后再將str這個引用指向這個空間。
2.我們在程序中經常會寫
System.out.println("a"+1+"b");這里深入講解一下,重載操作符“+”;
1.println()是將括號內的值轉換成string字符串,然后輸出的。其實就是去調用toString()方法。
2.當有"+"這個重載操作符的時候,編譯器會自動創建StringBuilder對象來處理括號內的字符串操作。
這里稍微分析下,為什么編譯器會這么干:因為String是不可變的,當我們每次給字符串“a”連接一個字符串“b”的時候,必然需要重新開辟一個新的空間,然后將值copy進去。效率低,還會產生需要垃圾回收的一系列對象。因此這里最好使用可變的StringBuilder對象來處理。
3.這里介紹下StringBuilder:
它是可變的,當需要增加某個字符串長度的時候,直接append就可以了。
當使用StringBuilder str=new StringBuilder()這個無參構造函數來創建StringBuilder對象的時候,會默認創建長度為16的char[]類型的數組。當你調用append()方法追加的字符串長度大于16的時候(str.length=19),就會需要重新開辟空間。此時內部會將value的值左移+2(如當前是16,二級制是10000,左移之后就是100000(對應10進制數是32),32+2=34),比較value左移+2的值與當前字符串長度與新追加的字符串長度之和,誰的值比較大就取這個大的值去開辟相應的空間長度。
因為默認開辟的空間只有16個字符大小,在我們還用StringBuilder對象的時候,如果超出這個長度就需要重新開辟空間,就失去了StringBuilder的優勢。所以,當我們可以大致確定所需要的字符串長度時,建議使用StringBuilder(XXX)這個構造函數,用來減少重新分配的次數,提升性能。
?
轉載于:https://www.cnblogs.com/clairejing/p/9247068.html
總結
以上是生活随笔為你收集整理的自动化测试学习之路--java String、StringBuilder的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ZJOI2008] 树的统计(树链剖分
- 下一篇: 客户端检测的含义和方法