JAVA基礎學習-數字與字串學習總結

喝水會長肉發表於2021-12-11

 9.1 裝箱拆箱

  • 封裝類

所有的 基本型別,都有對應的 類型別。比如int對應的類是Integer,這種類就叫做封裝類。


package digit
;


public class TestNumber {
    public static void main ( String [ ] args ) {
       int i = 5 ;

        //把一個基本型別的變數,轉換為Integer型別
       Integer it = new Integer (i ) ;
        //把一個Integer物件,轉換為一個基本型別的int
       int i2 = it . intValue ( ) ;
    }
}
  • Number類

數字封裝類有Byte,Short,Integer,Long,Float,Double。這些類都是抽象類Number的子類。

JAVA基礎學習-數字與字串學習總結

  • 自動裝箱與拆箱

不需要呼叫構造方法,通過**=**符號自動把  基本型別 轉換為  類型別 就叫裝箱

不需要呼叫Integer的intValue方法,通過**= 就自動轉換成int型別**,就叫拆箱


package digit
;


public class TestNumber {
    public static void main ( String [ ] args ) {
       int i = 5 ;

        //基本型別轉換成封裝型別
       Integer it = new Integer (i ) ;
        //自動轉換就叫裝箱
       Integer it2 = i ;
       
        //封裝型別轉換成基本型別
       int i2 = it . intValue ( ) ;
        //自動轉換就叫拆箱
       int i3 = it ;  
    }
}


  • int的最大值和最小值

int的最大值可以通過其對應的封裝類Integer.MAX_VALUE獲取


package digit
;

 
public class TestNumber {
 
    public static void main ( String [ ] args ) {
        //int的最大值
       System .out . println (Integer . MAX_VALUE ) ;
        //int的最小值      
       System .out . println (Integer . MIN_VALUE ) ;
    }


9.2字串轉換

  • 數字轉成字串

方法1: 使用String類的靜態方法 valueOf 方法2: 先把基本型別裝箱為物件,然後呼叫物件的 toString


package digit
;

 
public class TestNumber {
    public static void main ( String [ ] args ) {
       int i = 5 ;
   
        //方法1
       String str = String . valueOf (i ) ;
       
        //方法2
       Integer it = i ;
       String str2 = it . toString ( ) ;
    }
}


  • 字串轉成數字

呼叫Integer的靜態方法 parseInt


package digit
;

 
public class TestNumber {
 
    public static void main ( String [ ] args ) {

       String str = "999" ;
       int i = Integer . parseInt (str ) ;
       
       System .out . println (i ) ;    
    }
}


  • 練習

把浮點數 3.14 轉換為 字串 "3.14" 再把字串 “3.14” 轉換為 浮點數 3.14

如果字串是 3.1a4,轉換為浮點數會得到什麼?


public 
class 
TestNumber 
{

    public static void main ( String [ ] args ) {
       double i = 3.14 ;
       String str = String . valueOf (i ) ;
       System .out . println ( "3.14轉換成的字串 " + str ) ;

       double i2 = Float . parseFloat (str ) ;
       System .out . println ( "\"3.14\"轉換成的浮點數 " + i2 ) ;

       String str2 = "3.1a4" ;
       double i3 = Float . parseFloat (str2 ) ;
       System .out . println ( "\"3.1s4\"轉換成的浮點數 " + i3 ) ;
    }
}


JAVA基礎學習-數字與字串學習總結


9.3數學方法

  • 四捨五入, 隨機數,開方,次方,π,自然常數


public 
class 
TestNumber 
{

    public static void main ( String [ ] args ) {
       float f1 = 5.4f ;
       float f2 = 5.5f ;
        //5.4四捨五入即5
       System .out . println (Math . round (f1 ) ) ;
        //5.5四捨五入即6
       System .out . println (Math . round (f2 ) ) ;
       
        //得到一個0-1之間的隨機浮點數(取不到1)
       System .out . println (Math . random ( ) ) ;
       
        //得到一個0-10之間的隨機整數 (取不到10)
       System .out . println ( (int ) ( Math . random ( ) * 10 ) ) ;
        //開方
       System .out . println (Math . sqrt ( 9 ) ) ;
        //次方(2的4次方)
       System .out . println (Math . pow ( 2 , 4 ) ) ;
       
        //π
       System .out . println (Math . PI ) ;
       
        //自然常數
       System .out . println (Math . E ) ;
    }
}


  • 練習-數學方法

JAVA基礎學習-數字與字串學習總結



public 
class 
TestNumber 
{

    public static void main ( String [ ] args ) {
       int n = Integer . MAX_VALUE ;

       double value = Math . pow ( ( 1 + 1 / (double )n ) ,n ) ;
       System .out . println ( "n 取最大整數時value: " + value ) ;
       double error = Math . abs (Math . E - value ) ;
       System .out . println ( "error = " + error ) ;
    }
}


image.png


  • 練習-質數

統計找出一千萬以內,一共有多少質數。

質數概念: 只能被1和自己整除的數。


public 
class 
TestNumber 
{

    public static boolean IsZ ( int i ) {
        for (int j = 2 ;j <= Math . sqrt (i ) ;j ++ ) {
            if (i % j == 0 ) {
                return false ;
            }
        }
        return true ;
    }
    public static void main ( String [ ] args ) {
       int max_n = 10000000 ;
       int count = 0 ;

        for (int i = 2 ;i < max_n ;i ++ ) {
            if ( IsZ (i ) ) {
               count ++ ;
            }
        }
       System .out . println ( "一千萬以內的質數共有" + count ) ;
    }
}


image.png


9.4 格式化輸出

  • 格式化輸出

如果不使用格式化輸出,就需要進行字串連線,如果變數比較多,拼接就會顯得繁瑣 使用格式化輸出,就可以簡潔明瞭。

%s 表示字串 %d 表示數字 %n 表示換行


public 
class 
TestNumber 
{

 
    public static void main ( String [ ] args ) {

       String name = "蓋倫" ;
       int kill = 8 ;
       String title = "超神" ;
       
        //直接使用+進行字串連線,編碼感覺會比較繁瑣,並且維護性差,易讀性差
       String sentence = name + " 在進行了連續 " + kill + " 次擊殺後,獲得了 " + title + " 的稱號" ;
       System .out . println (sentence ) ;
       
        //使用格式化輸出
        //%s表示字串,%d表示數字,%n表示換行
       String sentenceFormat = "%s 在進行了連續 %d 次擊殺後,獲得了 %s 的稱號%n" ;
       System .out . printf (sentenceFormat ,name ,kill ,title ) ;
        //使用format格式化輸出
       System .out . format (sentenceFormat ,name ,kill ,title ) ;
    }
}


  • 總長度,左對齊,補0,千位分隔符,小數點位數,本地化表達


package digit
;

 
import java .util .Locale ;
 
public class TestNumber {
    public static void main ( String [ ] args ) {
       int year = 2020 ;
        //總長度,左對齊,補0,千位分隔符,小數點位數,本地化表達
         
        //直接列印數字
       System .out . format ( "%d%n" ,year ) ;
        //總長度是8,預設右對齊
       System .out . format ( "%8d%n" ,year ) ;
        //總長度是8,左對齊
       System .out . format ( "%-8d%n" ,year ) ;
        //總長度是8,不夠補0
       System .out . format ( "%08d%n" ,year ) ;
        //千位分隔符
       System .out . format ( "%,8d%n" ,year * 10000 ) ;
 
        //小數點位數
       System .out . format ( "%.2f%n" ,Math . PI ) ;
         
        //不同國家的千位分隔符
       System .out . format (Locale . FRANCE , "%,.2f%n" ,Math . PI * 10000 ) ;
       System .out . format (Locale . US , "%,.2f%n" ,Math . PI * 10000 ) ;
       System .out . format (Locale . UK , "%,.2f%n" ,Math . PI * 10000 ) ;    
    }
}


9.5 字元char

  • 儲存一個字元的時候使用char

  • char對應的封裝類是Character

  • Character常見方法


public 
class 
TestChar 
{


    public static void main ( String [ ] args ) {
       
       System .out . println (Character . isLetter ( 'a' ) ) ; //判斷是否為字母
       System .out . println (Character . isDigit ( 'a' ) ) ; //判斷是否為數字
       System .out . println (Character . isWhitespace ( ' ' ) ) ; //是否是空白
       System .out . println (Character . isUpperCase ( 'a' ) ) ; //是否是大寫
       System .out . println (Character . isLowerCase ( 'a' ) ) ; //是否是小寫
       
       System .out . println (Character . toUpperCase ( 'a' ) ) ; //轉換為大寫
       System .out . println (Character . toLowerCase ( 'A' ) ) ; //轉換為小寫

       String a = 'a' ; //不能夠直接把一個字元轉換成字串
       String a2 = Character . toString ( 'a' ) ; //轉換為字串
       
    }
}


  • 常見轉義


public 
class 
TestChar 
{

 
    public static void main ( String [ ] args ) {
       System .out . println ( "使用空格無法達到對齊的效果" ) ;
       System .out . println ( "abc def" ) ;
       System .out . println ( "ab def" ) ;
       System .out . println ( "a def" ) ;
         
       System .out . println ( "使用\\t製表符可以達到對齊的效果" ) ;
       System .out . println ( "abc\tdef" ) ;
       System .out . println ( "ab\tdef" ) ;
       System .out . println ( "a\tdef" ) ;
       
       System .out . println ( "一個\\t製表符長度是8" ) ;
         
       System .out . println ( "換行符 abc\ndef" ) ;
       System .out . println ( "單引號  abc\'def" ) ;
       System .out . println ( "雙引號  abc\"def" ) ;
       System .out . println ( "反斜槓  abc\\def" ) ;
    }
}


  • 練習-Character

通過Scanner從控制檯讀取字串,然後把字串轉換為字元陣列。

轉換為字元陣列後,篩選出控制檯讀取到的字串中的大寫字母和數字,並列印出來。


public 
class 
TestNumber 
{


    public static void main ( String [ ] args ) {
       Scanner sc = new Scanner (System .in ) ;

       String str = sc . next ( ) ;
       char [ ]cs = str . toCharArray ( ) ;
       System .out . println (String . valueOf (cs ) ) ;
System .out . println (Arrays . toString (cs ) ) ;
       
       String str2 = "" ;
        for (int i = 0 ;i < str . length ( ) ;i ++ ) {
            if (Character . isDigit (cs [i ] ) || Character . isUpperCase (cs [i ] ) )
               str2 += cs [i ] ;
        }
       System .out . println (str2 ) ;
    }
}


image.png


9.6 字串*

  • 建立字串

字串即字元的組合,在Java中,字串是一個類,所以我們見到的字串都是物件 常見建立字串手段:

  1. 每當有一個 字面值出現的時候,虛擬機器就會建立一個字串。

  2. 呼叫String的構造方法建立一個字串物件。

  3. 通過+加號進行字串拼接也會建立新的字串物件。


public 
class 
TestString 
{


    public static void main ( String [ ] args ) {
       String garen = "蓋倫" ; //字面值,虛擬機器碰到字面值就會建立一個字串物件
       
       String teemo = new String ( "提莫" ) ; //建立了兩個字串物件
       
       char [ ] cs = new char [ ] { '崔' , '斯' , '特' } ;
       
       String hero = new String (cs ) ; //  通過字元陣列建立一個字串物件
       
       String hero3 = garen + teemo ; //  通過+加號進行字串拼接
    }
}


  • String 被修飾為final,所以是不能被繼承的


/*這裡會報錯,因為String不能被繼承*/

    static class MyString extends String { }


  • immutable - 不可改變的

比如建立了一個字串物件 String garen ="蓋倫";

不可改變的具體含義是指:

  1. 不能增加長度

  2. 不能減少長度

  3. 不能插入字元

  4. 不能刪除字元

  5. 不能修改字元

一旦建立好這個字串,裡面的內容  永遠 不能改變,String 的表現就像是一個 常量

  • 字串格式化


//%s表示字串,%d表示數字,%n表示換行

       String sentenceFormat = "%s 在進行了連續 %d 次擊殺後,獲得了 %s 的稱號%n" ;
       
       String sentence2 = String . format (sentenceFormat , name ,kill ,title ) ;
  • 練習1-隨機字串

建立一個長度是5的隨機字串,隨機字元有可能是數字,大寫字母或者小寫字母。


public 
class 
TestNumber 
{


    public char get_char ( ) {
        /*0-9 corresponds to Ascii 48-57
        *A-Z 65-90
        *a-z 97-122
        * */

       Random random = new Random ( ) ;
        //隨機生成122-48範圍類的ascii碼
       int num ;
        switch (random . nextInt ( 3 ) ) {
            //獲取數字ascii
            case 0 :
               num = random . nextInt ( 58 - 48 ) + 48 ;
                break ;
            //獲取大寫字母
            case 1 :
               num = random . nextInt ( 91 - 65 ) + 65 ;
                break ;
            case 2 :
               num = random . nextInt ( 123 - 97 ) + 97 ;
                break ;
            default :
               num = 48 ;
        }
       char c = (char )num ;
        return c ;
    }

    public String get_String ( int length ) {
       String str = "" ;

        for (int i = 0 ;i < length ;i ++ ) {
           str += get_char ( ) ;
        }
        return str ;
    }

    public static void main ( String [ ] args ) {
       TestNumber t = new TestNumber ( ) ;

       String str = t . get_String ( 5 ) ;
       System .out . println (str ) ;
    }
}


  • 練習2 - 字串陣列排序

    
public String
[
] 
stringDataGroup_sort
(
String
[
] strings
) 
{

        /*字串陣列排序  按首字母排序**/
        for (int i = 0 ; i < strings .length - 1 ; i ++ ) {
            for (int j = i + 1 ; j < strings .length ; j ++ ) {
               char str1 = strings [i ] . charAt ( 0 ) ;
               char str2 = strings [j ] . charAt ( 0 ) ;
               int num1 = str1 ;
               int num2 = str2 ;
                if (num1 > num2 ) {
                   String string = strings [i ] ;
                   strings [i ] = strings [j ] ;
                   strings [j ] = string ;
                }
            }
        }
        return strings ;
    }

    public static void main ( String [ ] args ) {
       TestNumber t = new TestNumber ( ) ;

       String [ ]strs = new String [ 8 ] ;
        for (int i = 0 ;i < 8 ;i ++ ) {
           strs [i ] = t . get_String ( 5 ) ;
        }

       System .out . println (Arrays . toString (strs ) ) ;
       String [ ] sorted_str = t . stringDataGroup_sort (strs ) ;
       System .out . println (Arrays . toString (sorted_str ) ) ;
    }


JAVA基礎學習-數字與字串學習總結

  • 練習3 - 窮舉法破解-密碼

  1. 生成一個長度是3的 隨機字串,把這個字串作為當做密碼

  2. 使用窮舉法生成長度是3個字串,匹配上述生成的密碼

要求: 使用  遞迴解決 上述問題

9.7 操縱字串

  • 獲取字元 charAt(int index)獲取指定位置的字元

String sentence = "蓋倫,在進行了連續8次擊殺後,獲得了 超神 的稱號"; char c = sentence.charAt(0); 複製程式碼

  • 獲取對應的字元陣列 toCharArray()

 String sentence 
= 
"蓋倫,在進行了連續8次擊殺後,獲得了超神 的稱號"
;

char [ ] cs = sentence . toCharArray ( ) ; //獲取對應的字元陣列


  • 擷取子字串 subString

String sentence 
= 
"蓋倫,在進行了連續8次擊殺後,獲得了 超神 的稱號"
;


//擷取從第3個開始的字串 (基0)
//到5-1的位置的字串
//左閉右開
String subString2 = sentence . substring ( 3 , 5 ) ;
System .out . println (subString2 ) ;


  • split 根據分隔符進行分隔

String sentence 
= 
"蓋倫,在進行了連續8次擊殺後,獲得了 超神 的稱號"
;


//根據,進行分割,得到3個子字串
String subSentences [ ] = sentence . split ( "," ) ;
for (String sub : subSentences ) {
        System .out . println (sub ) ;
}


  • trim 去掉首位空格

String sentence 
= 
"蓋倫,在進行了連續8次擊殺後,獲得了 超神 的稱號      "
;

       
System .out . println (sentence ) ;
//去掉首尾空格
System .out . println (sentence . trim ( ) ) ;


  • 大小寫

toLowerCase 全部變成小寫;toUpperCase 全部變成大寫。

String sentence 
= 
"Garen"
;

       
//全部變成小寫
System .out . println (sentence . toLowerCase ( ) ) ;
//全部變成大寫
System .out . println (sentence . toUpperCase ( ) ) ;


  • 定位

indexOf 判斷字元或者子字串出現的位置 contains 是否包含子字串

String sentence 
= 
"蓋倫,在進行了連續8次擊殺後,獲得了超神 的稱號"
;

 
System .out . println (sentence . indexOf ( '8' ) ) ; //字元第一次出現的位置
         
System .out . println (sentence . indexOf ( "超神" ) ) ; //字串第一次出現的位置
         
System .out . println (sentence . lastIndexOf ( "了" ) ) ; //字串最後出現的位置
         
System .out . println (sentence . indexOf ( ',' , 5 ) ) ; //從位置5開始,出現的第一次,的位置
         
System .out . println (sentence . contains ( "擊殺" ) ) ; //是否包含字串"擊殺"


  • 替換

replaceAll 替換所有的;replaceFirst 只替換第一個。

String sentence 
= 
"蓋倫,在進行了連續8次擊殺後,獲得了超神 的稱號"
;


String temp = sentence . replaceAll ( "擊殺" , "被擊殺" ) ; //替換所有的
       
temp = temp . replaceAll ( "超神" , "超鬼" ) ;
System .out . println (temp ) ;
       
temp = sentence . replaceFirst ( "," , "" ) ; //只替換第一個
System .out . println (temp ) ;


  • 練習1 - 每個單詞的首字母都轉換為大寫

給出一句英文句子: "let there be light" 得到一個新的字串,每個單詞的首字母都轉換為大寫

  • 練習2 - 英文繞口令

英文繞口令 peter piper picked a peck of pickled peppers 統計這段繞口令有多少個以p開頭的單詞

  • 練習3 - 間隔大寫小寫模式

把 lengendary 改成間隔大寫小寫模式,即 LeNgEnDaRy

  • 練習4 - 最後一個字母變大寫

把 lengendary 最後一個字母變大寫

  • 練習5 - 把最後一個two單詞首字母大寫

Nature has given us that two ears, two eyes, and but one tongue, to the end that we should hear and see more than we speak 把最後一個two單詞首字母大寫


public 
class 
StringTest 
{

    //問題1 - 每個單詞的首字母都轉換為大寫
    public static String [ ] Split_Space ( String str ) {
        return str . split ( " " ) ;
    }
//java學習交流:737251827  進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
    public static String [ ] Toupcase ( String [ ] strs ) {
       String [ ]newstrs = new String [strs .length ] ;
       int i = 0 ;

        for (String str : strs ) {
           char [ ]cs = str . toCharArray ( ) ;
           cs [ 0 ] = Character . toUpperCase (cs [ 0 ] ) ;
           newstrs [i ++ ] = String . valueOf (cs ) ;
        }
        return newstrs ;
    }

    //練習2 - 英文繞口令
    public static int countp ( String [ ] strs ) {
       int count = 0 ;
        for (String str :strs ) {
            if (str . charAt ( 0 ) == 'p' )
               count ++ ;
        }
        return count ;
    }

    //練習3 - 間隔大寫小寫模式
    public static String updownChange ( String str ) {
       String upstr = str . toUpperCase ( ) ;
       char [ ]cs = upstr . toCharArray ( ) ;

        for (int i = 1 ;i < cs .length ;i += 2 ) {
           cs [i ] = Character . toLowerCase (cs [i ] ) ;
        }
        return new String (cs ) ;
    }

    //練習4-最後一個字母變大寫
    public static String lastup ( String str ) {
       char [ ]cs = str . toCharArray ( ) ;
       cs [cs .length - 1 ] = Character . toUpperCase (cs [cs .length - 1 ] ) ;

        return new String (cs ) ;
    }

    //練習5 - 把最後一個two單詞首字母大寫
    public static String last2up ( String s ) {
       char [ ] c = s . toCharArray ( ) ;
       String n = "two" ;

       c [s . lastIndexOf (n ) ] = Character . toUpperCase (s . charAt (s . lastIndexOf (n ) ) ) ;
        return new String (c ) ;
    }


    public static void main ( String [ ] args ) {
        //問題1 - 每個單詞的首字母都轉換為大寫
       String str = "let there be light" ;
       String [ ]newstrs = Toupcase ( Split_Space (str ) ) ;
       String result = "" ;
        for (String s : newstrs ) {
           result += s + " " ;
        }
       System .out . println (result ) ;

        //練習2 - 英文繞口令
       String str2 = "peter piper picked a peck of pickled peppers" ;
       int count = countp ( Split_Space (str2 ) ) ;
       System .out . println ( "首字母為p的單詞有" + count ) ;

        //練習3 - 間隔大寫小寫模式
       String str3 = "lengendary" ;
       System .out . println ( "間隔大小寫模式:" + updownChange (str3 ) ) ;

        //練習4-最後一個字母變大寫
       System .out . println ( "最後一個字元變成大寫:" + lastup (str3 ) ) ;

        //練習5 - 把最後一個two單詞首字母大寫
       String str5 = "Nature has given us that two ears, two eyes, and but one tongue, to the end that we should hear and see more than we speak" ;
       System .out . println ( last2up (str5 ) ) ;
    }
}


JAVA基礎學習-數字與字串學習總結


9.8 比較字串

  • 是否是同一個物件

str1和str2的內容一定是一樣的!但是,並不是同一個字串物件。

==用於判斷是否是同一個字串物件。

  • 是否是同一個物件-特例

String str1 
= 
"the light"
;

String str3 = "the light" ;

System .out . println ( str1   ==  str3 ) ;


一般說來,編譯器每碰到一個字串的字面值,就會建立一個新的物件。 所以在第6行會建立了一個新的字串"the light"; 但是在第7行,編譯器發現已經存在現成的"the light",那麼就直接拿來使用,而沒有進行重複建立。

  • 內容是否相同

使用equals進行字串內容的比較,必須大小寫一致; equalsIgnoreCase,忽略大小寫判斷內容是否一致。

  • 是否以子字串開始或者結束

startsWith //以...開始;endsWith //以...結束。

  • 練習-比較字串

建立一個長度是100的字串陣列,使用長度是2的隨機字元填充該字串陣列。 統計這個字串陣列裡 重複的字串有多少種

學了hash再來做吧..

9.9 StringBuffer*

StringBuffer是可變長的字串

  • 追加 刪除 插入 反轉

append追加;delete 刪除;insert 插入;reverse 反轉.


package character
;

 
public class TestString {
    public static void main ( String [ ] args ) {
       String str1 = "let there " ;
       StringBuffer sb = new StringBuffer (str1 ) ; //根據str1建立一個StringBuffer物件
       
       sb . append ( "be light" ) ; //在最後追加
       System .out . println (sb ) ;
       
       sb . delete ( 4 , 10 ) ; //刪除4-10之間的字元
       System .out . println (sb ) ;
       
       sb . insert ( 4 , "there " ) ; //在4這個位置插入 there
       System .out . println (sb ) ;
       
       sb . reverse ( ) ; //反轉
       System .out . println (sb ) ;

    }
}


  • 長度 容量

為什麼StringBuffer可以變長? 和String 內部是一個字元陣列一樣,StringBuffer也維護了一個字元陣列。 但是,這個字元陣列, 留有冗餘長度

  • 比如說new StringBuffer("the"),其內部的字元陣列的長度,是19,而不是3,這樣呼叫插入和追加,在現成的陣列的基礎上就可以完成了。 如果追加的長度超過了19,就會分配一個新的陣列,長度比原來多一些,把原來的資料複製到新的陣列中, 看上去 陣列長度就變長了。

length: “the”的長度 3;capacity: 分配的總空間 19。


public 
class 
TestString 
{

 
    public static void main ( String [ ] args ) {
       String str1 = "the" ;
       StringBuffer sb = new StringBuffer (str1 ) ;
       
       System .out . println (sb . length ( ) ) ; //內容長度
       System .out . println (sb . capacity ( ) ) ; //總空間
    }
}
  • 練習-StringBuffer效能

String與StringBuffer的效能區別?

生成10位長度的隨機字串 然後,先使用String的+,連線10000個隨機字串,計算消耗的時間 然後,再使用StringBuffer連線10000個隨機字串,計算消耗的時間

提示: 使用System.currentTimeMillis() 獲取當前時間(毫秒)


public 
static 
void 
main
(
String
[
] args
) 
{

       long start = System . currentTimeMillis ( ) ;
       String s1 = "" ;
        for (int i = 0 ;i < 10000 ;i ++ ) {
           s1 += 'a' ;
        }
       long end = System . currentTimeMillis ( ) ;
       System .out . println ( "string總共耗時了:" + (end -start ) ) ;

       long start2 = System . currentTimeMillis ( ) ;
       StringBuffer sb = new StringBuffer ( ) ;
        for (int i = 0 ;i < 10000 ;i ++ ) {
           sb . append ( 'a' ) ;
        }
       long end2 = System . currentTimeMillis ( ) ;
       System .out . println ( "stringbuffer總共耗時了:" + (end2 -start2 ) ) ;
    }


JAVA基礎學習-數字與字串學習總結


  • 練習-MyStringBuffer

根據介面IStringBuffer ,自己做一個MyStringBuffer

IStringBuffer.java


package character
;

 
public interface IStringBuffer {
    public void append (String str ) ; //追加字串
    public void append (char c ) ;   //追加字元
    public void insert (int pos ,char b ) ; //指定位置插入字元
    public void insert (int pos ,String b ) ; //指定位置插入字串
    public void delete (int start ) ; //從開始位置刪除剩下的
    public void delete (int start ,int end ) ; //從開始位置刪除結束位置-1
    public void reverse ( ) ; //反轉
    public int length ( ) ; //返回長度
}

MyStringBuffer.java


package character
;

public class MyStringBuffer implements IStringBuffer {
}

9.10 MyStringBuffer

具體文字說明: how2j.cn/k/number-st…


package digit
;


public class MyStringBuffer implements IStringBuffer {
   int capacity = 19 ;
   int length = 0 ;
   char [ ]value ;
//java學習交流:737251827  進入可領取學習資源及對十年開發經驗大佬提問,免費解答!
    // 無參構造方法
    public MyStringBuffer ( ) {
       value = new char [capacity ] ;
    }
    // 帶引數構造方法
    public MyStringBuffer ( String str ) {
        this ( ) ;
        if ( null == str )
            return ;

        if (capacity < str . length ( ) ) {
           capacity = value .length * 2 ;
           value = new char [capacity ] ;
        }
        if (capacity >= str . length ( ) ) {
           System . arraycopy (str . toCharArray ( ) , 0 ,value , 0 ,str . length ( ) ) ;
        }

       length = str . length ( ) ;
    }

    //追加字串
   @Override
    public void append ( String str ) {
        insert (length ,str ) ;
    }

    //追加字元
   @Override
    public void append ( char c ) {
        append (String . valueOf (c ) ) ;
    }

    //指定位置插入字元
   @Override
    public void insert ( int pos ,char b ) {
        insert (pos ,String . valueOf (b ) ) ;
    }

    //指定位置插入字串
   @Override
    public void insert ( int pos ,String b ) {
        //邊界條件判斷
        if (pos < 0 )
            return ;
        if (pos > length )
            return ;
        if ( null == b )
            return ;

        //擴容
        while (length + b . length ( ) > capacity ) {
           capacity = (int ) ( (length + b . length ( ) ) * 2 ) ;
           char [ ]new_value = new char [capacity ] ;
           System . arraycopy (value , 0 ,new_value , 0 ,length ) ;
           value = new_value ;
        }

       char [ ]cs = b . toCharArray ( ) ;
        //先把已經存在的資料往後移
       System . arraycopy (value ,pos ,value ,pos +cs .length ,length -pos ) ;
        //把要插入的資料插入到指定位置
       System . arraycopy (cs , 0 , value , pos , cs .length ) ;

       length = length +cs .length ;
    }

    //從開始位置刪除剩下的
   @Override
    public void delete (int start ) {
        delete (start ,length ) ;
    }

    //從開始位置刪除結束位置-1
   @Override
    public void delete (int start ,int end ) {
        //邊界條件判斷
        if (start < 0 ) return ;
        if (start >length ) return ;
        if (end < 0 ) return ;
        if (end >length ) return ;
        if (start >=end ) return ;

       System . arraycopy (value , end , value , start , length - end ) ;
       length -=end -start ;
    }

    //反轉
   @Override
    public void reverse ( ) {
        for (int i = 0 ; i < length / 2 ; i ++ ) {
           char temp = value [i ] ;
           value [i ] = value [length - i - 1 ] ;
           value [length - i - 1 ] = temp ;
        }
    }

    //返回長度
   @Override
    public int length ( ) {
        return length ;
    }

    public String toString ( ) {
       char [ ] realValue = new char [length ] ;
       System . arraycopy (value , 0 , realValue , 0 , length ) ;

        return new String (realValue ) ;
    }

    public static void main ( String [ ] args ) {
       MyStringBuffer sb = new MyStringBuffer ( "there light" ) ;
       System .out . println (sb ) ;
       sb . insert ( 0 , "let " ) ;
       System .out . println (sb ) ;

       sb . insert ( 10 , "be " ) ;
       System .out . println (sb ) ;
       sb . insert ( 0 , "God Say:" ) ;
       System .out . println (sb ) ;
       sb . append ( "!" ) ;
       System .out . println (sb ) ;
       sb . append ( '?' ) ;
       System .out . println (sb ) ;
       sb . reverse ( ) ;
       System .out . println (sb ) ;

       sb . reverse ( ) ;
       System .out . println (sb ) ;

       sb . delete ( 0 , 4 ) ;
       System .out . println (sb ) ;
       sb . delete ( 4 ) ;
       System .out . println (sb ) ;
    }
}


JAVA基礎學習-數字與字串學習總結






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2847158/,如需轉載,請註明出處,否則將追究法律責任。

相關文章