------- android培訓、java培訓、期待與您交流! ----------
13.01 StringBuffer的概述
StringBuffer類概述:線程安全的可變字符序列。一個類似於 String 的字符串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。
StringBuffer和String的區別:StringBuffer長度和內容可變,String不可變。使用StringBuffer做字符串的拼接不會浪費太多資源
13.02 StringBuffer類的構造方法
1. public StringBuffer():
構造一個其中不帶字符的字符串緩沖區,其初始容量為 16 個字符
2. public StringBuffer(int capacity):
構造一個不帶字符,但具有指定初始容量的字符串緩沖區
3. public StringBuffer(String str):
構造一個字符串緩沖區,並將其內容初始化為指定的字符串內容。該字符串的初始容量為 16加上字符串參數的長度
例:
1 StringBuffer sb1 = new StringBuffer();
2 System.out.println(sb1.capacity());//16
3 System.out.println(sb1.length());//0
4
5 StringBuffer sb2 = new StringBuffer("hello");
6 System.out.println(sb2.capacity());//21
7 System.out.println(sb2.length());//5
13.03 StringBuffer的添加功能
1. public StringBuffer append(String str):
將指定的字符串追加到此字符序列
2. public StringBuffer insert(int offset,String str):
將字符串插入此字符序列中
13.04 StringBuffer的刪除功能
1. public StringBuffer deleteCharAt(int index):
移除此序列指定位置的 char。此序列將縮短一個 char
2. public StringBuffer delete(int start,int end):
移除此序列的子字符串中的字符。該子字符串從指定的 start 處開始,一直到索引 end - 1 處的字符,如果不存在這種字符,則一直到序列尾部。如果 start 等於 end,則不發生任何更改
13.05 StringBuffer的替換功能
public StringBuffer replace(int start,int end,String str):
使用給定 String 中的字符替換此序列的子字符串中的字符
13.06 StringBuffer的反轉功能
public StringBuffer reverse():將此字符序列用其反轉形式取代
13.07 StringBuffer的截取功能
1. public String substring(int start)
返回一個新的 String,它包含此字符序列當前所包含的字符子序列
2. public String substring(int start,int end)
返回一個新的 String,它包含此序列當前所包含的字符子序列。該子字符串從指定的 start 處開始,一直到索引 end - 1 處的字符
13.08 StringBuffer和String的相互轉換
String和StringBuffer的相互轉換
Stirng s;
1.StringBuffer sb = new StringBuffer (s);
2.StringBuffer sb = new StringBuffer (); sb.append(s);
1.String s = new String(sb);
2.String s = sb.toString();
13.09 把數組拼接成指定格式的字符串案例
1 public class Practice
2 {
3 public static void main(String[] args)
4 {
5 //定義數組
6 int[] arr = {23,52,12,63,25};
7 String s = arrToString(arr);
8 System.out.println(s);
9 }
10 public static String arrToString(int[] arr)
11 {
12 StringBuffer sb = new StringBuffer("[");
13 for (int i = 0; i < arr.length; i++)
14 {
15 if(i == arr.length -1)
16 {
17 sb.append(arr[i]);
18 }
19 else
20 {
21 sb.append(arr[i]).append(", ");
22 }
23 }
24 sb.append("]");
25 return sb.toString();
26 }
27 }
13.10 字符串反轉功能案例
1 import java.util.Scanner;
2
3 public class Practice
4 {
5 public static void main(String[] args)
6 {
7 Scanner sc = new Scanner(System.in);
8 System.out.println("請輸入數據:");
9 String str = sc.nextLine();
10 String s = myReverse(str);
11 System.out.println(s);
12 }
13 public static String myReverse(String s)
14 {
15 return new StringBuffer(s).reverse().toString();
16 }
17 }
13.11 判斷一個字符串是否對稱案例
判斷一個字符串是否是對稱字符串,例"abc"不是對稱字符串,"aba"、"abba"、"aaa"、"mnanm"是對稱字符串
1 public class Practice
2 {
3 public static void main(String[] args)
4 {
5 String s = "abcba";
6 System.out.println(isSame2(s));
7 }
8 //方式1
9 public static String isSame(String s)
10 {
11 // 把字符串轉成字符數組
12 char[] chs = s.toCharArray();
13 for (int start = 0, end = chs.length - 1; start <= end; start++, end--)
14 {
15 if (chs[start] != chs[end])
16 {
17 return "不對稱";
18 }
19 }
20 return "對稱";
21 }
22 //方式2
23 public static boolean isSame2(String s)
24 {
25 return new StringBuffer(s).reverse().toString().equals(s);
26 }
27 }
13.12 StringBuffer的兩個面試題
第1題:String,StringBuffer,StringBuilder的區別
1.String是內容不可變的,而StringBuffer和StringBuilder都是內容可變的
2.StringBuffer是同步的,數據安全,效率低
StringBuilder是不同步的,數據不安全,效率高
第2題:StringBuffer和數組的區別
StringBuffer和數組都是可以裝數據的容器
StringBuffer可以存儲任意類型的數據,但最終是一個字符串數據
數組只能存儲同一種數據類型的數據
13.13 String和StringBuffer分別作為參數傳遞
例:
1 public class Practice
2 {
3 public static void main(String[] args)
4 {
5 String s1 = "hello";
6 String s2 = "world";
7 System.out.println(s1 + "---" + s2);
8 change(s1, s2);
9 System.out.println(s1 + "---" + s2);
10
11 StringBuffer sb1 = new StringBuffer("hello");
12 StringBuffer sb2 = new StringBuffer("world");
13 System.out.println(sb1 + "---" + sb2);
14 change(sb1, sb2);
15 System.out.println(sb1 + "---" + sb2);
16 }
17 public static void change(StringBuffer sb1, StringBuffer sb2)
18 {
19 sb1 = sb2;
20 sb2.append(sb1);
21 }
22
23 public static void change(String s1, String s2)
24 {
25 s1 = s2;
26 s2 = s1 + s2;
27 }
28 }
運行結果:
hello---world hello---world hello---world hello---worldworld
注意:String作為參數傳遞,效果與基本類型作為參數傳遞一樣
13.14 數組高級冒泡排序原理圖解
冒泡排序原理:將數組0下標的數與1下標的數比較,如果1下標的數小於0下標的數則交換位置,然後將1下標的數與2下標的數比較,如果1下標的數大於2下標的數則交換位置,反之就不交換位置,直到比較結束最後一個下標存放的就是數組中最大的數,第一輪比較結束。然後再從0下標與1下標的數比較,此時最後一個數不需要參與比較,重復以上步驟直到結束。(從小到大排序)
13.15 數組高級冒泡排序代碼實現
1 public class Practice
2 {
3 /**
4 * 冒泡排序
5 * @param args
6 */
7 public static void main(String[] args)
8 {
9 int[] arr = {2,1,55,-12,45,25,-64};
10 System.out.println("排序前:");
11 print(arr);
12 bubbleSort(arr);
13 System.out.println("排序後:");
14 print(arr);
15 }
16 public static void bubbleSort(int[] arr)
17 {
18 for (int i = 0; i < arr.length-1; i++)
19 {
20 //-1是為了避免角標越界
21 //-i是為了讓內循環參與比較的次數隨著外循環的增加而遞減
22 for (int j = 0; j < arr.length-1-i; j++)
23 {
24 if(arr[j]>arr[j+1])
25 {
26 int temp = arr[j];
27 arr[j] = arr[j+1];
28 arr[j+1] = temp;
29 }
30 }
31 }
32 }
33 //遍歷數組
34 public static void print(int[] arr)
35 {
36 for (int i = 0; i < arr.length; i++)
37 {
38 System.out.print(arr[i]+" ");
39 }
40 System.out.println();
41 }
42 }
運行結果:
排序前: 2 1 55 -12 45 25 -64 排序後: -64 -12 1 2 25 45 55
13.16 數組高級選擇排序原理圖解
選擇排序原理:將數組內0下標的元素依次與後面的元素比較,如果1下標之後的元素小於0下標的元素就將該元素與0下標的元素交換位置,比較完成後0下標的元素存放的就是最小值,第一輪比較結束。然後從1下標開始依次與後面的元素比較,比較完成後1下標存放的就是第二小的數,依次類推直到排序結束。(由小到大排序)
13.17 數組高級選擇排序代碼實現
1 public class Practice
2 {
3 /**
4 * 選擇排序
5 * @param args
6 */
7 public static void main(String[] args)
8 {
9 int[] arr = {2,15,23,12,76,73,18,29};
10 System.out.println("排序前:");
11 print(arr);
12 selectSort(arr);
13 System.out.println("排序後:");
14 print(arr);
15 }
16 public static void selectSort(int[] arr)
17 {
18 for (int i = 0; i < arr.length-1; i++)
19 {
20 for (int j = i+1; j < arr.length; j++)
21 {
22 if(arr[i]>arr[j])
23 {
24 int temp = arr[i];
25 arr[i] = arr[j];
26 arr[j] = temp;
27 }
28 }
29 }
30 }
31 //遍歷數組
32 public static void print(int[] arr)
33 {
34 for (int i = 0; i < arr.length; i++)
35 {
36 System.out.print(arr[i]+" ");
37 }
38 System.out.println();
39 }
40 }
運行結果:
排序前: 2 15 23 12 76 73 18 29 排序後: 2 12 15 18 23 29 73 76
13.18 把字符串中的字符進行排序案例
1 public class Practice
2 {
3 /**
4 * @param args
5 */
6 public static void main(String[] args)
7 {
8 String s = "dacgebf";
9 char[] ch = s.toCharArray();
10 selectSort(ch);
11 System.out.println(new String(ch));
12 }
13 public static void selectSort(char[] ch)
14 {
15 for (int i = 0; i < ch.length-1; i++)
16 {
17 for (int j = i+1; j < ch.length; j++)
18 {
19 if(ch[i] > ch[j])
20 {
21 char temp = ch[i];
22 ch[i] = ch[j];
23 ch[j] = temp;
24 }
25 }
26 }
27 }
28 }
13.19 數組高級二分查找原理圖解
二分查找的前提數組元素必須有序
13.20 數組高級二分查找代碼實現
1 public class Practice
2 {
3 /**
4 * 二分查找
5 * @param args
6 */
7 public static void main(String[] args)
8 {
9 int[] arr = {11,15,23,28,35,39,48,49,58};
10 int index = binarySearch(arr, 28);
11 System.out.println(index);
12 }
13 public static int binarySearch(int[] arr,int key)
14 {
15 int min = 0;
16 int max = arr.length-1;
17 int mid = (min+max)/2;
18 while(arr[mid]!=key)
19 {
20 if(arr[mid]>key)
21 max = mid-1;
22 if(arr[mid]<key)
23 min = mid+1;
24 if(min>max)
25 return -1;
26 mid = (min+max)/2;
27 }
28 return mid;
29 }
30 }
13.21 二分查找使用的注意事項
如果數組元素是無序的,這種情況下的查找不能使用二分查找,因為使用二分查找元素必須有序,如果先排序再使用二分查找,排序的時候已經改變了最原始的元素索引。
13.22 Arrays工具類的概述和使用
此類包含用來操作數組(比如排序和搜索)的各種方法。此類還包含一個允許將數組作為列表來查看的靜態工廠。
成員方法:
1. public static String toString(int[] a):
返回指定數組內容的字符串表示形式。
2. public static void sort(int[] a):
對指定的 int 型數組按數字升序進行排序。
3. public static int binarySearch(int[] a,int key):
使用二分搜索法來搜索指定的 int 型數組,以獲得指定的值。
例:
1 //定義一個數組
2 int[] arr = {23,25,65,85,34,82};
3 //數組轉字符串
4 System.out.println(Arrays.toString(arr));
5 //數組排序
6 Arrays.sort(arr);
7 System.out.println(Arrays.toString(arr));
8 //二分查找
9 System.out.println(Arrays.binarySearch(arr, 65));
運行結果:
[23, 25, 65, 85, 34, 82] [23, 25, 34, 65, 82, 85] 3
binarySearch方法如果要查找的數在數組中存在,則返回的是該數在數組中的位置
如果不存在則返回的是該數在數組中插入的位置,該數是一個負數,表示要查找的數在數組中不存在
插入位置的計算方法為:例如返回的是-7,則在數組中應該插入的位置是7-1=6
13.23 Arrays工具類的源碼解析
13.24 基本類型包裝類的引入
為了方便操作基本數據類型值,將基本數據類型封裝成對象,在對象中定義了屬性和行為,用於描述該對象的類就稱為基本數據類型對象包裝類,好處在於可以在對象中定義更多的功能方法操作該數據。常用的操作之一:用於基本數據類型與字符串之間的轉換。
13.25 Integer的構造方法
Integer類概述:Integer 類在對象中包裝了一個基本類型 int 的值
該類提供了多個方法,能在 int 類型和 String 類型之間互相轉換,還提供了處理 int 類型時非常有用的其他一些常量和方法
構造方法:
public Integer(int value):
構造一個新分配的 Integer 對象,它表示指定的 int 值。
public Integer(String s)throws NumberFormatException:
構造一個新分配的 Integer 對象,它表示 String 參數所指示的 int 值。
例:
1 int i = 100;
2 Integer i1 = new Integer(i);
3 System.out.println("Integer:"+i1);
4
5 String s = "100";
6 Integer i2 = new Integer(s);
7 System.out.println("Integer:"+i2);
13.26 String和int類型的相互轉換
int→String
1.使用字符串的拼接 " "+number
2.使用方法 String.valueOf(int number)(推薦使用)
3.使用Integer做橋梁,int→Integer→String
Integer i = new Integer(number);
String s = i.toString();
4.使用方法 Integer.toString(int number)
String→int
1.使用Integer做橋梁,String→Integer→int
Integer i = new Integer(s);
int ii = i.intValue();
2.使用方法 Integer.parseInt(String s)(推薦使用)
13.27 Integer中進制轉換的操作
1. 常用的基本進制轉換
a. public static String toBinaryString(int i):
以二進制(基數 2)無符號整數形式返回一個整數參數的字符串表示形式。
b. public static String toOctalString(int i):
以八進制(基數 8)無符號整數形式返回一個整數參數的字符串表示形式。
c. public static String toHexString(int i):
以十六進制(基數 16)無符號整數形式返回一個整數參數的字符串表示形式。
2. 十進制到其他進制
public static String toString(int i,int radix):
返回用第二個參數指定基數表示的第一個參數的字符串表示形式。radix范圍從2~36
3. 其他進制到十進制
public static int parseInt(String s,int radix)throws NumberFormatException
使用第二個參數指定的基數,將字符串參數解析為有符號的整數。
13.28 JDK5的新特性自動裝箱和拆箱
自動裝箱:把基本類型轉換為包裝類類型
自動拆箱:把包裝類類型轉換為基本類型
JDK1.5以後,簡化了定義方式。
Integer x = new Integer(4);可以直接寫成
Integer x = 4;//相當於Integer x = Integer.valueOf(4);自動裝箱
x = x + 5;//相當於x = Integer.valueOf(x.intValue() + 5);先自動拆箱,再自動裝箱
需要注意:在使用時,Integer x = null;上面的代碼就會出現NullPointerException。
13.29 Integer直接賦值的面試題
1.Integer i = 1;i += 1;做了哪些事情
編譯時:
Integer i = 1;相當於Integer i = Integer.valueOf(1);
i += 1;相當於i = Integer.valueOf(i.intValue() + 1);
2.看程序寫結果
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2);//false
System.out.println(i1.equals(i2));//true
Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3 == i4);//false
System.out.println(i3.equals(i4));//true
Integer i5 = 127;
Integer i6 = 127;
System.out.println(i5 == i6);//true
System.out.println(i5.equals(i6));//true
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8);//false
System.out.println(i7.equals(i8));//true
注意:Integer的數據直接賦值,如果在-128到127之間,會直接從緩沖池裡獲取數據
通過查看源碼,我們就知道了,針對-128到127之間的數據,做了一個數據緩沖池,如果,數據是該范圍內的,每次並不創建新的空間
13.30 Character的概述
Character 類在對象中包裝一個基本類型 char 的值。Character 類型的對象包含類型為 char 的單個字段。
此外,該類提供了幾種方法,以確定字符的類別(小寫字母,數字,等等),並將字符從大寫轉換成小寫,反之亦然。
構造方法:
public Character(char value):
構造一個新分配的 Character 對象,用以表示指定的 char 值。
13.31 Character的常見方法講解
1. public static boolean isUpperCase(char ch):
確定指定字符是否為大寫字母。
2. public static boolean isLowerCase(char ch):
確定指定字符是否為小寫字母。
3. public static boolean isDigit(char ch):
確定指定字符是否為數字。
4. public static char toUpperCase(char ch):
使用取自 UnicodeData 文件的大小寫映射信息將字符參數轉換為大寫。
5. public static char toLowerCase(char ch):
使用取自 UnicodeData 文件的大小寫映射信息將字符參數轉換為小寫。
13.32 統計字符串中大寫小寫以及數字出現的次數案例
public class Practice
{
/**
* @param args
*/
public static void main(String[] args)
{
String s = "SdfgD32sdF65hfg3Sf s3EDf S";
int big = 0,samll = 0,number = 0;
char[] chs = s.toCharArray();
for (int i = 0; i < chs.length; i++)
{
if(Character.isUpperCase(chs[i]))
big++;
else if(Character.isLowerCase(chs[i]))
samll++;
else if(Character.isDigit(chs[i]))
number++;
}
System.out.println("大寫字符"+big+"個");
System.out.println("小寫字符"+samll+"個");
System.out.println("數字字符"+number+"個");
}
}