Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File
java.lang 類 StringBuffer java.lang.Object
java.lang.StringBuffer 所有已實現的介面:Serializable, Appendable, CharSequence
public final class StringBufferextends Objectimplements Serializable, CharSequence
執行緒安全的可變字元序列。一個類似於 String
的字串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字元序列,但通過某些方法呼叫可以改變該序列的長度和內容。
String建立的字串物件是不可修改的
StringBuffer類的作用:
String雖然提供了很多API方法,但是始終是對字串常量進行操作,不僅無法改變常量的值,還會佔用大量記憶體空間。StringBuffer類則是一個非常靈活的工具,節約記憶體空間的同時還保障了執行緒安全。
java.lang 類 StringBuilder java.lang.Object
java.lang.StringBuilder 所有已實現的介面:Serializable, Appendable, CharSequence
public final class StringBuilderextends Objectimplements Serializable, CharSequence
一個可變的字元序列。此類提供一個與 StringBuffer
相容的 API,但不保證同步。該類被設計用作 StringBuffer
的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer
StringBuilder類即字串生成器,新建立的StringBuilder物件初始容量是16個字元,可以自行指定初始長度,也可以動態地執行新增、刪除和插入等字串的編輯操作,大大提高了頻繁增加字串的效率。如果附加的字元超過可容納的長度,則StringBuilder物件將自動增加長度以容納被附加的字元。用一個簡單的例子來看一下String類、StringBuffer類和StringBuilder類執行速度對比
String類、StringBuffer類和StringBuilder之間的關係:
讓String類、StringBuffer類和StringBuilder類同時拼接100000次看他們執行的時間對比
public class StringBufferTest {
public static void main(String[] args) {
String s="";
long start_s=System.currentTimeMillis();//String類開始拼接的時間
for(int i=0;i<100000;i++){
s+="aaaa";//String類拼接100000次
}
long end_s=System.currentTimeMillis();//String類結束拼接的時間
System.out.println("String拼接100000次的時間:"+(end_s-start_s)+"ms");//輸出String拼接一萬次用的毫秒數
StringBuffer ss=new StringBuffer();
long start_ss=System.currentTimeMillis();//StringBuffer類開始拼接的時間
for(int i=0;i<100000;i++){
ss.append("aaaa");
}
long end_ss=System.currentTimeMillis();//StringBuffer類結束拼接的時間
System.out.println("StringBuffer拼接100000次的時間:"+(end_ss-start_ss)+"ms");//輸出StringBuffer拼接一萬次用的毫秒數
StringBuilder sd=new StringBuilder();
long start_sd=System.currentTimeMillis();//StringBuilder類開始拼接的時間
for(int i=0;i<100000;i++){
sd.append("aaaa");//StringBuilder類拼接100000次
}
long end_sd=System.currentTimeMillis();//StringBuilder類結束拼接的時間
System.out.println("StringBuilder拼接100000次的時間:"+(end_sd-start_sd)+"ms");//輸出StringBuilder拼接一萬次用的毫秒數
}
}
其執行結果如下:
在執行速度方面的比較:StringBuilder > StringBuffer > String
三者的關係:
三者之間相互轉換:
三者之間的不同之處:
String只能賦值1次,每一次改變內容都生成了一個新的物件,然後原有的物件引用了新的物件,所以說String本身是不可改變,每一次改變String的內容,都會在記憶體建立新的物件,而每一次生成新物件都會對系統性能產生影響,這會降低Java虛擬機器的工作效率。如下圖所示:
而StringBuilder和StringBuffer不同,每次操作都是對自身物件的操作,而不是生成新的物件,其所佔空間會隨著字幅內容增加而增加,做大量修改操作時,不會因生成大量匿名物件而影響系統性能。如下圖所示:
StringBuffer類操作:
作用:String雖然提供了很多API方法,但是始終是對字串常量進行操作,不僅無法改變常量的值,還會佔用大量記憶體空間。StringBuffer類則是一個非常靈活的工具,節約記憶體空間的同時還保障了執行緒安全。
建立:
//建立一個StringBuilder類物件必須用new方法,不能像String物件那樣直接引用字串常量
StringBuffer sbf1=new StringBuffer(); //建立一個物件無初始值
StringBuffer sbf2=new StringBuffer("abc"); //建立一個物件,初始值 “abc”
StringBuffer sbf3=new StringBuffer(32); //建立一個物件,初始容量為32個字元
追加字串:
append() 方法
StringBuffer sbf =new StringBuffer("誰將");
sbf.append("新樽"); //追加字串
StringBuffer s1=new StringBuffer("辭舊月");
sbf.append(s1); //追加新的字串中的內容
int a=2333;
sbf.append(a); //追加int型變數a
System.out.println(sbf);
修改指定索引處的字元:
setChar() 方法
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月");
sbf.setCharAt(6,'日'); //替換索引6的字元
System.out.println(sbf);
插入字串:
insert() 方法
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月");
sbf.insert(2,"我的"); //在索引2插入
System.out.println(sbf);
字串的反序:
reverse() 方法
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月");
sbf.reverse();
System.out.println(sbf);
刪除子字串:
delete() 方法
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月");
sbf.delete(4,6);
System.out.println(sbf);
其他常用方法:
StringBuffer sbf=new StringBuffer("誰將新樽辭舊月");
System.out.println(sbf.length()); //獲取字串序列長度
System.out.println(sbf.charAt(5)); //獲取索引為5的內容
System.out.println(sbf.indexOf("DEF")); //獲取DEF所在的索引位置,沒有返回 -1
System.out.println(sbf.substring(0,2)); //獲取索引0-2的內容
System.out.println(sbf.replace(2,5,"wode")); //將索引2-5的內容替換
StringBuilder類和StringBuffer類具有相容的API,所以兩者使用方法也相同
StringBuilder sbd=new StringBuilder();
sbd.append("我是StringBuilder"); //追加字元
sbd.length(); //長度
sbd=sbd.insert(5,"///"); //插入
sbd=sbd.delete(sbd.length()-1,sbd.length() ); //刪除最後一個字元
sbd=sbd.reverse(); //反序
java.lang 類 Math java.lang.Object
public final class Mathextends Object
Math
類包含基本的數字操作,如指數、對數、平方根和三角函式。
與 StrictMath
類的某些數值方法不同,並不是 Math
類的所有等效函式的實現都定義為返回逐位相同的結果。這一寬限允許在不要求嚴格可重複性的地方實現更好的效能。
預設情況下,很多 Math
方法僅呼叫 StrictMath
中的等效方法來完成它們的實現。程式碼生成器鼓勵使用特定於平臺的本機庫或者在可用的地方使用微處理器指令,來提供對 Math
方法的更高效能的實現。這種更高效能的實現仍然必須遵守 Math
的規範。
math類常用方法
System.out.println(Math.E); //自然對數的底數
System.out.println(Math.PI); //圓周率
System.out.println(Math.abs(-10)); //返回各種型別絕對值
System.out.println(Math.cos(90)); //返回角的三角餘弦。如果引數是 NaN 或無窮大,那麼結果是 NaN。
System.out.println(Math.sin(90)); //返回角的三角正弦。特殊情況是: 如果引數是 NaN 或無窮大,那麼結果是 NaN。 如果引數是零,那麼結果是零,符號與引數符號相同。
System.out.println(Math.tan(90)); //返回角的三角正切。特殊情況是: 如果引數是 NaN 或無窮大,那麼結果是 NaN。 如果引數是零,那麼結果是零,符號與引數符號相同。
System.out.println(Math.sqrt(5)); //返回正確舍入的 double 值的正平方根
System.out.println(Math.cbrt(5)); //返回 double 值的立方根。
System.out.println(Math.ceil(5.5)); //返回最小的(最接近負無窮大)double 值,該值大於或等於引數,並且等於某個整數。
System.out.println(Math.floor(5.5)); //返回最大的(最接近正無窮大)double 值,該值小於或等於引數,並且等於某個整數。
System.out.println(Math.rint(5.5)); //返回其值最接近引數並且是整數的 double 值。如果兩個整數的 double 值都同樣接近,那麼結果取偶數。
System.out.println(Math.round(5.5)); //返回最接近引數的 int。通過加上 1/2 將該結果舍入為整數,取結果的基數並將其強制轉換為 int 型別。
System.out.println(Math.random()); //返回帶正號的 double 值,大於或等於 0.0,小於 1.0。返回值是一個偽隨機 (pseudorandomly) 選擇的數,在上述範圍內(大致)均勻分佈。
System.out.println(Math.max(5, 9)); //返回兩個 值中較大的一個。
System.out.println(Math.min(5, 9)); //返回兩個 值中較小的一個。
java.util 類 Random java.lang.Object java.util.Random 所有已實現的介面:Serializable直接已知子類:SecureRandom
public class Randomextends Objectimplements Serializable 此類的例項用於生成偽隨機數流。此類使用 48 位的種子,使用線性同餘公式對其進行修改(請參閱 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 節)。
很多應用程式會發現 Math
類中的 random
方法更易於使用。
簡單應用例子:
System.out.println(r.nextBoolean());//生成一個隨機的布林值
System.out.println(r.nextInt());//生成一個隨機的整數
System.out.println(r.nextInt(10));//生成一個隨機10以內的整數
System.out.println(r.nextInt(10)+5);//生成一個隨機5~14的整數
java.sql 類 Date java.lang.Object java.util.Date
java.sql.Date 所有已實現的介面:Serializable, Cloneable, Comparable<Date>
public class Dateextends Date
一個包裝了毫秒值的瘦包裝器 (thin wrapper),它允許 JDBC 將毫秒值標識為 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以來經過的毫秒數。
java.text 類 SimpleDateFormat java.lang.Object java.text.Format java.text.DateFormat
java.text.SimpleDateFormat 所有已實現的介面:Serializable, Cloneable
public class SimpleDateFormatextends DateFormat
SimpleDateFormat
是一個以與語言環境相關的方式來格式化和分析日期的具體類。它允許進行格式化(日期 -> 文字)、分析(文字 -> 日期)和規範化。
SimpleDateFormat
使得可以選擇任何使用者定義的日期-時間格式的模式
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest {
public static void main(String[] args) {
Date d=new Date();
System.out.println(d);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(d));
}
}
java.util 類 UUID java.lang.Object
public final class UUIDextends Objectimplements Serializable, Comparable<UUID> 表示通用惟一識別符號 (UUID) 的類。 UUID 表示一個 128 位的值。 這些全域性識別符號具有不同的變體。此類的方法用於操作 Leach-Salz 變體,不過構造方法允許建立任何 UUID 變體。
import java.util.UUID;
public class UuidTest {
public static void main(String[] args) {
//靜態,不能例項化
System.out.println(UUID.randomUUID());
}
}
java.io 類 File java.lang.Object
public class Fileextends Objectimplements Serializable, Comparable<File> 檔案和目錄路徑名的抽象表示形式。 使用者介面和作業系統使用與系統相關的路徑名字串 來命名檔案和目錄。此類呈現分層路徑名的一個抽象的、與系統無關的檢視。抽象路徑名 有兩個元件:
- 一個可選的與系統有關的字首 字串,比如碟符,
"/"
表示 UNIX 中的根目錄,"\\"
表示 Microsoft Windows UNC 路徑名,以及 - 零個或更多字串名稱 的序列。
除了最後一個,抽象路徑名中的每個名稱代表一個目錄;最後一個名稱既可以代表目錄,也可以代表檔案。空的 抽象路徑名沒有字首和名稱序列。
File類常用方法
import java.io.File;
public class FileTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f=new File("C:\Users\Administrator\Desktop\Z1");
System.out.println(f.exists());//測試路徑或目錄是否存在
f.isDirectory();//測試此抽象路徑名錶示的檔案是否是一個目錄
f.isFile();//測試此抽象路徑名錶示的檔案是否是一個標準檔案
f.getAbsolutePath();//返回抽象路徑名的絕對路徑名字串
f.list();//返回由此抽象路徑名所表示的目錄中的檔案和目錄的名稱所組成字串陣列
f.lastModified();//返回此抽象路徑名錶示的檔案最後一次被修改的時間
f.toString();//返回此抽象路徑名的路徑名字串
f.isAbsolute();//測試此抽象路徑名是否為絕對路徑名
f.getPath();//將此抽象路徑名轉換為一個路徑名字串
}
}