Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

數字與字符串

weixin_39730971 2022-01-15 04:45:17 阅读数:8 评论数:0 点赞数:0 收藏数:0

裝箱和拆箱

1.封裝類

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


2.Number類

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



3.基本類型轉封裝類

        int i = 5;
 
        //基本類型轉換成封裝類型
        Integer it = new Integer(i);

4.封裝類轉基本類型

        int i = 5;
 
        //基本類型轉換成封裝類型
        Integer it = new Integer(i);
         
        //封裝類型轉換成基本類型
        int i2 = it.intValue();

5.自動裝箱

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

        int i = 5;
 
        //基本類型轉換成封裝類型
        Integer it = new Integer(i);
         
        //自動轉換就叫裝箱
        Integer it2 = i;

6.自動拆箱

不需要調用Integer的intValue方法,通過=就自動轉換成int類型,就叫拆箱

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

7.int的最大值,最小值

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






字符串轉換

1.數字轉字符串

方法1: 使用String類的靜態方法valueOf 
方法2: 先把基本類型裝箱為對象,然後調用對象的toString
         int i = 5 ;
         
         //方法1
         String str = String.valueOf(i);
         
         //方法2
         Integer it = i;
         String str2 = it.toString();

2.字符串轉數字
調用Integer的靜態方法parseInt
         String str = "999" ;
         
         int i= Integer.parseInt(str);
         
         System.out.println(i);





數學方法
java.lang.Math提供了一些常用的數學運算方法,並且都是以靜態方法的形式存在

四舍五入, 隨機數,開方,次方,π,自然常數
         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);

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

質數概念: 只能被1和自己整除的數
舉例:
5只能被 1和5整除,所以是質數
8可以被2整除,所以不是質數






格式化輸出
1.格式化輸出
如果不使用格式化輸出,就需要進行字符串連接,如果變量比較多,拼接就會顯得繁瑣
使用格式化輸出,就可以簡潔明了

%s 錶示字符串
%d 錶示數字
%n 錶示換行

         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);

2.printf和format
printf和format能够達到一模一樣的效果, 通過eclipse查看java源代碼 可以看到,在printf中直接調用了format



3.換行符
換行符就是另起一行 --- '\n' 換行(newline)
回車符就是回到一行的開頭 --- '\r' 回車(return)
在eclipse裏敲一個回車,實際上是 回車換行符
Java是跨平臺的編程語言,同樣的代碼,可以在不同的平臺使用,比如Windows,Linux,Mac
然而在不同的操作系統,換行符是不一樣的
(1)在DOS和Windows中,每行結尾是 “\r\n”;
(2)Linux系統裏,每行結尾只有 “\n”;
(3)Mac系統裏,每行結尾是只有 "\r"。
為了使得同一個java程序的換行符在所有的操作系統中都有一樣的錶現,使用%n,就可以做到平臺無關的換行

4.總長度,左對齊,補0,千比特分隔符,小數點比特數,本地化錶達
其他常用的格式化方式
         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 );
          






字符
1.保存一個字符的時候用char
字母、字符、漢字

2.char對應的封裝類
char對應的封裝類是Character

3.Character常見方法
         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' ); //轉換為字符串


4.常見轉義
         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( "12345678def" );
          
         System.out.println( "換行符 \\n" );
         System.out.println( "abc\ndef" );
 
         System.out.println( "單引號 \\'" );
         System.out.println( "abc\'def" );
         System.out.println( "雙引號 \\\"" );
         System.out.println( "abc\"def" );
         System.out.println( "反斜杠本身 \\" );
         System.out.println( "abc\\def" );






字符串
1.創建字符串
字符串即字符的組合,在Java中,字符串是一個類,所以我們見到的字符串都是對象 
常見創建字符串手段: 
1. 每當有一個 字面值出現的時候,虛擬機就會創建一個字符串 
2. 調用String的構造方法創建一個字符串對象 
3. 通過+加號進行字符串拼接也會創建新的字符串對象 

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

3.immutable  
immutable 是指不可改變的
比如創建了一個字符串對象
String garen ="蓋倫";
不可改變的具體含義是指:
不能增加長度
不能减少長度
不能插入字符
不能删除字符
不能修改字符
一旦創建好這個字符串,裏面的內容  永遠 不能改變

String 的錶現就像是一個 常量

4.字符串格式化
如果不使用字符串格式化,就需要進行字符串連接,如果變量比較多,拼接就會顯得繁瑣 
使用 字符串格式化 ,就可以 簡潔明了  
更多的格式化規則,參考 格式化輸出

5.字符串長度
length方法返回當前字符串的長度 
可以有長度為0的字符串,既空字符串

練習:
(1)隨機字符串
創建一個長度是5的隨機字符串,隨機字符有可能是數字,大寫字母或者小寫字母

給點提示: 數字和字符之間可以通過互相轉換
char c = 'A';
short s = (short) c;

通過這個手段就能够知道字符 a-z A-Z 0-9 所對應的數字的區間了

需要用到 ASCII碼對照錶

(2)字符串數組排序
創建一個長度是8的字符串數組
使用8個長度是5的隨機字符串初始化這個數組
對這個數組進行排序,按照每個字符串的首字母排序(無視大小寫)

1: 不能使用Arrays.sort() 要自己寫
2: 無視大小寫,即 Axxxx 和 axxxxx 沒有先後順序

(3 )窮舉法破解密碼
1. 生成一個長度是3的隨機字符串,把這個字符串作為當做密碼

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

要求: 分別使用多層for循環 和 遞歸解决上述問題






操縱字符串
1.獲取字符
charAt(int index)獲取指定比特置的字符

2.獲取對應的字符數組
toCharArray()
獲取對應的字符數組

3.截取字符串
subString 
截取子字符串

4.分隔
split 
根據分隔符進行分隔

5.去掉收尾空格
trim 
去掉首尾空格

6.大小寫
toLowerCase 全部變成小寫 
toUpperCase 全部變成大寫

7.定比特
indexOf 判斷字符或者子字符串出現的比特置
contains 是否包含子字符串

8.替換
replaceAll 替換所有的 
replaceFirst 只替換第一個

練習......
每個單詞的首字母都轉換成大寫
英文繞口令
間隔大寫小寫模式
最後一個字母變大寫
把最後一個two單詞首字母大寫





比較字符串
1.是否是同一個對象
str1和str2的內容一定是一樣的! 
但是,並不是同一個字符串對象

         String str1 = "the light" ;
         
         String str2 = new String(str1);
         
         //==用於判斷是否是同一個字符串對象
         System.out.println( str1  ==  str2);

2.是否是同一個對象(特例
str1 = "the light";
str3 = "the light";

一般說來,編譯器每碰到一個字符串的字面值,就會創建一個新的對象
所以在第str1行會創建了一個新的字符串"the light"
但是在第str3行,編譯器發現已經存在現成的"the light",那麼就直接拿來使用,而沒有進行重複創建
         String str1 = "the light" ;
         String str3 = "the light" ;
         System.out.println( str1  ==  str3);

3.內容是否相同
使用equals進行字符串內容的比較,必須大小寫一致 
equalsIgnoreCase,忽略大小寫判斷內容是否一致

4.是否以子字符串開始或者結束
startsWith //以...開始
endsWith //以...結束


練習: 比較字符串
創建一個長度是100的字符串數組
使用長度是2的隨機字符填充該字符串數組
統計這個字符串數組裏 重複的字符串有多少種






StringBuffer
StringBuffer是可變長的字符串

1.追加 删除 插入 反轉
append追加 
delete 删除 
insert 插入 
reverse 反轉

2.長度 容量
為什麼StringBuffer可以變長? 
和String內部是一個字符數組一樣,StringBuffer也維護了一個字符數組。 但是,這個字符數組,留有冗餘長度 
比如說new StringBuffer("the"),其內部的字符數組的長度,是19,而不是3,這樣調用插入和追加,在現成的數組的基礎上就可以完成了。 
如果追加的長度超過了19,就會分配一個新的數組,長度比原來多一些,把原來的數據複制到新的數組中,看上去 數組長度就變長了 參考MyStringBuffer 
length: “the”的長度 3 
capacity: 分配的總空間 19

練習:
(1)StringBuffer 性能
String與StringBuffer的性能區別?

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

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

(2)MyStringBuffer
根據接口IStringBuffer ,自己做一個MyStringBuffer







MyStringBuffer
1.IStringBuffer接口
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(); //返回長度
}

2.value和capacity
value:用於存放字符數組
capacity: 容量
無參構造方法: 根據容量初始化value
public MyStringBuffer(){
value = new char[capacity];
}

3.帶參構造方法

4.反轉

5.插入insert和append
邊界條件判斷
插入之前,首先要判斷的是一些邊界條件。 比如插入比特置是否合法,插入的字符串是否為空

擴容
1. 要判斷是否需要擴容。 如果插入的字符串加上已經存在的內容的總長度超過了容量,那麼就需要擴容。
2. 數組的長度是固定的,不能改變的,數組本身不支持擴容。 我們使用變通的方式來解决這個問題。
3. 根據需要插入的字符串的長度和已經存在的內容的長度,計算出一個新的容量。 然後根據這個容量,創建一個新的數組,接著把原來的數組的內容,複制到這個新的數組中來。並且讓value這個引用,指向新的數組,從而達到擴容的效果。

插入字符串
1. 找到要插入字符串的比特置,從這個比特置開始,把原數據看著兩段,把後半段向後挪動一個距離,這個距離剛好是插入字符串的長度
2. 然後把要插入的數據,插入這個挪出來的,剛剛好的比特置裏。

修改length的值
最後修改length的值,是原來的值加上插入字符串的長度

insert(int, char)
參數是字符的insert方法,通過調用insert(int, String) 也就實現了。

append
追加,就是在最後比特置插入。 所以不需要單獨開發方法,直接調用insert方法,就能達到最後比特置插入的效果

6.删除 delete




練習:性能比較


以上來源:數字與字符串

Copyright statement
In this paper,the author:[weixin_39730971],Reprint please bring the original link, thank you

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领