Java程式設計基礎14——常見物件_StringBuffer&陣列排序
13.01_常見物件(StringBuffer類的概述)
-
A:StringBuffer類概述
- 通過JDK提供的API,檢視StringBuffer類的說明
- 執行緒安全的可變字元序列 (一個類似於 String 的字串緩衝區,但不能修改 : 不能像String那樣用 + 連線來修改String)
-
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(): 返回長度(容器中的字元個數)。 實際值
-
C:案例演示
- 構造方法和長度方法的使用
13.03_常見物件(StringBuffer的新增功能)
-
A:StringBuffer的新增功能
-
public StringBuffer append(String str):
- 可以把任意型別資料新增到字串緩衝區裡面,並返回字串緩衝區本身
- StringBuffer是字串緩衝區,當new的時候是在堆記憶體建立了一個物件,底層是一個長度為16的字元陣列當呼叫新增的方法時,不會再重新建立物件,而是在不斷向原緩衝區新增字元
-
public StringBuffer insert(int offset,String str):
- 在指定位置把任意型別的資料插入到字串緩衝區裡面,並返回字串緩衝區本身
-
13.04_常見物件(StringBuffer的刪除功能)
-
A:StringBuffer的刪除功能
-
public StringBuffer deleteCharAt(int index):
- 刪除指定位置的字元,並返回本身
-
public StringBuffer delete(int start,int end):
- 刪除從指定位置開始指定位置結束的內容,並返回本身
-
13.05_常見物件(StringBuffer的替換和反轉功能)
-
A:StringBuffer的替換功能
-
public StringBuffer replace(int start,int end,String str):
- 從start開始到end用str替換
-
-
B:StringBuffer的反轉功能
-
public StringBuffer reverse():
- 字串反轉
-
13.06_常見物件(StringBuffer的擷取功能及注意事項)
-
A:StringBuffer的擷取功能
-
public String substring(int start):
- 從指定位置擷取到末尾
-
public String substring(int start,int end):
- 擷取從指定位置開始到結束位置,包括開始位置,不包括結束位置
-
-
B:注意事項
- 注意:返回值型別不再是StringBuffer本身
13.07_常見物件(StringBuffer和String的相互轉換)
-
A:String -- StringBuffer
- a:通過構造方法
- b:通過append()方法
-
B:StringBuffer -- String
- a:通過構造方法
- b:通過toString()方法
- c:通過subString(0,length);
13.08_常見物件(把陣列轉成字串)
-
A:案例演示
- 需求:把陣列中的資料按照指定個格式拼接成一個字串
-
舉例:
int[] arr = {1,2,3};
輸出結果:
"[1, 2, 3]"
用StringBuffer的功能實現
13.09_常見物件(字串反轉)
- A:案例演示
-
需求:把字串反轉
舉例:鍵盤錄入"abc" 輸出結果:"cba"
用StringBuffer的功能實現
13.10_常見物件(StringBuffer和StringBuilder的區別)
-
A:StringBuilder的概述
- 通過檢視API瞭解一下StringBuilder類
-
B:面試題
- String,StringBuffer,StringBuilder的區別
- StringBuffer和StringBuilder的區別
- StringBuffer是jdk1.0版本的,是執行緒安全的,效率低
- StringBuilder是jdk1.5版本的,是執行緒不安全的,效率高
- String和StringBuffer,StringBuilder的區別
- String是一個不可變的字元序列
- StringBuffer,StringBuilder是可變的字元序列
13.11_常見物件(String和StringBuffer分別作為引數傳遞)
-
A:形式引數問題
- String作為引數傳遞
- StringBuffer作為引數傳遞
-
B:案例演示
- String和StringBuffer分別作為引數傳遞問題
基本資料型別的值傳遞,不改變其值
引用資料型別的值傳遞,改變其值
String類雖然是引用資料型別,但是他當作引數傳遞時和基本資料型別是一樣的(因為String類一旦被初始化,就不會被改變決定的)
public static void main(String[] args) {
String s = "baiyun";
System.out.println(s);
change(s);
System.out.println(s);
System.out.println("---------------------");
StringBuffer sb = new StringBuffer();
sb.append("baiyun");
System.out.println(sb);
change(sb);
System.out.println(sb);
}
public static void change(StringBuffer sb) {
sb.append("duoduo");
}
public static void change(String s) {
s += "duoduo";
}
13.12_常見物件(陣列高階氣泡排序原理圖解)
- A:畫圖演示
-
需求:
陣列元素:{24, 69, 80, 57, 13} 請對陣列元素進行排序。 氣泡排序 相鄰元素兩兩比較,大的往後放,第一次完畢,最大值出現在了最大索引處
13.13_常見物件(陣列高階氣泡排序程式碼實現)
-
A:案例演示
- 陣列高階氣泡排序程式碼
13.14_常見物件(陣列高階選擇排序原理圖解)
-
A:畫圖演示
-
需求:
- 陣列元素:{24, 69, 80, 57, 13}
- 請對陣列元素進行排序。
-
選擇排序
- 從0索引開始,依次和後面元素比較,小的往前放,第一次完畢,最小值出現在了最小索引處
-
13.15_常見物件(陣列高階選擇排序程式碼實現)
-
A:案例演示
- 陣列高階選擇排序程式碼
/**
* * A:案例演示
* 陣列高階氣泡排序程式碼
*/
public static void main(String[] args) {
int[] arr = {24, 69, 80, 57, 13};
bubbleSort(arr);
//selectSort(arr);
print(arr);
}
/*
* 氣泡排序
* 1,返回值型別,void
* 2,引數列表,int[] arr
*
* 第一次:arr[0]與arr[1],arr[1]與arr[2],arr[2]與arr[3],arr[3]與arr[4]比較4次
第二次:arr[0]與arr[1],arr[1]與arr[2],arr[2]與arr[3]比較3次
第三次:arr[0]與arr[1],arr[1]與arr[2]比較2次
第四次:arr[0]與arr[1]比較1次
*/
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;*/
swap(arr,j,j+1);
}
}
}
}
/*
* 列印陣列
* 1,返回值型別void
* 2,引數列表int[]arr
*/
public static void print(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
/*
* 選擇排序
* 1,返回值型別void
* 2,引數列表int[] arr
*
* 第一次:arr[0]分別與arr[1-4]比較,比較4次
第二次:arr[1]分別與arr[2-4]比較,比較3次
第三次:arr[2]分別與arr[3-4]比較,比較2次
第四次:arr[3]與arr[4]比較,比較1次
*/
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) { //只需要比較arr.length-1次
for (int j = i + 1; j < arr.length; j++) {
if(arr[i] > arr[j]) {
/*int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;*/
swap(arr,i,j);
}
}
}
}
/*
* 換位操作
* 1,返回值型別,void
* 2,引數列表int[] arr.int i,int j
*
* 如果某個方法,只針對本類使用,不想讓其他類使用就可以定義成私有的
*/
private static void swap(int[] arr,int i,int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
13.16_常見物件(陣列高階二分查詢原理圖解)
-
A:畫圖演示
- 二分查詢: 查詢元素對應的索引
- 前提:陣列元素有序
13.17_常見物件(陣列高階二分查詢程式碼實現及注意事項)
-
A:案例演示
- 陣列高階二分查詢程式碼
-
B:注意事項
-
如果陣列無序,就不能使用二分查詢。
- 因為如果你排序了,但是你排序的時候已經改變了我最原始的元素索引。
-
/*
* 二分查詢
* 1,返回值型別,int
* 2,引數列表int[] arr,int value
*/
public static int getIndex(int[] arr, int value) {
int min = 0;
int max = arr.length - 1;
int mid = (min + max) / 2;
while(arr[mid] != value) { //當中間值不等於要找的值,就開始迴圈查詢
if(arr[mid] < value) { //當中間值小於了要找的值
min = mid + 1; //最小的索引改變
}else if (arr[mid] > value){ //當中間值大於了要找的值
max = mid - 1; //最大的索引改變
}
mid = (min + max) / 2; //無論最大還是最小改變,中間索引都會隨之改變
if(min > max) { //如果最小索引大於了最大索引,就沒有查詢的可能性了
return -1; //返回-1
}
}
return mid;
}
13.18_常見物件(Arrays類的概述和方法使用)
-
A:Arrays類概述
- 針對陣列進行操作的工具類。
- 提供了排序,查詢等功能。
-
B:成員方法
- public static String toString(int[] a)
- public static void sort(int[] a)
-
public static int binarySearch(int[] a,int key)
public static String toString(int[] a) { if (a == null) //如果傳入的陣列是null return "null"; //返回null int iMax = a.length - 1; //iMax最大索引 if (iMax == -1) //如果陣列中沒有元素 return "[]"; //返回[] StringBuilder b = new StringBuilder(); //執行緒不安全,效率高 b.append('['); //將[新增到字串緩衝區中 for (int i = 0; ; i++) { //遍歷陣列,判斷語句沒有寫預設是true b.append(a[i]); //把第一個元素新增進字串緩衝區 if (i == iMax) //如果索引等於了最大索引值 return b.append(']').toString(); //將]新增到字串緩衝區,再轉換成字串並返回 b.append(", "); //如果不等於最大索引就將", "新增到緩衝區 } }
public static int binarySearch(int[] a, int key) {
return binarySearch0(a, 0, a.length, key);
}
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex; //最小索引0
int high = toIndex - 1; //最大索引陣列長度-1
while (low <= high) { //最小索引小於等於最大索引可以迴圈判斷
int mid = (low + high) >>> 1; //求出中間索引值,(最小+最大)/2
int midVal = a[mid]; //通過中間索引獲取中間值
if (midVal < key) //中間索引對應的值小於查詢的值
low = mid + 1; //最小索引變化
else if (midVal > key) //中間索引對應的值大於查詢的值
high = mid - 1; //最大索引變化
else
return mid; // key found //既不大也不小:找到了
}
return -(low + 1); // key not found.//-插入點 - 1
}
13.19_常見物件(基本型別包裝類的概述)
-
A:為什麼會有基本型別包裝類
- 將基本資料型別封裝成物件的好處在於可以在物件中定義更多的功能方法操作該資料。
-
B:常用操作
- 常用的操作之一:用於基本資料型別與字串之間的轉換。
- C:基本型別和包裝類的對應
byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
13.20_常見物件(Integer類的概述和構造方法)
-
A:Integer類概述
- 通過JDK提供的API,檢視Integer類的說明
- Integer 類在物件中包裝了一個基本型別 int 的值,
- 該類提供了多個方法,能在 int 型別和 String 型別之間互相轉換,
- 還提供了處理 int 型別時非常有用的其他一些常量和方法
-
B:構造方法
- public Integer(int value)
- public Integer(String s)
-
C:案例演示
- 使用構造方法建立物件
13.21_常見物件(String和int型別的相互轉換)
-
A:int -- String
- a:和""進行拼接
- b:public static String valueOf(int i)
- c:int -- Integer -- String(Integer類的toString方法())
- d:public static String toString(int i)(Integer類的靜態方法)
-
B:String -- int
-
a:String -- Integer -- int
- int intValue() 以 int 型別返回該 Integer 的值。
-
public static int parseInt(String s)基本資料型別包裝類有八種,其中七種都有parseXxx的方法,可以將這七種的字串表現形式轉換成基本資料型別*
//String s2 = "abc";//char c = Character.parseXxx
//char的包裝類Character中沒有pareseXxx的方法: char c 只能接收一個字元 //字串到字元的轉換通過toCharArray()就可以把字串轉換為字元陣列
-
13.22_常見物件(JDK5的新特性自動裝箱和拆箱)
-
A:JDK5的新特性
- 自動裝箱:把基本型別轉換為包裝類型別
- 自動拆箱:把包裝類型別轉換為基本型別
-
B:案例演示
- JDK5的新特性自動裝箱和拆箱
int x = 100;
Integer i1 = new Integer(x); //將基本資料型別包裝成物件:裝箱
int y = i1.intValue(); //將物件轉換為基本資料型別:拆箱
Integer i2 = 100; //自動裝箱,把基本資料型別轉換成物件
int z = i2 + 200; //自動拆箱,把物件轉換為基本資料型別
System.out.println(z);
Integer i3 = null;
int a = i3 + 100; //底層用i3呼叫intValue,但是i3是null,null呼叫方法就會出現
System.out.println(a); //空指標異常java.lang.NullPointerException
-
C:注意事項
- 在使用時,Integer x = null;程式碼就會出現NullPointerException。
- 建議先判斷是否為null,然後再使用。
13.23_常見物件(Integer的面試題)
- A:Integer的面試題
看程式寫結果 Integer i1 = new Integer(97); Integer i2 = new Integer(97); System.out.println(i1 == i2); System.out.println(i1.equals(i2)); System.out.println("-----------"); Integer i3 = new Integer(197); Integer i4 = new Integer(197); System.out.println(i3 == i4); System.out.println(i3.equals(i4)); System.out.println("-----------"); Integer i5 = 97; Integer i6 = 97; System.out.println(i5 == i6); System.out.println(i5.equals(i6)); System.out.println("-----------"); Integer i7 = 197; Integer i8 = 197; System.out.println(i7 == i8); System.out.println(i7.equals(i8));
/*
* -128到127是byte的取值範圍,如果在這個取值範圍內,自動裝箱就不會新建立物件,而是從常量池中獲取
* 如果超過了byte取值範圍就會再新建立物件
*
* public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high) //i>= -128 && i <= 127
return IntegerCache.cache[i + (-IntegerCache.low)]; //[索引:0-255] 如果傳入127,索引就變成127+(-(-128)),即最大索引255
else {
return new Integer(i); //
}
}
*/