## Java編程那些事兒76——StringBuffer類和System類
陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
#### 9.5.3.2 StringBuffer類
StringBuffer類和String一樣,也用來代表字符串,只是由于StringBuffer的內部實現方式和String不同,所以StringBuffer在進行字符串處理時,不生成新的對象,在內存使用上要優于String類。
所以在實際使用時,如果經常需要對一個字符串進行修改,例如插入、刪除等操作,使用StringBuffer要更加適合一些。
在StringBuffer類中存在很多和String類一樣的方法,這些方法在功能上和String類中的功能是完全一樣的。
但是有一個最顯著的區別在于,對于StringBuffer對象的每次修改都會改變對象自身,這點是和String類最大的區別。
另外由于StringBuffer是線程安全的,關于線程的概念后續有專門的章節進行介紹,所以在多線程程序中也可以很方便的進行使用,但是程序的執行效率相對來說就要稍微慢一些。
1、StringBuffer對象的初始化
StringBuffer對象的初始化不像String類的初始化一樣,Java提供的有特殊的語法,而通常情況下一般使用構造方法進行初始化。
例如:
StringBuffer s = new StringBuffer();
這樣初始化出的StringBuffer對象是一個空的對象。
如果需要創建帶有內容的StringBuffer對象,則可以使用:
StringBuffer s = new StringBuffer(“abc”);
這樣初始化出的StringBuffer對象的內容就是字符串”abc”。
需要注意的是,StringBuffer和String屬于不同的類型,也不能直接進行強制類型轉換,下面的代碼都是錯誤的:
~~~
???????? StringBuffer s = “abc”;??? ???????????//賦值類型不匹配
???????? StringBuffer s = (StringBuffer)”abc”;??? //不存在繼承關系,無法進行強轉
StringBuffer對象和String對象之間的互轉的代碼如下:
???????? String s = “abc”;
???????? StringBuffer sb1 = new StringBuffer(“123”);
???????? StringBuffer sb2 = new StringBuffer(s);?? //String轉換為StringBuffer
???????? String s1 = sb1.toString();????????????? //StringBuffer轉換為String
???????? 2、StringBuffer的常用方法
~~~
StringBuffer類中的方法主要偏重于對于字符串的變化,例如追加、插入和刪除等,這個也是StringBuffer和String類的主要區別。
a、append方法
public StringBuffer append(boolean b)
該方法的作用是追加內容到當前StringBuffer對象的末尾,類似于字符串的連接。調用該方法以后,StringBuffer對象的內容也發生改變,例如:
???????? ???????? StringBuffer sb = new StringBuffer(“abc”);
?????????????????? sb.append(true);
???????? 則對象sb的值將變成”abctrue”。
使用該方法進行字符串的連接,將比String更加節約內容,例如應用于數據庫SQL語句的連接,例如:
?????????????????? StringBuffer sb = new StringBuffer();
?????????????????? String user = “test”;
?????????????????? String pwd = “123”;
?????????????????? sb.append(“select * from userInfo where username=“)
?????????????????? ? .append(user)
?????????????????? ? .append(“ and pwd=”)
?????????????????? ? .append(pwd);
這樣對象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。
b、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
該方法的作用是刪除指定位置的字符,然后將剩余的內容形成新的字符串。例如:
???????? StringBuffer sb = new StringBuffer(“Test”);
???????? sb. deleteCharAt(1);
該代碼的作用刪除字符串對象sb中索引值為1的字符,也就是刪除第二個字符,剩余的內容組成一個新的字符串。所以對象sb的值變為”Tst”。
還存在一個功能類似的delete方法:
public StringBuffer delete(int start,int end)
該方法的作用是刪除指定區間以內的所有字符,包含start,不包含end索引值的區間。例如:
???????? StringBuffer sb = new StringBuffer(“TestString”);
???????? sb. delete (1,4);
該代碼的作用是刪除索引值1(包括)到索引值4(不包括)之間的所有字符,剩余的字符形成新的字符串。則對象sb的值是”TString”。
c、insert方法
??????????????????????????? public StringBuffer insert(int offset, boolean b)
??????????????????????????? 該方法的作用是在StringBuffer對象中插入內容,然后形成新的字符串。例如:
???????????????????????????????????? StringBuffer sb = new StringBuffer(“TestString”);
???????????????????????????????????? sb.insert(4,false);
該示例代碼的作用是在對象sb的索引值4的位置插入false值,形成新的字符串,則執行以后對象sb的值是”TestfalseString”。
d、reverse方法
public StringBuffer reverse()
該方法的作用是將StringBuffer對象中的內容反轉,然后形成新的字符串。例如:
???????? StringBuffer sb = new StringBuffer(“abc”);
???????? sb.reverse();
經過反轉以后,對象sb中的內容將變為”cba”。
e、setCharAt方法
??????????????????????????? public void setCharAt(int index, char ch)
??????????????????????????? 該方法的作用是修改對象中索引值為index位置的字符為新的字符ch。例如:
???????????????????????????????????? StringBuffer sb = new StringBuffer(“abc”);
???????????????????????????????????? sb.setCharAt(1,’D’);
則對象sb的值將變成”aDc”。
f、trimToSize方法
??????????????????????????? public void trimToSize()
該方法的作用是將StringBuffer對象的中存儲空間縮小到和字符串長度一樣的長度,減少空間的浪費。
總之,在實際使用時,String和StringBuffer各有優勢和不足,可以根據具體的使用環境,選擇對應的類型進行使用。
### 9.5.4 System
System類代表系統,系統級的很多屬性和控制方法都放置在該類的內部。該類位于java.lang包。
由于該類的構造方法是private的,所以無法創建該類的對象,也就是無法實例化該類。其內部的成員變量和成員方法都是static的,所以也可以很方便的進行調用。
1、成員變量
System類內部包含in、out和err三個成員變量,分別代表標準輸入流(鍵盤輸入),標準輸出流(顯示器)和標準錯誤輸出流(顯示器)。
例如:
??????????????????????????? System.out.println(“Test”);
該行代碼的作用是將字符串”Test”輸出到系統的標準輸出設備上,也就是顯示在屏幕上。
后續在學習完IO相關的知識以后,可以使用System類中的成員方法改變標準輸入流等對應的設備,例如可以將標準輸出流輸出的信息輸出到文件內部,從而形成日志文件等。
2、成員方法
?????????????????? System類中提供了一些系統級的操作方法,這些方法實現的功能分別如下:
a、arraycopy方法
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
該方法的作用是數組拷貝,也就是將一個數組中的內容復制到另外一個數組中的指定位置,由于該方法是native方法,所以性能上比使用循環高效。
使用示例:
???????? int[] a = {1,2,3,4};
???????? int[] b = new int[5];
???????? System.arraycopy(a,1,b,3,2);
該代碼的作用是將數組a中,從下標為1開始,復制到數組b從下標3開始的位置,總共復制2個。也就是將a[1]復制給b[3],將a[2]復制給b[4],這樣經過復制以后數組a中的值不發生變化,而數組b中的值將變成{0,0,0,2,3}。
b、currentTimeMillis方法
public static long currentTimeMillis()
該方法的作用是返回當前的計算機時間,時間的表達格式為當前計算機時間和GMT時間(格林威治時間)1970年1月1號0時0分0秒所差的毫秒數。例如:
long l = System. currentTimeMillis();
則獲得的將是一個長整型的數字,該數字就是以差值表達的當前時間。
使用該方法獲得的時間不夠直觀,但是卻很方便時間的計算。例如,計算程序運行需要的時間則可以使用如下的代碼:
~~~
???????? long start = System. currentTimeMillis();
???????? for(int i = 0;i < 100000000;i++){
?????????????????? int a = 0;
???????? }
???????? long end = System. currentTimeMillis();
???????? long? time = end – start;
~~~
則這里變量time的值就代表該代碼中間的for循環執行需要的毫秒數,使用這種方式可以測試不同算法的程序的執行效率高低,也可以用于后期線程控制時的精確延時實現。
c、exit方法
public static void exit(int status)
該方法的作用是退出程序。其中status的值為0代表正常退出,非零代表異常退出。使用該方法可以在圖形界面編程中實現程序的退出功能等。
d、gc方法
public static void gc()
該方法的作用是請求系統進行垃圾回收。至于系統是否立刻回收,則取決于系統中垃圾回收算法的實現以及系統執行時的情況。
e、getProperty方法
public static String getProperty(String key)
該方法的作用是獲得系統中屬性名為key的屬性對應的值。系統中常見的屬性名以及屬性的作用如下表所示。
屬性名列表
<table class="MsoNormalTable" style="margin: auto auto auto 47.95pt; border-collapse: collapse; mso-border-alt: solid black .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid black; mso-border-insidev: .5pt solid black;" border="1" cellspacing="0" cellpadding="0"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes;"><td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 5cm; padding-top: 0cm; background-color: transparent; mso-border-alt: solid black .5pt; border: black 1pt solid;" width="189" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">屬性名</span></span></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 212.6pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt;" width="283" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">屬性說明</span></span></p></td></tr><tr style="mso-yfti-irow: 1;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 5cm; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="189" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><code><span style="font-size: 12pt;" lang="EN-US"><span style="font-family: 宋體;">java.version</span></span></code></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 212.6pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="283" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Java </span></span><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">運行時環境版本</span></span></p></td></tr><tr style="mso-yfti-irow: 2;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 5cm; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="189" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><code><span style="font-size: 12pt;" lang="EN-US"><span style="font-family: 宋體;">java.home</span></span></code></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 212.6pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="283" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Java </span></span><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">安裝目錄</span></span></p></td></tr><tr style="mso-yfti-irow: 3;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 5cm; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="189" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><code><span style="font-size: 12pt;" lang="EN-US"><span style="font-family: 宋體;">os.name</span></span></code></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 212.6pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="283" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">操作系統的名稱</span></span></p></td></tr><tr style="mso-yfti-irow: 4;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 5cm; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="189" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><code><span style="font-size: 12pt;" lang="EN-US"><span style="font-family: 宋體;">os.version</span></span></code></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 212.6pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="283" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">操作系統的版本</span></span></p></td></tr><tr style="mso-yfti-irow: 5;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 5cm; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="189" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><code><span style="font-size: 12pt;" lang="EN-US"><span style="font-family: 宋體;">user.name</span></span></code></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 212.6pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="283" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">用戶的賬戶名稱</span></span></p></td></tr><tr style="mso-yfti-irow: 6;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 5cm; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="189" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><code><span style="font-size: 12pt;" lang="EN-US"><span style="font-family: 宋體;">user.home</span></span></code></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 212.6pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="283" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">用戶的主目錄</span></span></p></td></tr><tr style="mso-yfti-irow: 7; mso-yfti-lastrow: yes;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 5cm; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="189" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><code><span style="font-size: 12pt;" lang="EN-US"><span style="font-family: 宋體;">user.dir</span></span></code></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 212.6pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="283" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">用戶的當前工作目錄</span></span></p></td></tr></tbody></table>
例如:
String osName = System.getProperty(“os.name”);
String user = System.getProperty(“user.name”);
System.out.println(“當前操作系統是:” + osName);
System.out.println(“當前用戶是:” + user);
使用該方法可以獲得很多系統級的參數以及對應的值。
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結