13 StringBuffer&陣列排序
阿新 • • 發佈:2018-12-18
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
- B:注意事項
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次