Java 知識點整理-7.StringBuffer類+氣泡排序+選擇排序+二分法+Arrays類+基本資料型別的包裝類
阿新 • • 發佈:2018-11-16
1、StringBuffer類概述:執行緒安全的可變字元序列,一個類似於String的字串緩衝區,但不能修改(不能像String那樣用加號與其他型別資料連線),但通過某些方法呼叫可以改變該序列的長度和內容。java.lang包下,使用時不用導包。final修飾,不能有子類。
2、StringBuffer相當於一個容器。
3、StringBuffer是一個執行緒安全的可變字元序列 ,但需要同步,效率較低。
4、StringBuffer和String的區別:String是一個不可變的字元序列,StringBuffer是一個可變的字元序列 。
5、每個字串緩衝區都有一定的容量。只要字串緩衝區所包含的的字元序列的長度沒有超出此容量,就無需分配新的內部緩衝區陣列。如果內部緩衝區溢位,則此容量自動增大。從JDK5開始,為該類補充了一個單個執行緒使用的等價類,即StringBuilder。與該類相比,通常應該優先使用StringBuilder類,因為它支援所有相同的操作,但由於它不執行同步,所以速度很快。
6、StringBuffer的構造方法:
public StringBuffer():無參構造方法。構造一個不帶字元的字串緩衝區,其初始容量為16個字元,初始容量即實際容量。
public StringBuffer(int capacity):構造一個不帶字元,但具有指定容量的字串緩衝區物件,實際容量給多少是多少。
public StringBuffer(String str):構造一個按指定字串內容初始化的的字串緩衝區物件,但不佔初始容量,實際容量為字串的length加上初始容量16。
7、StringBuffer的一般方法:
public int capacity():返回當前容量。呼叫capacity方法看容器的實際容量(理論值)。
public int length():返回長度(字元數)。呼叫length()方法看容器中的字元個數(實際值)。
8、StringBuffer在new的時候,是在堆記憶體建立了一個物件,底層是一個長度為16的字元陣列。當呼叫新增的(append())方法時,不會再重新建立物件,而是在不斷地向原緩衝區新增字元。
9、StringBuffer重寫了toString方法,顯示的是物件中的屬性值。
10、StringBuffer的新增功能:
public StringBuffer append(String str):可以把任意型別資料新增到字串緩衝區裡面,並返回字串緩衝區本身。
public StringBuffer insert(int offset,String str):在指定位置把任意型別的資料插入到字串緩衝區裡面,並返回字串緩衝區本身。如果沒有指定位置的索引就會報索引越界異常。
11、StringBuffer的刪除功能:
public StringBuffer deleteCharAt(int index):刪除指定位置的字元,並返回本身。當緩衝區中這個索引沒有元素的時候就會報StringIndexOutOfBoundsException。
public StringBuffer delete(int start,int end):刪除從指定位置開始指定位置結束的內容,並返回本身。刪除時包含頭不包含尾。
12、清空緩衝區:變數名.delete(0, 變數名.length()); 不要直接用建立物件的方式清空緩衝區,原來的物件會變成垃圾,浪費記憶體(原來的變數名 = new StringBuffer();)。
13、StringBuffer的替換功能:
public StringBuffer replace(int start,int end,String str):從start開始到end用str替換。
14、StringBuffer的反轉功能:
public StringBuffer reverse():字串反轉。
15、StringBuffer的擷取功能:
public String substring(int start):從指定位置擷取到末尾。擷取後產生新的字串,用String記錄。
public String substring(int start,int end):擷取從指定位置開始到結束位置,包括開始位置,不包括結束位置。
16、注意:substring()的返回值型別不再是StringBuffer本身,而是一個String。建立String變數去接收返回值。
17、Alt + Shift + R改名。
18、String轉換成StringBuffer:
ⅰ.通過StringBuffer的構造方法。直接在引數列表中新增字串。相當於把字串變成了StringBuffer物件。
ⅱ.通過StringBuffer的append()方法。通過append()方法將字串轉換為StringBuffer物件。
19、StringBuffer轉換成String:
ⅰ.通過String的構造方法。
ⅱ.通過StringBuffer的toString()方法。最常用,直接呼叫,用String變數接收。
ⅲ.通過StringBuffer的subString(0,length); 通過擷取此字串。
20、把陣列中的資料按照指定個格式拼接成一個字串。String會不斷產生垃圾,StringBuffer只會產生一個物件。
21、StringBuilder的概述:一個可變的字元序列。此類提供一個與StringBuffer相容的API,但不保證同步。該類被設計用作StringBuffer的一個簡易替換,用在字串緩衝區被單個執行緒使用的時候。如果可能,建議優先採用該類,因為大多數實現中,它比StringBuffer要快。
22、StringBuffer和StringBuilder的區別:
StringBuffer是jdk1.0版本的,是執行緒安全的,同步的,效率低。
StringBuilder是jdk1.5版本的,是執行緒不安全的,不同步的,效率高。
23、String和StringBuffer,StringBuilder的區別:
String是一個不可變的字元序列。
StringBuffer,StringBuilder是可變的字元序列。
24、寫出方法名和引數列表,Ctrl+1直接建立方法。
25、基本資料型別的值傳遞,不改變其值。引用資料型別的值傳遞,改變其值。
26、String作為引數傳遞。String類雖然是引用資料型別,但是他作為引數傳遞時和基本資料型別是一樣的。String類一旦初始化,其值就不會被改變。
27、StringBuffer作為引數傳遞。兩個引用指向同一個物件,所以值會改變。
28、氣泡排序:輕的上浮,沉的下降。
兩個相鄰位置元素進行比較,如果前面的元素比後面的元素大就交換位置。第一輪結束,最大值出現在最大索引處,擷取除最大索引的元素後重複比較交換的步驟,直到擷取的只剩首個索引位置的元素。利用for的巢狀迴圈實現。
外迴圈次數根據比較次數,內迴圈次數根據外迴圈次數設定。一般外迴圈次數為陣列長度-1,內迴圈次數為陣列長度-1-外迴圈次數所在次數(一般也就是i),數值上等於外迴圈次數-i。
具體交換過程,在比較後,設個int變數做中間媒介,進行交換即可。
29、選擇排序:
從0索引開始,依次和後面其他索引位置上的元素比較,小的往前放。第一輪結束,最小值出現在了最小索引處,擷取除最小索引的元素後重複比較交換的步驟,直到擷取的只剩最後索引位置的元素。利用for的巢狀迴圈實現。
內迴圈初始次數應設為外迴圈次數所在次數值加一(一般即j = i + 1),外迴圈次數根據比較次數。
30、氣泡排序是相鄰元素之間進行比較,大數後放。選則排序是固定索引,與後依次比較,小數前放。
31、氣泡排序的內迴圈次數,是在設定迴圈次數範圍時根據外迴圈次數的減少而減少,而選擇排序的內迴圈次數,是在每次初始化的時候根據外迴圈次數的增加而增加。(初始化值的增加等同於迴圈次數範圍的減少)。
32、二分查詢:查詢元素對應的索引。前提:陣列元素有序
ⅰ.建立方法,返回值型別為int。設定三個int型別變數分別為最小值儲存陣列首個元素的索引,最大值儲存陣列末尾元素的索引即陣列長度-1,和中間值儲存最大值加最小值的和被二整除的值所代表的索引。
ⅱ.用while迴圈,條件是當中間值不等於要找的值,即開始迴圈查詢。分兩種情況,當中間值小於了要找的值,就使最小值代表的索引等於中間值的索引加一;當中間值大於要找的值,就使最大值代表的索引等於中間值的索引減一。無論最大索引還是最小索引改變,中間索引等於新的最大索引或最小索引加上不變的最小索引或最大索引的和被二整除。最後判斷,如果最小索引比最大索引還大,就返回-1。
ⅲ.如果仍未滿足中間值等於要找的值,也沒返回-1,則重複第二步。如果滿足中間值等於要找的值,則返回中間索引。
33、 注意:如果陣列無序,就不能使用二分查詢。因為即使你排序了,但是你排序的時候已經改變了最原始的元素索引位置。
34、Arrays類概述:針對陣列進行操作的工具類。java.util包下,使用需要導包。方法均被靜態修飾,直接通過類名.呼叫即可 Arrays.方法名。提供了排序,查詢等功能。
35、Arrays類成員方法:
public static String toString(int[] a) 將陣列轉換成字串。
public static void sort(int[] a) 對陣列進行排序。
public static int binarySearch(int[] a,int key) 二分查詢法。返回:如果它包含在陣列中,則返回搜尋鍵的索引;否則返回(-(插入點)-1)。插入點被定義為將鍵插入陣列的那一點:即第一個大於此鍵的元素索引,如果陣列中的所有元素都小於指定的鍵,則為a.legth,這保證了當且僅當此鍵被找到時,返回的值將>=0。
36、Ctrl + Shift + T開啟類搜尋。Ctrl + O開啟方法搜尋。
37、解析:
//toString原始碼
public static String toString(long[] 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(", "); //如果不等於最大索引就將, 新增到緩衝區
}
}
//binarySearch0原始碼
private static int binarySearch0(long[] a, int fromIndex, int toIndex,
long key) {
int low = fromIndex; //最小索引0
int high = toIndex - 1; //最大索引陣列長度-1
while (low <= high) { //最小索引小於等於最大索引可以迴圈判斷
int mid = (low + high) >>> 1; //求出中間索引值,(最小+最大)/2
long 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
}
38、基本型別包裝類的概述:為什麼會有基本型別包裝類:將基本資料型別封裝成物件的好處在於可以在物件中定義更多的功能方法操作該資料。
39、基本型別包裝類常用的操作之一:用於基本資料型別與字串之間的轉換。
40、八種基本型別和包裝類的對應:
基本型別 |
對應包裝類 |
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
boolean |
Boolean |
41、Integer類概述:Integer 類在物件中包裝了一個基本型別 int 的值,該類提供了多個方法,能在 int 型別和 String 型別之間互相轉換,還提供了處理 int 型別時非常有用的其他一些常量和方法。
42、Integer類的常量:
public static final int MAX_VALUE值為2^31-1的常量,它表示int型別能夠表示的最大值。
public static final int MIN_VALUE值為-2^31的常量,它表示int型別能夠表示的最小值。
43、Integer類的構造方法:
public Integer(int value) 構造一個新分配的Integer物件,它表示指定的int值。
public Integer(String s) 構造一個新分配的Integer物件,它表示String引數所指示的int值。必須傳int型別(數字型別)的字串,否則報NumberFormatException數字格式異常。
44、int類轉換成String類:推薦用前兩個方法。
ⅰ.用+和""進行拼接。
ⅱ.public static String valueOf(int i)
ⅲ.int -- Integer -- String(Integer類的toString方法():返回一個表示該Integer值的String物件)
ⅳ.public static String toString(int i)(Integer類的靜態方法) 直接類名呼叫,引數傳int值。Integer.toString(int值);
45、String類轉換成int類:推薦第二種。
ⅰ.String -- Integer -- int (Integer類的intValue()方法:以int型別返回該Integer的值。)
ⅱ.public static int parseInt(String s) (Integer類的parseInt()方法:將字串引數作為有符號的十進位制整數作為解析。靜態方法,Integer.parseInt(String值);)
46、基本資料型別包裝類有8種,其中七種有parseXxx的方法,可以將這七種的字串表現形式轉換成基本資料型別。char的包裝類Character中沒有parseXxx的方法。字串到字元的轉換,通過toCharArray()就可以把字串轉換為字元陣列。
47、JDK5以前裝箱和拆箱:
int x = 100;
Integer i1 = new Integer(x);//將基本資料型別包裝成物件,裝箱
int y = i1.intValue(); //將物件轉換為基本資料型別,拆箱
48、JDK5的新特性:
自動裝箱:把基本型別轉換為包裝類型別。基本資料型別直接給引用資料型別賦值,把基本資料型別轉換成物件。
自動拆箱:把包裝類型別轉換為基本型別。把物件轉換為基本資料型別。底層相當於呼叫intValue()。
49、注意:在使用時,Integer x = null;程式碼就會出現NullPointerException。空指標調intValue方法報空指標異常。建議先判斷是否為null,然後再使用。
50、Integer中的equals方法:public boolean equals(Object obj) :比較此物件與指定物件,當且僅當引數不為null,並且是一個與該物件包含相同int值的Integer物件時,結果為true。
51、 Integer的面試題:看程式寫結果。
Integer i1 = new Integer(97);
Integer i2 = new Integer(97);
System.out.println(i1 == i2); //false
System.out.println(i1.equals(i2)); //true
System.out.println("-----------");
Integer i3 = new Integer(197);
Integer i4 = new Integer(197);
System.out.println(i3 == i4); //false
System.out.println(i3.equals(i4)); //true
System.out.println("-----------");
/*-128到127是byte的取值範圍,如果在這個取值範圍內,自動裝箱就不會新建立物件,而是從常量池中獲取
如果超過了byte取值範圍就會新建立物件。*/
Integer i5 = 127;
Integer i6 = 127;
System.out.println(i5 == i6); //true
System.out.println(i5.equals(i6)); //true
System.out.println("-----------");
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8); //false
System.out.println(i7.equals(i8)); //true
/*public static Integer valueOf(int i) { //Cache快取
if (i >= IntegerCache.low && i <= IntegerCache.high) //i >= -128 && i <= 127
return IntegerCache.cache[i + (-IntegerCache.low)]; //底層建立陣列,陣列大小256,0索引位置存的是-128,255索引位置存的127。i5和i6都是從陣列直接取值,所以結果相同。
return new Integer(i);
}*/