🗃️ 集合#
一些方法#
- add()
- addAll()
- remove()
- removeAll()
- clear()
- isEmpty()
- contains()
contains 和 remove 都會調用 equals 方法
如果集合中存放基本數據類型 一定要將其裝箱為基本類型包裝類
沒有提供修改和查詢的方法
🔍 迭代器#
迭代器
主要做遍歷操作 使用迭代器可以屏蔽數據結構之間的差異性異性
- hasNext()
- next()
- remove()
迭代器一旦生成 集合將不能被修改 否則需要重新生成迭代器
增強 for 循環#
迭代器的簡寫方式 同樣不能刪除
🐾 列表#
有序 可重複
ArrayList#
底層為 Object 數組 查詢修改效率高
- add(index,items)
- set(index,items)
- size()
LinkedList#
底層為雙向鏈表 隨機添加和刪除效率高
- add(index,items)
- set(index,items)
- size()
🍊 集合#
無序(不保證數據的添加和取出順序一致)
不可重複(重複後不會再添加)
TreeSet#
底層為TreeMap
TreeMap
底層為紅黑樹 添加的元素會按照一定格式自動排序
向TreeMap
中添加的數據都有比較器
因此我們如果要添加沒有比較器的對象或者自定義的對象時會出錯。另外因為排序需要比較,所以只能添加同類型數據
- 數字 大小升序
- 字符串 每一位 ASCII 碼
- Date 自然日期
HashSet#
底層為HashMap
的K
部分
HashMap
底層為散列表
🤼♀️ Comparable#
比較器 被添加的TreeSet
元素需要實現 Comparable 接口並重寫接口中的compareTo()
方法
compareTo()
方法返回值代表排序規則
添加元素時會調用元素對象的compareTo()
方法把集合中的元素傳入進行比較
如果==0
说明重複,不添加
如果<0
说明要添加的元素小,向前放
如果>0
说明要添加的元素大,向後放
import java.util.TreeSet;
public class Tree {
public static void main(String[] args) {
TreeSet<Object> tree = new TreeSet<>();
tree.add(new User("張三",18));
tree.add(new User("李四",13));
tree.add(new User("王五",32));
tree.add(new User("趙六",11));
System.out.println(tree);
}
}
class User implements Comparable {
private String name;
private int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {
if (o instanceof User) {
User u = (User) o;
// this.getAge() - u.getAge() 大於 1 升序排序
return this.getAge() - u.getAge();
}
return 0;
}
}
🍭 Comparator#
比較器類 要添加的元素不需要實現這個接口
Integer
類中有默認升序的比較方法,假如想要降序的時候可以通過實現Comparator
接口來重新定義排序規則;或者把不能排序的Object
對象 (沒有實現Comparable
接口) 保存在TreeSet
中時,還是需要 Comparator
來進行比較
當保存的元素不能排序(沒有實現Comparable
接口)或者排序規則不符合我們的需求時均可實現Comparator
接口並重寫compare()
方法進行排序
當 Comparator
比較器和 Comparable
比較器同時存在時,Comparator
優先級高於Comparable
此處體現了對修改關閉 對擴展開放
與匿名類同時使用#
import java.util.Comparator;
import java.util.TreeSet;
@SuppressWarnings("all")
public class UnNamed {
public static void main(String[] args) {
// TreeSet<Object> tree = new TreeSet<>(new MyComparator());
// 匿名類 常用在比較器中
TreeSet<Object> tree = new TreeSet<>(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Integer && o2 instanceof Integer) {
// o1 是要添加的元素
// System.out.println(o1);
// o2 是集合中的元素
// System.out.println(o2);
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
// 10-9 降序排列
return i2 - i1;
}
return 0;
}
});
tree.add(11);
tree.add(7611);
tree.add(1);
tree.add(100);
tree.add(660);
tree.add(98);
System.out.println(tree);
}
}
class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Integer && o2 instanceof Integer) {
// o1 是要添加的元素
// System.out.println(o1);
// o2 是集合中的元素
// System.out.println(o2);
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
// 10-9 降序排列
return i2 - i1;
}
return 0;
}
}
〽️ 列表排序#
Collections.sort(list)
排序方法
void sort(Comparator<? super E> c)
也可傳入Comparator
對象使用List
的排序方法
🔗 散列表 / 哈希表#
用於存儲鍵值對映射關係 存儲方式為數組中保存鏈表 用於解決哈希衝突問題
鏈表節點中保存四個屬性:
- hash 值
- key
- value
- next 指針
✔️ 泛型#
類型檢查
不使用泛型時集合中可以存儲任意類型的數據,且數據均會轉型為 Object
類型
缺點:獲取時會得到為 Object
類型的數據,使用對象特有屬性時需要強制類型轉換(向下轉型)
使用泛型之後集合中只能保存單一類型的數據
優點:由於保存數據的類型一致,所以使用的時候不需要向下轉型
缺點:只能保存單一數據類型
而且傳入的泛型類型只能為引用類型不能寫基本類型
public class Generic {
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.method(1);
myClass.method("xx");
MyClass<String> mm = new MyClass<String>();
mm.m1("xxx");
// mm.m1(123);
}
}
// 如果設置泛型後不傳入數據類型默認為 Object 類型
class MyClass<T> {
public void method(T obj) {
System.out.println(obj);
}
}