[轉載] 整理下java中stringBuilder和stringBuffer兩個類的區別

參考鏈接: Java中的StringBuffer類

StringBuilder和StringBuffer這兩個類在動態拼接字符串時常用,肯定比String的效率和開銷小,這是因為String的對象不會回收哦。?

?其實我一直用StringBuilder這個類,因為可以簡寫為sb的變量在程序里很爽,可是后來師兄說web程序特別是高并發的程序中不要用stringbuilder,因為簡單說,stringBuilder不是線程安全的,而StirngBuffer就是線程安全的。從網上看到Stringbuffer中方法大都采用了synchronized的關鍵字修飾。?

?來來來,我們先復習下syncronized的用法,有篇博客寫的挺好的,給個鏈接 http://leo-faith.iteye.com/blog/177779?

??

?

? 1、synchronized關鍵字的作用域有二種: 1)是某個對象實例內,synchronized aMethod(){}可以防止多個線程同時訪問這個對象的synchronized方法(如果一個對象有多個synchronized方法,只要一個線程訪問了其中的一個synchronized方法,其它線程不能同時訪問這個對象中任何一個synchronized方法)。這時,不同的對象實例的synchronized方法是不相干擾的。也就是說,其它線程照樣可以同時訪問相同類的另一個對象實例中的synchronized方法; 2)是某個類的范圍,synchronized static aStaticMethod{}防止多個線程同時訪問這個類中的synchronized static 方法。它可以對類的所有對象實例起作用。

?

? ?

?

? 2、除了方法前用synchronized關鍵字,synchronized關鍵字還可以用于方法中的某個區塊中,表示只對這個區塊的資源實行互斥訪問。用法是: synchronized(this){/*區塊*/},它的作用域是當前對象;

?

?

?

? 3、synchronized關鍵字是不能繼承的,也就是說,基類的方法synchronized f(){} 在繼承類中并不自動是synchronized f(){},而是變成了f(){}。繼承類需要你顯式的指定它的某個方法為synchronized方法;

?

?好了,言歸正傳,我們繼續StringBuffer和StringBuilder的區別。?

?就是說,StringBuffer中所有的方法都要加鎖,所以好多操作看上去都是線性操作的。所以要慢些。?

??

?

? 一般情況下,速度從快到慢:StringBuilder>StringBuffer>String.當需要在循環中多次使用字符串拼接時,建議使用StringBuilder或StringBuffer.當數量級在百萬級(這里可能不準確)時,StringBuilder的速度會體現出來.

?

?

以下是實驗數據?

??

??

?

??

? ?

? ? 01 final static int ttime = 30000;// 測試循環次數?

? ?

? ?

? ? 02? ?

? ?

? ?

? ? 03? ? ?public void test(String s) {?

? ?

? ?

? ? 04? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 05? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 06? ? ? ? ? ? ?s += "add";?

? ?

? ?

? ? 07? ? ? ? ?}?

? ?

? ?

? ? 08? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 09? ? ? ? ?System.out.println(" 操作 " + s.getClass().getName() + " 類型使用的時間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 10? ? ?}?

? ?

? ?

? ? 11? ?

? ?

? ?

? ? 12? ? ?public void test(StringBuffer s) {?

? ?

? ?

? ? 13? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 14? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 15? ? ? ? ? ? ?s.append("add");?

? ?

? ?

? ? 16? ? ? ? ?}?

? ?

? ?

? ? 17? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 18? ? ? ? ?System.out.println(" 操作 " + s.getClass().getName() + " 類型使用的時間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 19? ? ?}?

? ?

? ?

? ? 20? ?

? ?

? ?

? ? 21? ? ?public void test(StringBuilder s) {?

? ?

? ?

? ? 22? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 23? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 24? ? ? ? ? ? ?s.append("add");?

? ?

? ?

? ? 25? ? ? ? ?}?

? ?

? ?

? ? 26? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 27? ? ? ? ?System.out.println(" 操作 " + s.getClass().getName() + " 類型使用的時間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 28? ? ?}?

? ?

? ?

? ? 29? ?

? ?

? ?

? ? 30? ? ?// 對 String 直接進行字符串拼接的測試?

? ?

? ?

? ? 31? ? ?public void test2() {?

? ?

? ?

? ? 32? ? ? ? ?String s2 = "abadf";?

? ?

? ?

? ? 33? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 34? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 35? ? ? ? ? ? ?String s = s2 + s2 + s2;?

? ?

? ?

? ? 36? ? ? ? ?}?

? ?

? ?

? ? 37? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 38? ? ? ? ?System.out.println(" 操作字符串對象引用相加類型使用的時間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 39? ? ?}?

? ?

? ?

? ? 40? ?

? ?

? ?

? ? 41? ? ?public void test3() {?

? ?

? ?

? ? 42? ? ? ? ?long begin = System.currentTimeMillis();?

? ?

? ?

? ? 43? ? ? ? ?for (int i = 0; i < ttime; i++) {?

? ?

? ?

? ? 44? ? ? ? ? ? ?String s = "abadf" + "abadf" + "abadf";?

? ?

? ?

? ? 45? ? ? ? ?}?

? ?

? ?

? ? 46? ? ? ? ?long over = System.currentTimeMillis();?

? ?

? ?

? ? 47? ? ? ? ?System.out.println(" 操作字符串相加使用的時間為: " + (over - begin) + " 毫秒 ");?

? ?

? ?

? ? 48? ? ?}?

? ?

? ?

? ? 49? ?

? ?

? ?

? ? 50? ? ?public static void main(String[] args) {?

? ?

? ?

? ? 51? ? ? ? ?String s1 = "abc";?

? ?

? ?

? ? 52? ? ? ? ?StringBuffer sb1 = new StringBuffer("abc");?

? ?

? ?

? ? 53? ? ? ? ?StringBuilder sb2 = new StringBuilder("abc");?

? ?

? ?

? ? 54? ? ? ? ?Test t = new Test();?

? ?

? ?

? ? 55? ? ? ? ?t.test(s1);?

? ?

? ?

? ? 56? ? ? ? ?t.test(sb1);?

? ?

? ?

? ? 57? ? ? ? ?t.test(sb2);?

? ?

? ?

? ? 58? ? ? ? ?t.test2();?

? ?

? ?

? ? 59? ? ? ? ?t.test3();?

? ?

? ?

? ? 60? ? ?}?

? ?

??

?

??

試驗結果如下:?

??

??

? 操作 java.lang.String 類型使用的時間為: 2432 毫秒??

? 操作 java.lang.StringBuffer 類型使用的時間為: 3 毫秒??

? 操作 java.lang.StringBuilder 類型使用的時間為: 3 毫秒??

? 操作字符串對象引用相加類型使用的時間為: 6 毫秒??

? 操作字符串相加使用的時間為: 1 毫秒??

??

?把循環次數調的很大,試了用下jconsle來監視內存GC,第一次使用,不太明白,有個博客寫的很好的,有空研究一下?

? http://jiajun.iteye.com/blog/810150?

?再補充一個Jstat的工具 http://xiaolele.iteye.com/blog/592022?

?/**?

?*20120516昨天忘看源代碼了?

?**/?

?StringBuffer中append方法有很多重載,有synchronized關鍵字沒錯,主要調用的還是AbstractStringBuilder的super的方法。?

??

?

??

? ?

? ? 1 public synchronized StringBuffer append(String s)?

? ?

? ?

? ? 2 {?

? ?

? ?

? ? 3? ? ?super.append(s);?

? ?

? ?

? ? 4? ? ?return this;?

? ?

? ?

? ? 5 }?

? ?

??

?

??

父類的方法為?

??

?

??

? ?

? ? 01 public AbstractStringBuilder append(String s) {?

? ?

? ?

? ? 02? ?

? ?

? ?

? ? 03? ? ?if (s == null)?

? ?

? ?

? ? 04? ? ? ? ?s = "null";?

? ?

? ?

? ? 05? ? ?int i = s.length();?

? ?

? ?

? ? 06? ? ?if (i == 0)?

? ?

? ?

? ? 07? ? ? ? ?return this;?

? ?

? ?

? ? 08? ? ?int j = count + i;?

? ?

? ?

? ? 09? ? ?if (j > value.length)?

? ?

? ?

? ? 10? ? ? ? ?expandCapacity(j);?

? ?

? ?

? ? 11? ? ?s.getChars(0, i, value, count);?

? ?

? ?

? ? 12? ? ?count = j;?

? ?

? ?

? ? 13? ? ?return this;?

? ?

? ?

? ? 14 }?

? ?

??

?

??

??

?StringBuilder類中的append就沒有同步的關鍵字了。父類的方法基本上差不多。?

?總結一下,StringBuffer線程安全,內部有synchronized方法,StringBuilder是1.5之后出來的,高并發就不要用了。另外synchronized的使用要熟悉,以后研究下java內存的工具,比如jconsle。?

? ?

?轉載:http://my.oschina.net/zimingforever/blog/57514

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540226.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540226.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540226.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

11.13 模10計數器設計

.新建一個工程 Family&#xff1a;FLEX10K Available device&#xff1a;EPF10K20TC144-3 2.設置lpm_counter宏單元參數并連接引腳 連接引腳的時候要注意的是&#xff0c;向量線的連接。 3.時序仿真 檢查無誤后進行下一步 4.載入7448并進行引腳連接 5.分配管腳 再次編譯&#x…

[轉載] java對象在內存中的結構

參考鏈接&#xff1a; 了解Java中的類和對象 今天看到一個不錯的PPT&#xff1a;Build Memory-efficient Java Applications&#xff0c;開篇便提出了一個問題&#xff0c;在Hotspot JVM中&#xff0c;32位機器下&#xff0c;Integer對象的大小是int的幾倍&#xff1f; 我們…

使用valueOf前必須進行校驗

每個枚舉都是java.lang.Enum的子類,都可以訪問Enum類提供的方法,比如hashCode(),name(),valueOf()等..... 其中valueOf()方法會把一個String類型的名稱轉變為枚舉項,也就是枚舉項中查找出字面值與該參數相等的枚舉項,雖然這個方法很簡單,但是JDK卻做了一個對于開發人員來說并不…

[轉載] 【Java】Java基礎知識及其擴展筆記(8千字)

參考鏈接&#xff1a; Java中的StringBuilder類及其示例 Java基礎知識及其擴展筆記 零 l 寫在前面一 l JVM1、【1.1.2.1】java程序運行的一般流程2、【1.1.2.1】JVM一般運行流程3、【1.1.2.1】JIT&#xff08;just in time 即時編譯編譯器&#xff09;4、堆與棧 二 l Java …

多IDC GSLB的部署

之前已經介紹過GSLB的實現原理&#xff0c;這里再向大家講述一下GSLB經常遇到的部署方式&#xff0c;多IDC的部署。很多大型的企業或業務容災要求非常高的客戶都會部署有多個異地的數據中心&#xff0c;以保證其業務的“全天候”不間斷的正常運行&#xff0c;而要整合多個IDC的…

[轉載] Controller報錯:java.lang.NoSuchMethodException: java.util.List.<init>()

參考鏈接&#xff1a; Java8中的java.util.StringJoiner 報錯詳情&#xff1a; java.lang.NoSuchMethodException: java.util.List.<init>() 以及 No primary or default constructor found for interface java.util.List 示例&#xff1a; /** * 此接口會產生以…

[轉載] 算法競賽中的JAVA使用筆記

參考鏈接&#xff1a; Java中StringTokenizer類的示例| 1(構造函數) 算法競賽中的JAVA使用筆記 算法競賽中的JAVA使用筆記 輸入與輸出 基本輸入輸入掛輸出控制臺輸入輸出重定向到文件 大整數與高精度 大整數BigInteger高精度BigDecimal高精度開方 字符串與進制轉換 字符串基本…

信息系統開發平臺OpenExpressApp:【OpenTest】 之 語法及其使用介紹

在OpenTest 之 運行環境準備中介紹了運行自動化測試需要做的一些準備工作&#xff0c;本篇將繼續給大家介紹OpenTest的腳本語法以及使用方法&#xff0c;通過學習后讀者應該能夠開始動手編寫UI自動化測試腳本了。 關鍵字驅動測試 在學習語法之前&#xff0c;需要了解一下關鍵字…

[轉載] java常量池-字符串常量池、class常量池和運行時常量池

參考鏈接&#xff1a; 如何在Java中初始化和比較字符串 原文鏈接&#xff1a;http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/ 在java的內存分配中&#xff0c;經常聽到很多關于常量池的描述&#xff0c;我開始看的時候也是看的很模糊&#xff0c…

Oracle 10g 高級安裝圖文教程(二)

第八步&#xff1a;為了簡便起見&#xff08;工作中肯定不安全&#xff09;&#xff0c;選擇“所有的帳戶都是用同一個口令”&#xff0c;并輸入口令&#xff0c;點擊“下一步”&#xff1a;本文轉自 victoryan 51CTO博客&#xff0c;原文鏈接:http://blog.51cto.com/victoryan…

[轉載] StringBuffer和StringBuilder類

參考鏈接&#xff1a; Java中的String vs StringBuilder vs StringBuffer 下述文章資料來源于&#xff1a; W3CSCHOOL離線版的Java教程 Java JDK 6.0開發手冊 Java開發從入門到精通(陳小玉版) StringBuffer和String選擇的異同 StringBuffer在進行字符串處理時&#xff0c;不…

sharepoint 2007功能增強解決方案,資料收集

一、關于QuickFlow&#xff0c;sharepoint可視化工作流增強包 http://www.cnblogs.com/jianyi0115/tag/QuickFlow/default.html?page1 http://quickflow.codeplex.com/ 二、關于SharePoint Permission Extension&#xff0c;視圖、列表字段權限功能增強 http://sppex.codeplex…

[轉載] 面試題:說說Java中接口、類、成員變量、成員方法、構造方法有哪些訪問修飾符和他們的作用范圍

參考鏈接&#xff1a; Java中的訪問修飾符 * 問題&#xff1a;說說Java中接口、類、成員變量、成員方法、構造方法有哪些訪問修飾符和他們的作用范圍 * 答&#xff1a;接口的訪問修飾符只有public 1個 * 類的訪問修飾符有public和默認(就是不寫的)2個 * 成員方法的訪問修…

使用IHttpHandler做權限控制[ASP.NET | IHttpHandler | AjaxPro | UserHostName]

正文 Web.Config配置如下: <add verb"POST,GET"path"/page/*.aspx,/page/*/*.aspx,/page/*/*/*.aspx,/page/*/*/*/*.aspx,/page/*/*/*/*/*.aspx"type"WebLibrary.PowerManage.HttpHanderPowerControls"/> 整個IHttpHandler實現代碼如下: /…

[轉載] Java 中字符串轉整型和整型轉字符串

參考鏈接&#xff1a; Java中的字符串到整數– parseInt() Java 中字符串轉整型和整型轉字符串 1.字符串轉整型Java代碼&#xff0c;字符串為純數字的情況下&#xff0c;調用Integer的靜態方法parseInt或者valueOfJava代碼&#xff0c;如果單個字符或字符串&#xff0c;需要切…

Gram matrix 格拉姆矩陣

2019獨角獸企業重金招聘Python工程師標準>>> Gram matrix 度量各個維度自己的特性以及各個維度之間的關系。 來自&#xff1a;https://www.zhihu.com/question/49805962?fromprofile_question_card 由感知機&#xff08;對偶感知機中需要計算樣本點兩兩之間的內積和…

[轉載] 用Java語言實現對十六進制字符串異或運算

參考鏈接&#xff1a; 交換兩個字符串&#xff0c;而無需在Java中使用第三個用戶定義的變量 前言&#xff1a;好久沒有寫博客&#xff0c;最近一年感覺真是好忙&#xff0c;各種做不完的工作。相信很多上班族都會有這種感覺。最近對NFC進行寫卡操作&#xff0c;需要計算一個校…

MySQL日常應用操作記錄

1.知道一個字段名&#xff0c;怎樣查到它在數據庫里的哪張表里&#xff1f; USE Information_schema;SELECT TABLE_NAME FROM COLUMNS WHERE COLUMN_NAME字段名稱; MySQL中查看庫表字段信息都在information_schemal中&#xff0c;獲取數據字典等信息都要通過這個視圖。 如&…

[轉載] 【Java】將一個字符串的字符排序,按ASCII表的順序從小到大

參考鏈接&#xff1a; 在Java中搜索字符串中的字符和子字符串 將一個字符串的字符按ASCII表的順序從小到大排序&#xff0c;如將字符串“asdafxcvMADb”排序為“ADMaabcdfsvx” 算法的基本思想&#xff1a; 先將字符串轉化為一個char類型的數組&#xff0c;來進行存儲&#xf…

如果只做前端驗證的話,談jjdd.com的看照片功能。

如果你在上海&#xff0c;并且坐過地鐵的話&#xff0c;你肯定知道jjdd.com。 這個網站和百合&#xff0c;世紀佳緣類似&#xff0c;都是交朋友的性質。 在jjdd.com中有個很重要的功能&#xff1a;如果你上傳的照片比你想看的人少的話&#xff0c;你是不能看她的照片的。 例如如…