JAVA程式設計學習記錄(API常用類(二))

學程式設計的鹿發表於2018-05-09

		System.out.println(Character.toUpperCase('a'));

第五週 API常用類(二)

一 StringBuffer類

執行緒安全的可變字元序列

概念:表示的是一個本身內容可變的字串物件,包含一個緩衝區,主要用於完成字串的動態新增、插入和替換等操作。

StringBuffer的新增功能:

public StringBuffer append(String/boolean....) :在字串緩衝區中追加資料(在末尾追加),並且返回字串緩衝區本身

		//建立一個字串緩衝區物件
		StringBuffer sb = new StringBuffer();
		
		sb.append("hello");
		sb.append('A');
		sb.append(true);
		sb.append(1234);
		sb.append(3.14);
		
		System.out.println(sb);

public StringBuffer insert(int offset,String str):將當前str字串新增到指定位置處,它返回字串緩衝區本身
		//建立一個字串緩衝區物件
		StringBuffer sb = new StringBuffer();		
		
		sb.append("a1");
		sb.append("b2");
		sb.append("d4");
		sb.append("e5");
		sb.append("f6");
		
		sb.insert(4, "c3");
		
		System.out.println(sb);//a1b2c3d4e5f6
StringBuffer的刪除功能:

public StringBuffer deleteCharAt(int index):移除指定位置處的字元

		//建立一個字串緩衝區物件
		StringBuffer sb = new StringBuffer();		
		
		sb.append("a1");
		sb.append("b2");
		sb.append("d4");
		sb.append("e5");
		sb.append("f6");
		//刪除‘b’這個字元
		sb.deleteCharAt(2);
		
		System.out.println(sb);//a1b2d4e5f6-->a12d4e5f6

public StringBuffer delete(int start,int end):移除從指定位置處到end-1處的子字串

		//建立一個字串緩衝區物件
		StringBuffer sb = new StringBuffer();		
		
		sb.append("a1");
		sb.append("b2");
		sb.append("d4");
		sb.append("e5");
		sb.append("f6");
		//移除d4e5
		sb.delete(4, 8);
		
		System.out.println(sb);//a1b2d4e5f6-->a1b2f6
StringBuffer的反轉功能:

public StringBuffer reverse() :將緩衝區中的字元序列反轉取代,返回它(字串衝)本身

		//建立一個字串緩衝區物件
		StringBuffer sb = new StringBuffer();		
		
		sb.append("abcd1234");

		sb.reverse();
		
		System.out.println(sb);//4321dcba
StringBuffer的擷取功能:

public String substring(int start):從指定位置開始擷取,預設擷取到末尾,返回值不在是緩衝區本身,而是一個新的字串

		//建立一個字串緩衝區物件
		StringBuffer sb = new StringBuffer();		
		
		sb.append("HelloWorld");

		//擷取world
		//返回的是一個新字元,所以將擷取後的值賦給新定義的str
		String str = sb.substring(5);
		
		System.out.println(str);

public String substring(int start,int end) :從指定位置開始到指定位置結束擷取,包前不包後,返回值不在是緩衝區本身,而是一個新的字串

		//建立一個字串緩衝區物件
		StringBuffer sb = new StringBuffer();		
		
		sb.append("HelloWorld");

		//擷取oWo
		//因為包前不包後,所以截止到‘r’
		String str = sb.substring(4,7);
		
		System.out.println(str);
StringBuffer的替換功能:

public StringBuffer replace(int start,int end,String str) :從指定位置到指定位置結束,用新的str字串去替換,返回值是字串緩衝區本身

		//建立一個字串緩衝區物件
		StringBuffer sb = new StringBuffer();		
		
		sb.append("HelloWorld");

		sb.replace(5, 10, "China");
		
		System.out.println(sb);
StringBuffer練習

1.將陣列拼接成字串型別

package org.test_01;

public class StringBufferDemo {
	
	public static void main(String[] args) {
		//定義陣列
		int [] arr = {1,2,3};
		//方法一:String型別
		String str = arrayToString(arr);
		System.out.println(str);
		
		//方式二:StringBuffer型別
		String str2 = arrayToString2(arr);
		System.out.println(str2);
	}
	//方式二:StringBuffer型別
	private static String arrayToString2(int[] arr) {
		//建立字串緩衝區物件
		StringBuffer sb = new StringBuffer();
		//新增左中括號
		sb.append("[");
		//遍歷陣列
		for (int i = 0; i < arr.length; i++) {
			//判斷
			if(i==arr.length-1) {
				sb.append(arr[i]);
			}else {
				sb.append(arr[i]).append(",");
			}
		}
		//新增右中括號
		sb.append("]");
		return sb.toString();
	}
	
	//方式1:String型別
	private static String arrayToString(int[] arr) {
		//定義一個字串
		String result = "";
		//拼接左中括號
		result += "[";
		//遍歷陣列
		for(int x = 0 ; x < arr.length; x++) {
			//判斷
			if(x==arr.length-1) {//當遍歷到最後一個陣列時拼接右中括號
				result += arr[x];
				result += "]";
			}else {
				result += arr[x];
				result += ",";
			}
		}
		return result;
	}
}

2.判斷一個字串是否是對稱字串(方法改進)

package org.test_01;
/**
 * 用鍵盤錄入一個字串,判斷是否對稱
 */
import java.util.Scanner;

public class StringBufferTest {
	public static void main(String[] args) {
		//建立鍵盤錄入物件
		Scanner sc = new Scanner(System.in);
		//接收資料
		System.out.println("請輸入一個字串");
		String line = sc.nextLine();
		//方法改進
		boolean flag = isSame(line);
		if(flag) {
		System.out.println("對稱");
		}else {
			System.out.println("不對稱");
		}
	}
	public static boolean isSame(String s) {
		//建立字串緩衝區物件
//		StringBuffer sb = new StringBuffer(s);
//		String str = sb.reverse().toString();
//		return str.equals(s);
		
		//一步完成
		return new StringBuffer(s).reverse().toString().equals(s);
	}
}
幾個面試題

1.StringBuffer,String,StringBuilder的區別?

StringBuffer和StringBuilder都是一個可變的字元序列,提供一個緩衝區(兩者都看做容器);

StringBuffer:執行緒安全的,同步的,執行效率低

StringBuilder:執行緒不安全的,不同步的,執行效率高,並且單執行緒中優先採用StringBuilder

StringBuffer 執行效率雖然低,但是由於String型別,並且他可變的字元序列,提供了緩衝區

2.StringBuffer和陣列的區別?

陣列: 它是可以儲存多個資料的容器,並且多個資料的型別必須一致. //陣列長度功能: length屬性

StringBuffer: 它是容器,它在字串緩衝區始終儲存的只能是字串型別的資料. //獲取緩衝區的長度: length( ); 


二 資料型別包裝器類

Java使用簡單的資料型別, 例如整型(int)和字元(char), 這些資料型別不是物件層次結構的組成部分. 它們通過值傳遞而不能直接通過引用傳遞給方法. 有時需要對這些簡單的型別建立物件表示式,例如, 當把資料放到集合中時, 需要首先將其包裝成物件. 為了能夠用物件的形式代表簡單資料型別, Java提供了與每一種簡單型別相對應的類. 本質上, 這些類包裝(wrap)了簡單型別的資料. 因此,通常將它們稱為型別包裝器或者包裝器類.

基本資料型別都有一個對應的包裝型別, 目的就是為了將基本資料型別可以同String型別之間互相轉換.

/**
 *	
 * 	byte				Byte
 *	short				Short
 *	int				Integer	
 *	long				Long
 *	float				Float
 *	double				Double
 *	char				character
 *	boolean				Boolean
 * 
 */

1. Integer類

Integer類是int型別的包裝類型別

獲取Integer的最值

public static final int MAX_VALUE    //最大值

System.out.println(Integer.MAX_VALUE);    //2147483647

public static final int MIN_VALUE    //最小值

System.out.println(Integer.MIN_VALUE);    //-2147483648
Integer提供了靜態功能:

public static String toBinaryString(int i)    //以二進位制(基數 2)無符號整數形式返回一個整數引數的字串表示形式。

System.out.println(Integer.toBinaryString(10086));    //10011101100110

public static String toOctalString(int i)    //以八進位制(基數 8)無符號整數形式返回一個整數引數的字串表示形式。

System.out.println(Integer.toOctalString(10086));    //23546

public static String toHexString(int i)    //以十六進位制(基數 16)無符號整數形式返回一個整數引數的字串表示形式。

System.out.println(Integer.toHexString(10086));    //2766
Integer的構造方法:

    public Integer(int value)

    public Integer(String s)

執行時的常見異常

 java.lang.NumberFormatException    //當應用程式試圖將字串轉換成一種數值型別,但該字串不能轉換為適當格式時,丟擲該異常。

//	Integer iii = new Integer ("abc");	//列印不出來,因為該字串不能轉換為數值型別
	Integer iiii = new Integer("100");	//可以列印出來,因為用parseInt方法把字串型別轉換為數值型別
		
//	System.out.println(iii);	//丟擲異常java.lang.NumberFormatException
	System.out.println(iiii);
int-->String&String-->int

將int型別轉換為String型別

    valueOf ( int i )

		//int-->String
		int num = 100;
		
		//方式1:字串拼接
		String str = "" + num;
		System.out.println(str);
		
		//方式2:valueOf(int i)
		//int-->Integer-->String
		Integer i = Integer.valueOf(num);
		String str2 = i.toString();
		System.out.println(str2);
		
		//方式3:靜態toString(int i)	static String toString(int i) 
		String str3 = Integer.toString(num);
		System.out.println(str3);//驗證是不是字串型別,如果是,則會自動拼接為10020

結果:

100
100
10020

將String型別轉換為int型別

    static int parseInt ( String s )

		//String-->int
		String s ="100";
		
		//方式1:String-->Integer-->int
		Integer ii = new Integer(s);
		int num1 = ii.intValue();
		System.out.println(num1+20);//驗證是不是數值型別,如果是,則會自動加和為120
		
		//方式2:(常用)public static int parseInt(String s)
		int num2 = Integer.parseInt(s);
		System.out.println(num2+30);//驗證是不是數值型別,如果是,則會自動加和為130

結果:

120
130

jdk5以後的特性:自動拆裝箱

String-->StringBuffer、int-->Integer(是int型別的包裝類型別)、char-->Character(char型別的包裝類型別)等等

int i = 5;

Integer ii = i ;//這是自動裝箱

int j = ii;//這是自動拆箱

//建立Integer物件
//		Integer i = new Integer(100) ;
		Integer i = 100 ;
		
		i += 200;		//先拆箱(Integer-->int),後裝箱(int值---->Integer)
		//引用型別 += 基本型別     
		System.out.println("i:"+i);
		
		/**
		 * 反編譯程式碼:
		 * 
		 * 	Integer i = Integer.valueOf(100);
			i = Integer.valueOf(i.intValue()  + 200);//(int型別的100 +200)
			System.out.println((new StringBuilder("i:")).append(i).toString());
		 */

為什麼會有自動拆裝箱?

比如int和Integer,int是基本型別,Integer是是int的包裝類,在jdk5之前int不能直接賦值給Integer的,正確將int型別賦值給Integer的方式是:Integer integer = new Integer(5);而jdk5以後系統會自動完成轉換

三 Character類

Character是char型別的包裝類型別

Character類的判斷功能:

public static boolean isDigit(char ch): 確定指定字元是否為數字

		System.out.println(Character.isDigit('a'));
		
		System.out.println(Character.isDigit('0'));

public static boolean isLowerCase(int ch): 確定是否是小寫字母字元

		System.out.println(Character.isUpperCase('a'));

public static boolean isUpperCase(int ch): 確定是否大寫字母字元

		System.out.println(Character.isLowerCase('b'));
兩個轉換功能

public static int toLowerCase(int codePoint)

		System.out.println(Character.toUpperCase('a'));

public static int toUpperCase(int codePoint)

		System.out.println(Character.toLowerCase('A'));
練習:

需求:鍵盤錄入一個字串,統計當前字串中大寫字母字元,小寫字母字元,數字字元的個數(不考慮其他字元) 

public class CharacterDemo {

	public static void main(String[] args) {
		// 定義三個統計變數
		int bigCount = 0;
		int smallCount = 0;
		int numCount = 0;
		// 建立鍵盤錄入物件
		Scanner sc = new Scanner(System.in);
		// 接收資料
		System.out.println("請輸入一個字串:");
		String line = sc.nextLine();
		// 字串轉字元陣列
		char[] chs = line.toCharArray();
		// 遍歷
		for (int i = 0; i < chs.length; i++) {
			char ch = chs[i];
			// 判斷統計
			if (Character.isUpperCase(ch)) {
				bigCount++;
			} else if (Character.isLowerCase(ch)) {
				smallCount++;
			} else if (Character.isDigit(ch)) {
				numCount++;
			}

		}
		// 輸出結果
		System.out.println("大寫字母字元有:" + bigCount + "個");
		System.out.println("小寫字母字元有:" + smallCount + "個");
		System.out.println("數字字元有:" + numCount + "個");

	}

}





相關文章