1. 程式人生 > >13 StringBuffer&陣列排序

13 StringBuffer&陣列排序

13.01_常見物件(StringBuffer類的概述)

  • A:StringBuffer類的概述 * 執行緒安全的可變字元序列
  • B:StringBuffer與String的區別 * String是一個不可變的字元序列,一旦初始化就不能變 * StringBuffer是一個可變的字元序列

13.02_常用物件(StringBuffer類的構造方法)

  • A:StringBuffer類的構造方法 * public StringBuffer():無參構造方法 * public StringBuffer(int capacity):指定容量的字串緩衝區物件 * public StringBuffer(String str):指定字串內容的字串緩衝區物件
  • B:StringBuffer類的方法 * public int capacity(): 返回當前容量。理論值(不掌握) * public int length(): 返回長度(字元數)。實際值
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();  
		System.out.println(sb.length());			//容器中的字元個數,實際值
		System.out.println(sb.capacity());			//容器的初始容量,理論值
		
		StringBuffer sb2 = new StringBuffer(10);  //指定初始容量
		System.out.println(sb2.length());
		System.out.println(sb2.capacity());
		
		StringBuffer sb3 = new StringBuffer("heima");
		System.out.println(sb3.length());			//實際字元的個數
		System.out.println(sb3.capacity());			//字串的length + 初始容量
		
	}

13.03_append()和insert()方法 新增

  • A:StringBuffer的新增功能 * public StringBuffer append(String str): * 可以把任意型別資料新增到字串緩衝區裡面,並返回字串緩衝區本身 * public StringBuffer insert(int offset,String str): * 在指定位置把任意型別的資料插入到字串緩衝區裡面,並返回字串緩衝區本身

StringBuffer是字串緩衝區,當new的時候是在堆記憶體建立了一個物件,底層是一個長度為16的字元陣列當呼叫新增的方法時,不會再重新建立物件,在不斷向原緩衝區新增字元

	public static void main(String[] args) {
		//demo1();
		StringBuffer sb = new StringBuffer("1234");
		sb.insert(3, "heima");						//在指定位置新增元素,如果沒有指定位置的索引就會報索引越界異常
		
		System.out.println(sb);
	}

	private static void demo1() {
		StringBuffer sb = new StringBuffer();
		StringBuffer sb2 = sb.append(true);//每次返回的引用雖然不同,但是指向的都是同一個物件
		StringBuffer sb3 = sb.append("heima");
		StringBuffer sb4 = sb.append(100);
		
		
		System.out.println(sb.toString());			//StringBuffer類中重寫了toString方法,顯示的是物件中的屬性值
		System.out.println(sb2.toString());
		System.out.println(sb3.toString());
		System.out.println(sb4.toString());
	}

13.04_ delete() 刪除

  • A:StringBuffer的刪除功能 * public StringBuffer deleteCharAt(int index): * 刪除指定位置的字元,並返回本身 * public StringBuffer delete(int start,int end): * 刪除從指定位置開始指定位置結束的內容,並返回本身
public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
		//sb.deleteCharAt(5);					//當緩衝區中這個索引上沒有元素的時候就會報StringIndexOutOfBoundsException
		sb.append("heima");
		//sb.deleteCharAt(4);					//根據索引刪除掉索引位置上對應的字元
		//sb.delete(0, 2);						//刪除的時候是包含頭,不包含尾
		//System.out.println(sb);
		//sb.delete(0, sb.length());				//清空緩衝區
		//System.out.println(sb);
		
		sb = new StringBuffer();				//不要用這種方式清空緩衝區,原來的會變成垃圾,浪費記憶體
		System.out.println(sb);
	}

13.05_替換和反轉

  • A:StringBuffer的替換功能 * public StringBuffer replace(int start,int end,String str): * 從start開始到end用str替換 * B:StringBuffer的反轉功能 * public StringBuffer reverse(): * 字串反轉
public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("heima");
		//sb.replace(0, 3, "bai");					//替換
		//System.out.println(sb);
		
		sb.reverse();
		System.out.println(sb);
	}

13.06_擷取

  • A:StringBuffer的擷取功能 * public String substring(int start): * 從指定位置擷取到末尾 * public String substring(int start,int end): * 擷取從指定位置開始到結束位置,包括開始位置,不包括結束位置
    • B:注意事項
      • 注意:返回值型別不再是StringBuffer本身,而是String
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("woaiheima");
		//String str = sb.substring(4);
		//System.out.println(str);
		
		//System.out.println(sb);
		
		String str3 = sb.substring(4, 7);
		System.out.println(str3);
	}

13.07_ String 與 StringBuffer的轉換

  • A:String – StringBuffer * a:通過構造方法 * b:通過append()方法
  • B:StringBuffer – String * a:通過構造方法 * b:通過toString()方法 * c:通過subString(0,length)
public static void main(String[] args) {
		//demo1();
		StringBuffer sb = new StringBuffer("heima");
		
		String s1 = new String(sb);						//通過構造將StringBuffer轉換為String
		System.out.println(s1);
		
		String s2 = sb.toString();						//通過toString方法將StringBuffer轉換為String
		System.out.println(s2);
		
		String s3 = sb.substring(0, sb.length());		//通過擷取子字串將StringBuffer轉換為String
		System.out.println(s3);
	}

	private static void demo1() {
		StringBuffer sb1 = new StringBuffer("heima");			//通過構造方法將字串轉換為StringBuffer物件
		System.out.println(sb1);
		
		StringBuffer sb2 = new StringBuffer();
		sb2.append("heima");									//通過append方法將字串轉換為StringBuffer物件
		System.out.println(sb2);
	}

13.08_練習

	/**
	 * * 需求:把陣列中的資料按照指定個格式拼接成一個字串
	* 
			舉例:
				int[] arr = {1,2,3};	
			輸出結果:
				"[1, 2, 3]"
				
			用StringBuffer的功能實現
	 */
	public static void main(String[] args) {
		int[] arr = {1,2,3};
		System.out.println(arrayToString(arr));
	}

	/*
	 * 將陣列轉換為字串
	 * 1,返回值型別String
	 * 2,引數列表int[]
	 * 
	 * arrayToString 將陣列轉換為字串
	 * array2String		2與to的發音一樣就用2替換了to,後來演變成了一種書寫習慣
	 * dom4j  domForJ
	 */
	
	public static String arrayToString(int[] arr) {
		StringBuffer sb = new StringBuffer();				//建立字串緩衝區物件
		sb.append("[");										//將[新增到緩衝區
		
		//{1,2,3}
		for (int i = 0; i < arr.length; i++) {				//遍歷陣列
			//sb.append(arr[i] + ", ");						//這樣做沒有]
			if(i == arr.length - 1) {
				sb.append(arr[i]).append("]");				//[1, 2, 3]
			}else {
				sb.append(arr[i]).append(", ");				//[1, 2,
			}
		}
		return sb.toString();
	}
}

13.09_練習 字串反轉

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);				//建立鍵盤錄入物件
		String line = sc.nextLine();						//將鍵盤錄入的字串儲存在line中

		System.out.println(revString(line));
	}
	/*
	 * 將字串反轉
	 * 1,返回值型別String
	 * 2,引數列表String line
	 */
	
	public static String revString(String line) {
		StringBuffer sb = new StringBuffer(line);			//將字串轉換為StringBuffer物件
		sb.reverse();										//將緩衝區的內容反轉
		
		return sb.toString();
	}

13.10_StringBuffer和StringBuilder區別

  • 面試題:
    • StringBuffer和StringBuilder的區別

      • StringBuffer是jdk1.0版本,是執行緒安全的,效率低
      • StringBuilder是jdk1.5版本,是執行緒不安全的,效率高
    • StringBuffer,StringBuilder,String區別

      • String是一個不可變的字元序列
      • StringBuffer,StringBuilder是可變的字元序列

13.11_String和StringBuffer做引數時的區別

  • A:形式引數問題 * String作為引數傳遞 * StringBuffer作為引數傳遞
  • B:案例演示 * String和StringBuffer分別作為引數傳遞問題
public static void main(String[] args) {
		int a=10;
		String s = "heima";
		System.out.println(s);
		change(s,a); //此方法彈棧之後“heimaitcast”就變成了垃圾
		System.out.println(s);//故此處列印的還是最開始的 "heima"物件
		System.out.println(a);//10  基本資料型別的值傳遞,不改變其值
		
		System.out.println("---------------------");
		StringBuffer sb = new StringBuffer();
		sb.append("heima");
		System.out.println(sb);
		change(sb);
		System.out.println(sb);//引用資料型別的值傳遞,改變其值
	}

	public static void change(StringBuffer sb) {
		sb.append("itcast");
	}

	public static void change(String s,int a) {
		s += "itcast";
		a=a+10;
	}

基本資料型別的值傳遞,不改變其值(為啥) 引用資料型別的值傳遞,改變其值 String類雖然是引用資料型別,但是他當作引數傳遞時和基本資料型別是一樣的

13.12_陣列高階氣泡排序原理圖解

  • 氣泡排序:輕的上浮,沉的下降
  • 陣列元素:{24,69,80,57,13}
  • 兩個相鄰位置比較,如果前面的元素比後面的元素大就換位置
  • 第一次:arr[0]與arr[1],arr[1]與arr[2],arr[2]與arr[3],arr[3]與arr[4]比較四次,最大的數移到最後的位置
  • 第二次:arr[0]與arr[1],arr[1]與arr[2],arr[2]與arr[3]比較三次
  • 第三次:arr[0]與arr[1],arr[1]與arr[2]比較二次
  • 第四次:arr[0]與arr[1]比較一次

13.13_陣列高階氣泡排序程式碼實現

	public static void main(String[] args) {
		int[] arr = {24, 69, 80, 57, 13};
		bubbleSort(arr);
		print(arr);
	}
	
	public static void bubbleSort(int[] arr) {
		for (int i = 0; i < arr.length - 1; i++) {				//外迴圈只需要比較arr.length-1次就可以了
			for (int j = 0; j < arr.length - 1 - i; j++) {		//-1為了防止索引越界,-i為了提高效率
				if(arr[j] > arr[j+1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j+1] = temp;
				}
			}
		}
	}
	
public static void print(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
	}

13.14_陣列高階選擇排序原理圖解

  • 選擇排序:用一個索引位置上的元素,依次與其他索引位置上的元素比較,符合小的在前大的在後就不變位置,如果有一對比較不符合就將這兩個元素交換位置
  • 第一次比較,找到最小的數且放在了第一個位置,該數不參與第二次比較
  • 以此類推
    • 第一次:arr[0]分別與arr[1-4]比較,比較4次
    • 第二次:arr[1]分別與arr[2-4]比較,比較3次
    • 第三次:arr[2]分別與arr[3-4]比較,比較2次
    • 第四次:arr[3]與arr[4]比較,比較1次

13.15_陣列高階選擇排序程式碼實現

13.16_陣列高階二分查詢原理圖解

13.17_陣列高階二分查詢程式碼實現及注意事項

13.18_

13.19_

13.20_

13.21_

13.22_