1. 程式人生 > >Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File

Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File

替換 mem end 序列 包含 類型 允許 ges implement

java.lang
類 StringBuffer

java.lang.Object
  

技術分享

java.lang.StringBuffer
所有已實現的接口:
Serializable, Appendable, CharSequence

public final class StringBufferextends Objectimplements Serializable, CharSequence

線程安全的可變字符序列。一個類似於 String 的字符串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。

String創建的字符串對象是不可修改的,StringBuff類創建的是可修改的字符串序列,且實體容量會隨著存放的字符串增加而自動增加。

可將字符串緩沖區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。

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
  

技術分享

java.lang.Math

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
  

技術分享

java.util.UUID
所有已實現的接口:
Serializable, Comparable<UUID>

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
  

技術分享

java.io.File
所有已實現的接口:
Serializable, Comparable<File>

public class Fileextends Objectimplements Serializable, Comparable<File>

文件和目錄路徑名的抽象表示形式。

用戶界面和操作系統使用與系統相關的路徑名字符串 來命名文件和目錄。此類呈現分層路徑名的一個抽象的、與系統無關的視圖。抽象路徑名 有兩個組件:

  1. 一個可選的與系統有關的前綴 字符串,比如盤符,"/" 表示 UNIX 中的根目錄,"\\\\" 表示 Microsoft Windows UNC 路徑名,以及
  2. 零個或更多字符串名稱 的序列。

除了最後一個,抽象路徑名中的每個名稱代表一個目錄;最後一個名稱既可以代表目錄,也可以代表文件。空的 抽象路徑名沒有前綴和名稱序列。

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();//將此抽象路徑名轉換為一個路徑名字符串
    }
}

Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File