ArrayList
數組的長度不可以發生改變,但是ArrayList集合的長度是可以隨意變化的。
對於ArrayList來說,有一個尖括號代表泛型
泛型:也就是裝在集合當中的所有元素,全都是統一的某種類型。
注意:泛型只能是引用類型,不能是基本類型
ArrayList<String> list = new ArrayList<>();
備註:從JDK 1.7+ 開始,右側的尖括號內容可以不寫內容,但是<>本身還是要寫的。
ArrayList當中的常用方法有:
public boolean add(E e) : 向集合當中添加元素,參數的類型和泛型一致。返回值代表添加是否成功。
備註:對於ArrayList集合來說,add添加動作一定是成功的,所以返回值可用可不用。但是對於其他集合來說,add添加動作不一定成功。
// 向集合中添加元素: add
boolean success = list.add("一輩子");
System.out.println("添加動作是否成功:" + success);
System.out.println(list);
public E get(int index): 從集合當中獲取元素,參數是索引編號,返回值就是對應位置的元素。
// 從集合中獲取元素
String s = list.get(0);
System.out.println(s);
public E remove(int index): 從集合當中刪除元素,參數是索引編號,返回值就是被刪除掉的元素。
// 從集合中刪除元素
String removed = list.remove(2);
System.out.println(list);
public int size(): 獲取集合的尺寸長度,返回值是集合中包含的元素個數。
// 獲取集合的長度
int size = list.size();
System.out.println(size);
如果希望向集合ArrayList當中存儲基本類型數據,必須使用基本類型對應的"包裝類”
基本類型 包裝類(引用類型 包裝類都位於java.lang包下)
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
自動裝箱: 基本類型 -> 包裝類型
自動拆箱: 引用類型 -> 基本類型
String類
java.lang.String類代表字符串
String
類代表字符串。Java 程序中的所有字符串字面值(如 "abc"
)都作爲此類的實例實現。 也就是說,程序當中所有的雙引號字符串都是String類
的對象,就算沒有new,也照樣是 。
字符串的特點
- 字符串的內容永不可變。
重點
- 正是因爲字符串不可改變,所以字符串是可以共享使用的。
- 字符串效果上相當於是char[ ]字符數組,但是底層原理是byte[ ]字節數組
創建字符串的常見3+1中方式:
3種構造方法:
public String() : 創建一個空白字符串,不含有任何內容
//使用空參構造
String str1 = new String(); //小括號留空,說明字符串什麼內容也沒有
System.out.println("第一個字符串:" + str1);
public String(char[] array): 根據字符數組的內容,來創建對應的字符串
//根據字符數組創建字符串
char[] charArray = {'A', 'B', 'C'};
String str2 = new String(charArray);
System.out.println("第二個字符串:" + str2);
public String(byte[] array): 根據字節數組的內容,來創建對應的字符串
byte[] byteArray = {97, 98, 99};
String str3 = new String(byteArray);
System.out.println("第三個字符串:" + str3);
1種直接創建
String str4 = "hello";
字符串常量池:程序當中直接寫上的雙引號字符串,就在字符串常量池中。
對於基本類型來說,== 是進行數值的比較
對於引用類型來說,==是進行地址值的比較
== 是進行對象的地址值的比較,如果確實需要字符串的內容比較,可以使用兩個方法:
字符串的內容比較:
public boolean equals(Object obj) : 參數可以是任何對象,只有參數是一個字符串並且內容相同的纔會是true;否則返回false
注意事項:
1. 任何對象都能用Object進行接收
2. equals方法具有對稱性,也就是a.equals(b)和b.equals(a)效果一樣。
3. 如果比較雙方一個常量一個變量,推薦把常量字符串寫在前面
推薦:"abc".equals(str) 不推薦:str.equals("abc")
public boolean equalsIgnoreCase(Object obj) : 不區分大小寫比較
String 當中與獲取相關的常用方法有:
public int length(): 獲取字符串當中含有的字符個數,拿到字符串長度。
public String concat(String str): 將當前字符串和參數字符串拼接成爲返回值新的字符串
public char charAt(int index): 獲取指定索引位置的單個字符
public int indexOf(String str): 查找參數字符串在本字符串當中首次出現的索引位置,如果沒有返回-1
字符串的截取方法:
public String substring(int index): 截取從參數位置一直到字符串結尾,返回新字符串
public String substring(int begin, int end): 截取從begin開始,一直到end結束,中間的字符串
備註:[begin, end),包含左邊,不包含右邊。
注意:下面這種寫法,字符串的內容仍然是沒有改變的,下面的兩個字符串:"Hello" , "Java". strA當中保存的是地址值。本來地址值是Hello的0X666,後來地址值變成了Java的0x999;
String strA = "Hello";
System.out.println(StrA); //Hello
strA = "Java";
system.out.println(strA); //Java
String當中與轉換相關的常用方法:
public char[] toCharArray(): 將當前字符串拆分成爲字符數組作爲返回值
public byte[] getBytes(): 獲得當前字符串底層的字節數組
public String replace(CharSequence oldString, CharSequence newString): 將所有出現的老字符串替換成爲新的字符串,返回替換之後的結果新字符串。
分割字符串的方法:
public String[] split(String regex): 按照參數規則,將字符串切分成爲若干部分
注意事項:如果按照英文句點"." 來切分的話,需要使用 "\\."來使用。因爲英文句點在正則表達式中有特殊含義。
static關鍵字
-
如果一個成員變量使用了static關鍵字,那麼這個變量不再屬於對象自己,而是屬於所在的類。多個對象共享同一份數據。
-
一旦使用static修飾成員方法 ,那麼這就成爲了靜態方法。靜態方法不屬於對象單獨所有,而屬於類
-
如果沒有static關鍵字,那麼必須首先創建對象,然後再通過對象調用其方法。
-
對於靜態方法來說,可以直接使用類名稱來直接調用(推薦)。
-
總結:無論是成員變量還是成員方法,如果有了static,都推薦使用類名稱來進行調用
- 靜態變量: 類名稱.靜態變量
- 靜態方法: 類名稱.靜態方法();
-
備註:對於自己類中的靜態方法,調用時類名稱可以省略。
-
注意:
- 靜態不能直接訪問非靜態。原因是因爲內存當中是先有靜態內容,然後再有非靜態內容 (古人不知道後人,後人知道古人)。
- 靜態方法當中不能用this關鍵字。原因是因爲this代表對象,通過誰調用的方法,誰就是對象。
-
靜態static內存圖
-
靜態代碼塊
格式:
public class 類名稱 {
static {
//靜態代碼塊內容
}
}
特點:當第一次用到本類時,靜態代碼塊執行唯一的一次
靜態內容總是優先於非靜態,所以靜態代碼塊比構造方法先執行。
典型用途: 用來一次性地對靜態成員變量進行賦值
數組工具類Arrays
java.util.Arrays是一個與數組相關的工具類,裏面提供了大量的靜態方法,用來實現數組的常見操作。
public static String toString(數組) : 將參數數組變成字符串(按照默認格式)
public static void sort(數組): 按照默認升序(從小到大)對數組元素進行排序
備註:
1.如果是數值,sort默認按照升序從小到大。
2.如果是字符串,sort默認按照字母升序
3.如果是自定義類型,那麼這個自定義的類需要有Comparable或者Comparator接口支持。
常用Math類
java.util.Math類是數學相關的工具類,裏面提供了大量的靜態方法,完成與數學運算相關的操作
public static double abs(double num): 獲取絕對值。
public static double ceil(double num): 向上取整
public static double floor(double num): 向下取整
public static long round(double num): 四捨五入
接口的使用:
定義: 接口就是多個類的公共規範,它屬於一種引用類型,最重要的內容是其中的抽象方法 。
接口定義格式:
public interface 接口名稱 {
// 接口內容
}
備註:換成了關鍵字interface之後,編譯生成的字節碼文件仍然是:.java -> .class
// 如果是java 7,那麼接口可以包含的內容有:
1. 常量
2. 抽象方法
注:抽象方法定義格式:public abstract void methodAbs();
// 如果是Java 8, 還可以額外包含有:
3. 默認方法
4. 靜態方法
// 如果是Java 9,還可以額外包含有:
5. 私有方法
在任何版本的Java中,接口都能定義抽象方法。
格式: public abstract 返回值類型 方法名稱(參數列表);
注意事項:
- 接口當中的抽象方法,修飾符必須是兩個關鍵字:public abstract。(也可以省略其一或全不寫)
- 方法的3要素,可以隨意定義。
接口使用步驟: 實現類 -> 創建實現類對象
- 接口不能直接使用,必須有一個實現類 來 實現 該接口。
格式:public class 實現類名稱 implements 接口名稱 {
// …
}- 接口的實現類必須覆蓋重寫(即實現)接口中所有抽象方法。
實現:去掉abstract關鍵字,加上方法體大括號 - 創建實現類的對象,進行使用。
注意事項:如果實現類並沒有覆蓋重寫接口中所有的抽象方法,那麼這個實現類自己就必須是抽象類。
- 接口的實現類必須覆蓋重寫(即實現)接口中所有抽象方法。
從Java 8開始,接口裏允許定義默認方法。
格式:
public default 返回值類型 方法名稱(參數列表) {
方法體
}
備註:接口當中的默認方法,可以解決接口的升級問題。
- 接口的默認方法,可以通過接口實現類對象,直接調用。
- 接口的默認方法,也可以被接口實現類進行覆蓋重寫。
備註:調用抽象類方法,實際上運行的是右側實現類。
從Java 8開始,接口裏允許定義靜態方法。
格式:
public static 返回值類型 方法名稱(參數列表){
// 方法體
}
注意事項:不能通過接口實現類的對象來調用接口當中的靜態方法。
正確用法:通過接口名稱,直接調用其中的靜態方法
格式:接口名稱.靜態方法名(參數);
從Java 9開始,接口裏允許定義私有方法。
1. 普通私有方法,解決多個默認方法之間代碼重複問題。
格式 :
private 返回值類型 方法名稱(參數列表) {
方法體
}
2. 靜態私有方法,解決多個靜態方法之間重複代碼問題
格式:
private static 返回值類型 方法名稱(參數列表){
方法體
}
接口常量:
接口當中也可以定義 “成員變量” ,但是必須使用public static final 三個關鍵字修飾。從效果看,這其實就是接口的常量
格式:
public static final 數據類型 常量名稱 = 數據值;
備註: 一旦使用final關鍵字進行修飾,說明不可改變。
注意事項:
1. 接口當中的常量,可以省略public static final,注意:不寫也照樣是原本的樣子
2. 接口當中的常量,必須進行賦值;不能不賦值
3. 接口中常量的名稱,使用完全大寫的字母,用下劃線進行分隔(推薦命名規則)
使用接口時,需要注意的事項:
1. 接口是沒有靜態代碼塊或者構造方法的。
2. 一個類的直接父類是唯一的,但是一個類可以同時實現多個接口。
格式:public class MyInterfaceImpl implements MyInterfaceA, MyInterfaceB {
// 覆蓋重寫所有抽象方法
}
3. 如果實現類所實現的多個接口當中,存在重複的抽象方法 ,那麼只需要覆蓋重寫一次即可。
4. 如果實現類沒有覆蓋重寫所有接口當中的抽象方法,那麼實現類就必須是一個抽象類。
5. 如果實現類所實現的多個接口當中,存在重複的默認方法,那麼實現類一定要對衝突的默認方法進行覆蓋重寫。
6. 一個類如果直接父類當中的方法,和接口當中的默認方法產生了衝突,優先使用父類當中的方法。
接口的擴展:
- 類與類之間是單繼承的。直接父類只有一個
- 類與接口之間是多實現的。一個類可以實現多個接口。
- 接口與接口之間是多繼承的。
注意事項:- 多個父接口當中的抽象方法如果重複,沒關係。
- 多個父接口當中的默認方法如果重複,那麼子接口必須進行默認方法的覆蓋重寫 。而且必須帶着default關鍵字。
多態性
代碼當中體現多態性,其實就是一句話:父類引用指向子類對象。
格式:
父類名稱 對象名 = new 子類名稱();
Fu obj = new Zi();
或者
接口名稱 對象名 = new 實現類名稱();
擴展:
訪問成員變量的兩種方式: (口訣:編譯看左邊,運行還看左邊)
- 直接通過對象名稱訪問成員變量:看等號左邊是誰,優先用誰,沒有則向上找
- 間接通過成員方法訪問成員變量:看該方法屬於誰,優先用誰,沒有則向上找
訪問成員方法的訪問規則: (口訣:編譯看左邊,運行看右邊)
- 看new的是誰,就優先用誰,沒有則向上找