容器(集合框架) - 承載其他對象的對象
泛型(generic) - 讓類型不在是程序中的硬代碼(hard code)
此處的extends不是繼承而是泛型限定 限定T類型必須是Comparable接口的子類型
public static <T extends Comparable<T>>void bubbleSort1(T[] array)
GoF設計模式 - 策略模式(用一個繼承結構封裝可變的打折策略)
Collection
List
ArrayList
LinkedList
-
Set
- HashSet
- TreeSet
Map
HasMap
TreeMap
public class Test01 {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1, "apple");
map.put(2, "grape");
map.put(100, "shit");
map.put(1, "banana");
map.remove(100);
System.out.println(map.size());
for (Integer key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
}
}
去重、排序
- 要使用TreeSet ,那么對象必須是可比較的 ,因為TreeSet底層是一棵排序樹
- 可以通過實現Comparable接口并重寫compareTo方法來實現比較的功能
從Java5開始容器可以指定泛型參數來限定容器中對象引用的類型帶泛型參數的容器比不帶泛型參數的容器在使用上更方便
從Java7開始構造器后面的泛型參數可以省略 - 鉆石語法
List兩個實現版本的比較
ArrayList - 底層實現是一個數組 使用連續內存 可以實現隨機存取
LinkedList - 底層實現是一個雙向循環鏈表 可以使用碎片內存 不能隨機存取,
但是增刪元素是需要修改引用即可 所以增刪元素時有更好的性能容器中只能放對象的引用不能放基本數據類型
所以向容器中添加基本數據類型時會自動裝箱(anto-boxing)
所謂自動裝箱就是將基本數據類型處理成對應的包裝類型
基本類型 包裝類型(Wrapper class)
byte ---> Byte ---> new Byte(1)
short ---> Short
int ---> Integer
long ---> Long
float ---> Float
double ---> Double
char ---> Character
boolean ---> Boolean
從Java8開始可以給容器發送forEach消息對原色進行操作
forEach方法的參數可以使方法引用也可以使Lambda表達式
方法引用
list.forEach(System.out::println);
Lambda表達式
list.forEach(e -> {
System.out.println(e.toUpperCase());
});
創建匿名內部類的對象給窗口或者窗口上的控件注冊事件監聽器有三種做法:
- 1.創建匿名內部類的對象(就地實例化)
- 2.創建一個內部類對象來充當監聽器(因為有名字隨時都可以創建對象)
- 3.讓窗口實現接口用窗口對象充當監聽器
從Java8開始,對于單方法接口(函數式接口)可以使用Lambda表達式
寫一個匿名方法來編寫事件回調代碼
寫一個工具類的要點:
- 所有的方法都應該是靜態方法
- 將構造器私有 不允許調用構造器創建對象
- 工具類一般不會被繼承所以通常是final的
哈希存儲只要能設計出一個好的哈希函數就是存取性能都特別好的存儲方案
好的哈希函數應該是:不同的對象盡可能產生不同的哈希碼
哈希存儲或者哈希函數 有的地方也稱之為散列存儲或者散列函數
-
如果要使用HashSet那么一定重寫兩個方法:
- hashcode() ---> 讓相同的對象產生相同的哈希碼,讓不同的對象盡可能產生不同的哈希碼
- equals() ---> 定義比較兩個對象的規則(引用,類型,屬性)
- 自反性
- 對稱性
- 傳遞性
- 一致性
StringBuffer 和 StringBuilder代表可變字符串
對字符串做修改時不會創建新的字符串
StringBuffer是線程安全的 - 多個線程可以操作同一個StringBuffer對象
StringBuilder是線程不安全的 - 多個線程同時操作一個StringBuilder時會發生錯誤
StringBuilder是Java5引入的可變字符串類型,它擁有更好的性能如果要頻繁的修改一個字符串請不要使用String因為每次修改都有可能創建一個新的字符串對象 所以在這種場景下應該使用StringBuilder或者StringBuffer
正則表達式 - regular expression
定義字符串的匹配模式
"\w"字母數字下劃線 "\d"0-9的數字 "\s"任意空白符
"*"0個或多個 "+"一個或多個 "?"零次或一次