Java基礎-初級(四)【陣列、常用類的使用】
目錄
4.1.7 StringBuffer和Stringbuilder類
4、陣列、常用類的使用
4.1 陣列
所謂陣列,是有序的元素序列,用於儲存不同或相同型別的資料或引用物件。
4.1.1 陣列建立的幾種方式
宣告:
dataType[] arrayRefVar; // 首選的方法
dataType arrayRefVar[]; // 效果相同,但不是首選方法
建立:
dataType[] arrayRefVar= new dataType[size]
dataType[] arrayRefVar = {value0, value1, ..., valuek};
dataType[] arrayRefVar= new dataType[]{value0, value1, ..., valuek}
在Java中允許長度為0的陣列,所以在編寫一個結果是陣列的方法時,如果返回結果是空,可以建立長度為0的陣列【new type[0]】
4.1.2 foreach 迴圈
JDK 1.5 引進了一種新的迴圈型別,被稱為 foreach 迴圈或者加強型迴圈,它能在不使用下標的情況下遍歷陣列。
public class TestArray { public static void main(String[] args) { double[] myList = {1.9, 2.9, 3.4, 3.5}; // 列印所有陣列元素 for (double element: myList) { System.out.println(element); } } }
4.1.3 多維陣列
多維陣列可以看成是陣列的陣列,比如二維陣列就是一個特殊的一維陣列,其每一個元素都是一個一維陣列
String [][] = new String [3][4] 注意:定義陣列的時候,後面可以沒有數字,但是第一個陣列必須要說明是幾,也就是說可以
String [][] = new String [3][] 去使用
二維陣列可以看做為幾行幾列的一維陣列,以此類推,多維陣列(n)就是幾行幾列的(n-1)的陣列。
int a[][] = new int[2][3];
String s[][] = new String[2][];
s[0] = new String[2];
s[1] = new String[3];
s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");
4.1.4 Arrays類
java.util.Arrays 類能方便地運算元組,它提供的所有方法都是靜態的。
具有以下功能(常用功能):
- 給陣列賦值:通過 fill 方法。
- 對陣列排序:通過 sort 方法,按升序。
- 比較陣列:通過 equals 方法比較陣列中元素值是否相等。
- 查詢陣列元素:通過 binarySearch 方法能對排序好的陣列進行二分查詢法操作。
- 複製新的陣列:copyOf:複製出新的陣列,複製長度由 newLength 決定,長度可大於被複制陣列的長;copyOfRange:複製指定下標範圍內的值
- 列印成字串:字串表示由陣列元素的列表組成,括在方括號( "[]" )中。 相鄰的元素由字元", " (逗號後跟一個空格)分隔開。 元素被轉換為字串由String.valueOf(short)。 返回"null"如果a是null。
4.1.5 陣列排序
1、氣泡排序
//1、氣泡排序規則:將資料的最大值放到最後,陣列的最後面就是水面,最大值依次浮出
public int[] bubbleSort(int[] arr){
for(int i = 0;i < arr.length;i++){
//比較兩個相鄰的元素
for(int j = 0;j < arr.length-i-1;j++){
if(arr[j] > arr[j+1]){
int t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
return arr;
}
2、直接選擇排序(選擇出迴圈中最小的,放到陣列的前面,與冒泡不同的是,它不是依次交換而是最後將位置交換)
public static void selectionSort(long[]arr){
long temp = 0;
for(int i=0;i<arr.length-1;i++){
int min=i;
for(int j=i;j<arr.length-1;j++){
if(arr[min]>arr[j+1]){
min = j+1;
}
}
if(min!=i){
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}
3、插入排序
/**
* 插入排序
* 規則:與前面的值進行比較,插入到比自己小和大的中間
* @param arr
*/
public static void insertSort(long arr[]){
long temp =0;
for(int i=1;i<arr.length;i++){
temp =arr[i];
int j = i;
while(j>0&&arr[j-1]>=temp){
arr[j]=arr[j-1];
j--;
}
arr[j] =temp;
}
}
4、二分法排序
//二分查詢
public static int binarySearch(int array[],int low,int high,int temp)
{
int mid=0;
while(low<=high)
{
mid=(low+high)/2;
if(array[mid]<temp&&temp<=array[mid+1])
return (mid+1);
else if(array[mid]<temp)
low = mid + 1;
else
high = mid -1;
}
return high;
}
//二分排序
public static void binarySort(int array[],int size)
{
int i,j,k,temp;
for(i=1;i<size;i++)
{
temp=array[i];
if(array[i]<array[0])
k=0;
else
k = binarySearch(array,0,i,temp);
for(j=i;j>k;j--)
{
array[j]=array[j-1];
}
array[k]=temp;
System.out.println(Arrays.toString(array));
}
}
4.1.5 Object類
Object類是所有類的超類,也是預設類。如果一個類沒有用extends明確指出繼承於某個類,那麼它預設繼承Object類。
可以使用Object型別的變數可以用於引用任何型別的變數。在Java中,只有基本型別不是物件,例如數值、字元、布林,但是他們的包裝類屬於繼承於Object類。
Object類的方法
返回型別 | 方法 |
---|---|
protected Object |
clone() 建立並返回此物件的副本。 |
boolean |
equals(Object obj) 指示一些其他物件是否等於此。 |
protected void |
finalize() 當垃圾收集確定不再有對該物件的引用時,垃圾收集器在物件上呼叫該物件。 |
類<?> |
getClass() 返回此 |
int |
hashCode() 返回物件的雜湊碼值。 |
void |
notify() 喚醒正在等待物件監視器的單個執行緒。 |
void |
notifyAll() 喚醒正在等待物件監視器的所有執行緒。 |
String |
toString() 返回物件的字串表示形式。 |
void |
wait() 導致當前執行緒等待,直到另一個執行緒呼叫該物件的 |
void |
wait(long timeout) 導致當前執行緒等待,直到另一個執行緒呼叫 |
void |
wait(long timeout, int nanos) 導致當前執行緒等待,直到另一個執行緒呼叫該物件的 |
4.1.6 String類
String
類代表字串。 Java程式中的所有字串文字(例如"abc"
)都被實現為此類的例項。字串不變; 它們的值在建立後不能被更改。 字串緩衝區支援可變字串。 因為String物件是不可變的,它們可以被共享。 例如:String str = "abc"。
String類的不可繼承
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
String的成員變數
/** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L; /** * Class String is special cased within the Serialization Stream Protocol. * * A String instance is written into an ObjectOutputStream according to * <a href="{@docRoot}/../platform/serialization/spec/output.html"> * Object Serialization Specification, Section 6.2, "Stream Elements"</a> */ private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
從原始碼看出String底層使用一個字元陣列來維護的。
建立字串的兩種方式:
1、String str =“abc”
2、String str= new String("abc");
第一種方式:在記憶體堆中直接開闢一個記憶體,並進入物件池。
第二種方式:現在記憶體中開闢一塊記憶體,建立“abc”,然後new 的時候又開闢了一塊記憶體,前一塊記憶體中匿名物件變成了垃圾。
綜上:一般都使用第一種方式,只開闢一塊記憶體,並且入池。
String的不可變:
String因為是final修飾,所以值不可變。當然我們可以修改當前物件引用的地址,例如
String str =“abc”
str = “345”;
現在str確實為“345”,但是記憶體中還存在著“abc”,所以使用String時,總是變化的話,會很佔記憶體,推薦使用StringBuffer來拼接字串。
不可變優點:
- 方便做hash中的key
- String pool的需要
- 安全性
- 執行緒安全
String使用的設計模式
亨元模式
一個系統中如果有多處用到了相同的一個元素,那麼我們應該只儲存一份此元素,而讓所有地方都引用這一個元素,Java中String部分就是根據享元模式設計的,而那個儲存元素的地方就叫做“字串常量池 - String Pool
構造方法:
方法 | 解釋 |
String(byte[] bytes) |
通過使用平臺的預設字符集解碼指定的位元組陣列來構造新的 String 。 |
String(byte[] bytes, Charset charset) |
構造一個新的String 由指定用指定的位元組的陣列解碼charset |
String(byte[] bytes, int offset, int length) |
通過使用平臺的預設字符集解碼指定的位元組子陣列來構造新的 String 。 |
String(char[] value, int offset, int count) |
分配一個新的 String ,其中包含字元陣列引數的子陣列中的字元。 |
String(StringBuffer buffer) |
分配一個新的字串,其中包含當前包含在字串緩衝區引數中的字元序列。 |
成員方法:
返回型別 | 方法名稱 |
---|---|
char |
charAt(int index) 返回 |
int |
codePointAt(int index) 返回指定索引處的字元(Unicode程式碼點)。 |
int |
codePointBefore(int index) 返回指定索引之前的字元(Unicode程式碼點)。 |
int |
codePointCount(int beginIndex, int endIndex) 返回此 |
int |
compareTo(String anotherString) 按字典順序比較兩個字串。 |
int |
compareToIgnoreCase(String str) 按字典順序比較兩個字串,忽略病例差異。 |
String |
concat(String str) 將指定的字串連線到該字串的末尾。 |
boolean |
contains(CharSequence s) 當且僅當此字串包含指定的char值序列時才返回true。 |
boolean |
contentEquals(CharSequence cs) 將此字串與指定的CharSequence進行 |
boolean |
contentEquals(StringBuffer sb) 將此字串與指定的StringBuffer進行 |
static String |
copyValueOf(char[] data) 相當於 |
static String |
copyValueOf(char[] data, int offset, int count) |
boolean |
endsWith(String suffix) 測試此字串是否以指定的字尾結尾。 |
boolean |
equalsIgnoreCase(String anotherString) 將此 |
static String |
format(Locale l, String format, Object... args) 使用指定的區域設定,格式字串和引數返回格式化的字串。 |
static String |
format(String format, Object... args) 使用指定的格式字串和引數返回格式化的字串。 |
byte[] |
getBytes() 使用平臺的預設字符集將此 |
byte[] |
getBytes(Charset charset) 使用給定的charset將該 |
void |
getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin) 已棄用 此方法無法將字元正確轉換為位元組。 從JDK 1.1開始,首選的方法是通過 |
byte[] |
getBytes(String charsetName) 使用命名的字符集將此 |
void |
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 將此字串中的字元複製到目標字元陣列中。 |
int |
hashCode() 返回此字串的雜湊碼。 |
int |
indexOf(int ch) 返回指定字元第一次出現的字串內的索引。 |
int |
indexOf(int ch, int fromIndex) 返回指定字元第一次出現的字串內的索引,以指定的索引開始搜尋。 |
int |
indexOf(String str) 返回指定子字串第一次出現的字串內的索引。 |
int |
indexOf(String str, int fromIndex) 返回指定子串的第一次出現的字串中的索引,從指定的索引開始。 |
boolean |
isEmpty() 返回 |
int |
lastIndexOf(int ch) 返回指定字元的最後一次出現的字串中的索引。 |
int |
lastIndexOf(int ch, int fromIndex) 返回指定字元的最後一次出現的字串中的索引,從指定的索引開始向後搜尋。 |
int |
lastIndexOf(String str) 返回指定子字串最後一次出現的字串中的索引。 |
int |
lastIndexOf(String str, int fromIndex) 返回指定子字串的最後一次出現的字串中的索引,從指定索引開始向後搜尋。 |
boolean |
matches(String regex) 告訴這個字串是否匹配給定的 regular expression 。 |
String |
replace(char oldChar, char newChar) 返回從替換所有出現的導致一個字串 |
String |
replace(CharSequence target, CharSequence replacement) 將與字面目標序列匹配的字串的每個子字串替換為指定的字面替換序列。 |
String |
replaceAll(String regex, String replacement) 用給定的替換替換與給定的 regular expression匹配的此字串的每個子字串。 |
String[] |
split(String regex) 將此字串分割為給定的 regular expression的匹配。 |
String[] |
split(String regex, int limit) 將這個字串拆分為給定的 regular expression的匹配。 |
boolean |
startsWith(String prefix) 測試此字串是否以指定的字首開頭。 |
boolean |
startsWith(String prefix, int toffset) 測試在指定索引處開始的此字串的子字串是否以指定的字首開頭。 |
CharSequence |
subSequence(int beginIndex, int endIndex) 返回一個字元序列,該序列是該序列的子序列。 |
String |
substring(int beginIndex) 返回一個字串,該字串是此字串的子字串。 |
String |
substring(int beginIndex, int endIndex) 返回一個字串,該字串是此字串的子字串。 |
char[] |
toCharArray() 將此字串轉換為新的字元陣列。 |
String |
toLowerCase() 將所有在此字元 |
String |
toLowerCase(Locale locale) 將所有在此字元 |
String |
toUpperCase() 將所有在此字元 |
String |
toUpperCase(Locale locale) 將所有在此字元 |
String |
trim() 返回一個字串,其值為此字串,並刪除任何前導和尾隨空格。 |
static String |
valueOf(boolean b) 返回 |
static String |
valueOf(Object obj) 返回 |
4.1.7 StringBuffer和Stringbuilder類
當對字串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。和 String 類不同的是,StringBuffer 和 StringBuilder 類的物件能夠被多次的修改,並且不產生新的未使用物件。
由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程式要求執行緒安全的情況下,則必須使用 StringBuffer 類。
StringBuffer和Stringbuilder的成員方法
返回值 | 方法名稱 |
---|---|
StringBuffer |
append(boolean b) 將 |
StringBuffer |
append(Object obj) 追加 |
StringBuffer |
append(StringBuffer sb) 將指定 |
StringBuffer |
appendCodePoint(int codePoint) 將 |
int |
capacity() 返回當前容量。 |
char |
charAt(int index) 返回 |
StringBuffer |
delete(int start, int end) 刪除此序列的子字串中的字元。 |
StringBuffer |
deleteCharAt(int index) 刪除 |
int |
indexOf(String str) 返回指定子字串第一次出現的字串內的索引。 |
int |
indexOf(String str, int fromIndex) 返回指定子串的第一次出現的字串中的索引,從指定的索引開始。 |
StringBuffer |
insert(int offset, boolean b) 在此序列中插入 |
int |
lastIndexOf(String str) 返回指定子字串最右邊出現的字串內的索引。 |
int |
lastIndexOf(String str, int fromIndex) 返回指定子字串最後一次出現的字串中的索引。 |
StringBuffer |
replace(int start, int end, String str) 用指定的String中的字元替換此序列的子字串中的 |
StringBuffer |
reverse() 導致該字元序列被序列的相反代替。 |
String |
substring(int start) 返回一個新的 |
String |
substring(int start, int end) 返回一個新的 |
面試題:
String 、StringBuffer、StringBuilder的區別?
相同點:String、StringBuff 與 StringBuilder 都可以對字串進行操作。
字串操作效率上看 StringBuilder > StringBuffer > String
效率的區別分析:
- String 在設計的時候處於安全和效能的考慮,設定為 final 修飾,長度不可變,每次在常量池新增一個字串都是重新 new 一個物件,原來的物件沒有引用後等待 GC 回收,所以效率比較慢。
- StringBuilder 和 StringBuffer 都是可變長度的字串,都繼承了
AbstractStringBuilder
。那麼造成它們使用區別的原因分析原始碼可以知道。StringBuffer 的方法都加了synchronized
同步鎖,代表執行緒安全。而StringBuilder 則沒有加鎖,所以 StirngBuilder 的效率要優於 StirngBuffer。使用總結:
- 如果要操作少量的資料用 = String
- 單執行緒操作字串緩衝區 下操作大量資料 = StringBuilder(執行緒非安全)
- 多執行緒操作字串緩衝區 下操作大量資料 = StringBuffer(有buff就是安全,這個是執行緒安全的)
- 最後使用時可以指定StringBuffer的初始化長度,因為預設長度為16,超出後新建陣列,將前面的陣列複製過來,避免自動增長來提高效能。
4.1.8 包裝類
概念:
包裝類(Wrapper Class): Java是一個面向物件的程式語言,但是Java中的八種基本資料型別卻是不面向物件的,為了使用方便和解決這個不足,在設計類時為每個基本資料型別設計了一個對應的類進行代表,這樣八種基本資料型別對應的類統稱為包裝類(Wrapper Class),包裝類均位於java.lang包。、
包裝類與基本型別的對應關係:
- char —> Character
- boolean —> Boolean
- byte—> Byte
- short—> Short
- long—> Long
- int —> Integer
- float—> Float
- double—> Double
下面學習平時開發使用較多的方法
Character類
序號 | 方法與描述 |
---|---|
1 | isLetter() 是否是一個字母 |
2 | isDigit() 是否是一個數字字元 |
3 | isWhitespace() 是否是一個空格 |
4 | isUpperCase() 是否是大寫字母 |
5 | isLowerCase() 是否是小寫字母 |
6 | toUpperCase() 指定字母的大寫形式 |
7 | toLowerCase() 指定字母的小寫形式 |
8 | toString() 返回字元的字串形式,字串的長度僅為1 |
抽象類 Number 是父類,Number 的子類必須提供將表示的數值轉換 成 byte、double/float/long/int/short 的方法。Number 類的方法被 Number 的各子類所實現,常用方法如下:
Number 類的方法
方法 | 返回值 | 功能描述 |
---|---|---|
byteValue() | byte | 以 byte 形式返回指定的數值 |
intValue() | int | 以 int 形式返回指定的數值 |
floatValue() | float | 以 float 形式返回指定的數值 |
shortValue() | short | 以 short 形式返回指定的數值 |
longValue() | long | 以 long 形式返回指定的數值 |
doubleValue() | double | 以 double 形式返回指定的數值 |
4.1.9 Math類
Math
類包含執行基本數字運算的方法,如基本指數,對數,平方根和三角函式。
返回值 | 方法名稱 |
---|---|
static double |
abs(double a) 返回值為 |
static float |
abs(float a) 返回 |
static double |
acos(double a) 返回值的反餘弦值; 返回的角度在0.0到pi的範圍內。 |
static double |
floor(double a) 返回小於或等於引數的最大(最接近正無窮大) |
static double |
max(double a, double b) 返回兩個 |
static float |
max(float a, float b) 返回兩個 |
static float |
min(float a, float b) 返回兩個 |
static double |
pow(double a, double b) 將第一個引數的值返回到第二個引數的冪。 |
static double |
random() 返回值為 |
static double |
rint(double a) 返回與引數最接近值的 |
static long |
round(double a) 返回引數中最接近的 |
4.1.10 Random類
random類用於生成隨機數的類。許多應用程式會發現方法Math.random()
使用起來更簡單。
返回值 | 方法 |
---|---|
DoubleStream |
doubles() 返回一個有效的無限流的偽隨機 |
IntStream |
ints() 返回一個有效的無限流的偽 |
IntStream |
ints(int randomNumberOrigin, int randomNumberBound) 返回一個有效的無限流偽 |
protected int |
next(int bits) 生成下一個偽隨機數。 |
boolean |
nextBoolean() 返回下一個偽隨機數,從這個隨機數發生器的序列中均勻分佈 |
void |
nextBytes(byte[] bytes) 生成隨機位元組並將它們放入使用者提供的位元組陣列中。 |
double |
nextDouble() 返回下一個偽隨機數,從這個隨機數發生器的序列中 |
float |
nextFloat() 返回下一個偽隨機數,從這個隨機數發生器的序列中 |
double |
nextGaussian() 從該隨機數發生器的序列返回下一個偽隨機數,高斯(“正”)分佈 |
int |
nextInt() 返回下一個偽隨機數,從這個隨機數發生器的序列中均勻分佈 |
int |
nextInt(int bound) 返回偽隨機的,均勻分佈 |
long |
nextLong() 返回下一個偽,均勻分佈 |
void |
setSeed(long seed) 使用單個 |
4.1.11 System類
System
類提供的System
包括標準輸入,標準輸出和錯誤輸出流; 訪問外部定義的屬性和環境變數; 一種載入檔案和庫的方法; 以及用於快速複製陣列的一部分的實用方法。
返回值 | 方法 |
---|---|
static long |
currentTimeMillis() 返回當前時間(以毫秒為單位)。 |
static void |
exit(int status) 終止當前執行的Java虛擬機器。 |
static void |
gc() 執行垃圾回收器。 |
static Map<String,String> |
getenv() 返回當前系統環境的不可修改的字串對映檢視。 |
static String |
getenv(String name) 獲取指定環境變數的值。 |
static Properties |
getProperties() 確定當前的系統屬性。 |
static String |
getProperty(String key) 獲取指定鍵指示的系統屬性。 |
static String |
getProperty(String key, String def) 獲取指定鍵指示的系統屬性。 |
static SecurityManager |
getSecurityManager() 獲取系統安全介面。 |
static void |
setSecurityManager(SecurityManager s) 設定系統安全性。 |
4.1.12 BigInteger、BigDecimal類
一般來說,BigInteger用的不是很多,BigDecimal用的稍微多一點,就比如說JDBC中,如果一個欄位的資料庫型別是Number, 那麼getObject().getClass()的結果是java.math.BigDecimal
BigInteger相比Integer的確可以用big來形容。它是用於科學計算,Integer只能容納一個int, 所以最大值也就是2的31次訪減去1,十進位制為2147483647,如果需要計算更大的數,那麼31位顯然是不夠用了,BigInteger能夠容納的位數那可就大了,理論上可以無限大。除了容量大之外,BigInteger還封裝了一些常見的操作,比如+-*/的基本操作,還有絕對值,相反數,最大公約數,是否是質數等等的運算。
4.1.13 Date、DateFormat類
java.util.Date
返回值 | 方法 |
---|---|
boolean |
after(
|