Java基礎(六),java基礎
一、封裝類
JAVA是一種物件導向語言,java中的類把方法與資料連線在一起,但在JAVA中不能定義基本類型對象,為了能將基本類型視為對象進行處理,java為每個基本類型都提供了封裝類。
對應關係如下:
| 基本類型 |
封裝類型 |
| byte |
Byte |
| short |
Short |
| int |
Integer |
| long |
Long |
| float |
Float |
| double |
Double |
| char |
Character |
| boolean |
Boolean |
1、Number類
BigDecimal、BigInteger、Byte、Double、Float、Integer、Long、Short 都是Number類的子類。
Character和Boolean 父類是Object,不屬於Number下面的子類。
查看API文檔:
Number類是抽象類別,不能直接通過new關鍵字建立。 Number類有六個方法,並且這些方法有些是abstract修飾的方法(抽象方法),Number 的子類需要覆寫這些抽象方法。
2、Integer封裝類
查看API文檔:
理解:Integer類裡麵包含一個int value,可以理解內部有個變數盒子,存放int值,也就是說Integer類裡面有個int值。
由於父類Number已經提供6個方法,子類就可以調用父類提供6個方法,把Integer對象裡面的int 值轉換成其他的6個基本類型值,比如轉換成byte,short,int,long,float,double 。
同理:對於Number子類的其他類型,比如Double類也是一樣,可以調用Number類裡面提供的6個方法把Double裡面存放的值轉換成這6個值。
查看 Integer 原始碼,可以看到 Integer 類裡面有 int 欄位,有個構造方法。
當通過Integer構造方法建立Integer對象的時候 (比如new Integer(123)),就把值,存放到 int 類型的欄位裡面。
2.1 Integer 構造方法
查看API文檔:
查看 Integer 原始碼:
可以看出通過 Integer(String s) 構造方法的源碼看出,最終還是把值賦值給變數 this.value,this.value 是指在Integer裡面定義的一個int 變數,用於存放值。
注意:
1、當試圖將字串轉換成一種數實值型別時,該字串裡麵包含不能轉換的字元時,出現異常。例如含有字母(A、B、C)或運算子(+ 、-)等。
2、不能超出 int 的範圍時,比如12345678987654321 。
3、自動裝箱拆箱
自動裝箱:從基本類型(int)轉換成封裝類型(Integer),不用手動進行轉換操作,編譯器會自動調用 Integer.valueof 方法把基本類型(int)轉換成 (Integer)類型這種方式。
方式一:通過構造方法new Integer(123);
方式二:直接賦值給Integer ;
Integer integer = 123;
自動拆箱:從封裝類型(Integer)轉換成基本類型(Int),也不用在進行手動進行轉換操作,編譯器會自動調用 Integer.intValue 把封裝類型(Integer)轉換成基本類型 (int)。
方式一:調用Integer裡的方法 intValue方法;
方式一:直接賦值給int;
8 種基本類型與封裝類型之間的轉換都支援自動拆箱和裝箱操作。
4、short類、Long類和Double類
除了這個Integer封裝類以外,還有Short,Long,Double封裝類,結構都和Integer類似。
5、Boolean類 和 Character類
Character和Boolean 父類是Object。
Boolean類無最大,最小值。
Character就表示一個字元,而String 字串表示多個字元。
6、String類
查看API文檔:
從API看出String類特點:
1.索引是從0開始的;
2.字串對象(String對象)一旦建立其長度和內容就不能更改;
建立String對象的方式:
1、直接賦值,String name = "abcdefg";
2、調用String的構造方法。
1 public class Demo { 2 /** 3 * 測試建立字串 4 */ 5 @Test 6 public void test1(){ 7 String s1 = new String(); //表示一個Null 字元串 8 String s2 = ""; 9 String s3 = null;10 11 System.out.println(s1 == s2 ); //false12 System.out.println(s1.equals(s3)); //false13 //System.out.println(s3.equals(s1)); s3 放在equals前面會報null 指標異常 java.lang.NullPointerException14 }15 }
分析:
String s1 = new String(); //s1將指向具體的String執行個體,預設值為“”,在記憶體中分配一個空間;
String s2 = " "; //s2對應一個空串,聲明對象的引用 ,在記憶體中分配一個空間;
String s3 = null; //s3引用為空白;
注意:s1和s2被執行個體化,而s3沒有執行個體化,但s1和s2所指的地址空間不同,值一樣,都為空白。
6.1 String 類常用方法
1、char charAt(int index);
取字串中指定位置的字元,index 從0 開始計算。
1 public class Demo { 2 /** 3 * 測試charAt 4 */ 5 @Test 6 public void testCharAt() { 7 String str = "abcdefg"; 8 for (int i = 0; i < str.length(); i++) { 9 char element = str.charAt(i);10 System.out.print("[" + element + "]"); //輸出:[a][b][c][d][e][f][g]11 }12 }13 }
2、int codePointAt(int index);
返回指定索引處的字元(Unicode 代碼點)。
1 public class Demo { 2 /** 3 * 測試codePointAt 4 */ 5 @Test 6 public void testCodePointAt(){ 7 String str = "abcdefg"; 8 int codePointAt = str.codePointAt(2); 9 System.out.println(codePointAt); //輸出:99 代表c 的 ASCII碼10 }11 }
3、String concat(String str);
將指定(傳入)字串串連到此(當前)字串的結尾。用於連接字串。
1 public class Demo { 2 /** 3 * 測試concat 4 */ 5 @Test 6 public void testConcat(){ 7 String str1 = "字串1111"; 8 String str2 = "字串2222"; 9 String concatStr = str1.concat(str2); //建立一個字串10 System.out.println(concatStr); //輸出:字串1111字串222211 }12 }
4、boolean endsWith(String suffix);
測試此字串是否以指定的尾碼結束。
1 public class Demo { 2 /** 3 * 測試endsWith 4 */ 5 @Test 6 public void testEndsWith(){ 7 String str = "abcd"; 8 boolean result = str.endsWith("d"); 9 System.out.println(result); //返回:true10 }11 }
5、boolean isEmpty();
若且唯若length() 為 0 時返回 true。
1 public class Demo { 2 /** 3 * 測試isEmpty 4 */ 5 @Test 6 public void testIsEmpty(){ 7 String str = ""; //不能為null 8 boolean result = str.isEmpty(); 9 System.out.println(result); //返回:true10 }11 }
6、int length();
返回當前字串長度。
7、String replace(char oldChar, char newChar);
返回一個新的字串,它是通過用 newChar 替換此字串中出現的所有 oldChar 得到的。
1 public class Demo { 2 /** 3 * 測試replace 4 */ 5 @Test 6 public void testReplace(){ 7 String str = "字串222"; 8 String newStr = str.replace("222", "替換"); 9 System.out.println(newStr); //輸出:字串替換10 }11 }
8、String substring(int beginIndex);
返回一個新的字串,從beginIndex 開始截取,它是此字串的一個子字串。
String substring(int beginIndex. int endIndex);
返回一個新字串,它是此字串的一個子字串;注意:左閉右開,左邊包括,右邊不包括。
1 public class Demo { 2 /** 3 * 測試substring 4 */ 5 @Test 6 public void testSubString(){ 7 String str1 = "abcdefg"; 8 String substring = str1.substring(1); 9 System.out.println(substring); //輸出:bcdefg10 11 String str2 = "abcdefg";12 String substring1 = str2.substring(1, 3);13 System.out.println(substring1); //輸出:bc 注意:不包含index為3的字元14 }15 }
9、String toLowerCase();
將此String 中的所有字元都轉換為小寫。
10、String toUpperCase();
將此String 中的所有字元都轉成大寫。
11、String trim();
忽略字串前置空白和尾部空白。
1 public class Demo { 2 /** 3 * 測試trim 4 */ 5 @Test 6 public void testTrim(){ 7 String str = " 233333 "; 8 String trim = str.trim(); 9 System.out.println(trim); //輸出:233333 沒有空格了10 }11 }6.2 StringBuffer 類和 StringBuilder 類
查看API文檔:
StringBuffer類常用方法
1、StringBuffer append(Object o);
將指定的任意類型對象追加到此StringBuffer 對象。
2、StringBuffer delete(int start, int end);
移除此序列的子字串中的字元。
3、StringBuffer insert(int offset, Object o);
將任意型別參數的字串表示形式插入此序列中。
4、StringBuffer replace(int start, int end, String str);
使用給定 String 中的字元替換此序列的子字串中的字元。
1 public class StringBufferTest { 2 /** 3 * 測試StringBuffer方法 4 */ 5 @Test 6 public void testStringBufferMethod(){ 7 //1.StringBuffer append(Object o); 添加 8 StringBuffer str = new StringBuffer("abcdefgh"); 9 str.append("ijk");10 System.out.println(str); //輸出:abcdefghijk11 12 //2.StringBuffer delete(int start, int end); 刪除13 str.delete(0, 3); 14 System.out.println(str); //輸出:defghijk 左閉右開[ )15 16 //3、StringBuffer insert(int offset, Object o); 插入17 str.insert(1, "333");18 System.out.println(str); //輸出:d333efghijk19 20 //4、StringBuffer replace(int start, int end, String str); 替換21 str.replace(1, 4, "222");22 System.out.println(str); //輸出:d222efghijk23 }24 }比較 StringBuffer 和 String
1 public class StringBufferTest { 2 /** 3 * 測試StringBuffer 4 * 把0-9999 整數串連成一個字串; 5 * 類似效果123456789101112....9999; 6 * 7 * 分析:1. 動態擷取10000個值,使用for迴圈 8 * 2. 定義一個Null 字元串str 9 * 3. 迴圈拼接10 */11 @Test12 public void testStringBuffer() {13 long begin1 = System.currentTimeMillis();14 String str1 = "";15 for (int i = 0; i < 10000; i++) {16 str1 += i;17 }18 System.out.println(str1);19 long end1 = System.currentTimeMillis();20 System.out.println(end1 - begin1); //輸出: 974 花費時間多,因為要建立 10000 個對象。21 22 System.out.println("=========");23 24 //使用stringBuffer 只建立一個對象25 long begin2 = System.currentTimeMillis();26 StringBuffer str2 = new StringBuffer();27 for (int i = 0; i < 10000; i++) {28 str2.append(i);29 }30 System.out.println(str2);31 long end2 = System.currentTimeMillis();32 System.out.println(end2 - begin2); //輸出: 11 時間花費非常少33 }34 }StringBuilder類
小結:
1、String:不可變得字串;
2、StringBuffer:可變的,是安全執行緒;
3、StringBuilder:可變的,是線程不安全,比StringBuffer效能高點;
4、String,StringBuffer,StringBuilder 都表示字元序列,介面都是CharSequence;
5、StringBuffer,StringBuilder中有很多和String中一樣的方法;
特有的方法: 主要是可以改變對象值中的方法(添加,刪除,插入,替換,反轉)