comparator比較器 Comparator不同於Comparable,使用更加的靈活,可以在不同場景下使用比較器,實際開發中,更推薦comparator比較器 // 新建一個學生類,作為慄子 public class Student { private int sno; private f ...
comparator比較器
Comparator不同於Comparable,使用更加的靈活,可以在不同場景下使用比較器,實際開發中,更推薦comparator比較器
// 新建一個學生類,作為慄子
public class Student {
private int sno;
private float height;
private float weight;
}
// 單獨定義一個比較器類StudentHeightComparator,實現了Comparator介面裡面的compare方法
public class StudentHeightComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return Float.compare(o1.getHeight(), o2.getHeight());
}
}
// 使用comparator比較器
public static void main(String[] args) {
List<Student> studentList = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 100; i++) {
Student studentTmp = new Student(i,100 + random.nextInt(100),50 + random.nextInt(50));
studentList.add(studentTmp);
}
// 創建比較器實例
Comparator<Student> c = new StudentHeightComparator();
// 把比較器實例當作參數傳入sort方法
Collections.sort(studentList,c);
for (Student student : studentList) {
System.out.println(student);
}
}
Set介面常用實現類
三個常用實現類:TreeSet(基於Java紅黑樹,底層map),HashSet(哈希表,底層map),LinkedHashSet()
Set特點:
- 不允許存儲重覆元素
- 沒有索引,不能通過普通for迴圈遍歷
- 不保證有序:存儲順序有可能和讀取順序不一致
HashSet 和 TreeSet區別:TreeSet 支持比較器
// HashSet
public static void main(String[] args) {
Set<Integer> set = new java.util.HashSet<>();
for (int i = 0; i < 10; i++) {
set.add(i);
}
// 無法存儲重覆元素
set.add(1);
// 無法保證存儲和讀取順序一致
// 遍歷的時候,調用了set重寫的toString方法
System.out.println(set);
// 使用迭代器遍歷set集合
Iterator<Integer> setIterator = set.iterator();
while (setIterator.hasNext()){
System.out.println(setIterator.next());
}
}
// TreeSet
// TreeSet底層使用的紅黑樹,紅黑樹是有序二叉樹的一種
// TreeSet支持在數據存儲的時候提供比較器
public static void main(String[] args) {
// 先創建比較器對象
Comparator<Student> c = new StudentHeightComparator();
// 創建TreeSet的同時提供比較器
java.util.TreeSet<Student> treeSet = new java.util.TreeSet<>(c);
// 插入數據
Random random = new Random();
for (int i = 0; i < 10; i++) {
Student studentTmp = new Student(i,100 + random.nextInt(100),50 + random.nextInt(50));
treeSet.add(studentTmp);
}
// 遍歷
for (Student student : treeSet) {
System.out.println(student);
}
}
Map的常見實現類
三個常用實現類:HashMap,TreeMap,HashTable
HashMap
JDK中HashMap在1.7版本以及1.7版本之前使用的數組加鏈表的形式實現
- HashMap存儲的所有的Map集合都是雙列集合,由key和value組成
- Java底層使用一個Entry(鍵值對對象)的類負責存放key和value
- HashMap要求key是不可以重覆的,如果你存儲了兩個key相同的鍵值對,新的value就會替換掉原有的value
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
// 插入鍵值對
map.put("Entry01","robot01");
map.put("Entry02","robot02");
map.put("Entry01","robot03");
System.out.println(map);
// map里只有兩個鍵值對:{Entry01=robot03, Entry02=robot02}
// 可以通過key來獲取(get)元素
System.out.println(map.get("Entry02")); // robot02
// size()返回鍵值對的數量
System.out.println(map.size()); // 2
// 是否有指定鍵,值
System.out.println(map.containsKey("Entry01")); // true
// 因為鍵相同,所以robot01被robot03所替代
System.out.println(map.containsValue("robot01")); // false
// 根據key去刪除整個鍵值對
map.remove("Entry01");
System.out.println(map); // {Entry02=robot02}
// keySet() 將當前集合的所有key以Set集合的方式返回
map.put("Entry05","robot05");
System.out.println(map.keySet()); // [Entry05, Entry02]
// values() 將當前集合的所有values返回
System.out.println(map.values()); // [robot05, robot02]
// entrySet() 將當前集合的所有數據,以鍵值對的形式返回
System.out.println(map.entrySet()); // [Entry05=robot05, Entry02=robot02]
// 兩種遍歷方式
// 1. 使用keySet()迭代器遍歷HashMap
// 先使用keySet()返回HashMap的所有鍵,然後使用set集合的迭代器,遍歷HashMap
Iterator<String> integer = map.keySet().iterator();
while(integer.hasNext()){
// 存儲迭代器的鍵
String keyTmp = integer.next();
// 通過get()取出值
System.out.println(keyTmp + " : " + map.get(keyTmp));
}
// 2. 使用entrySet迭代器遍歷HashMap
Iterator<Map.Entry<String, String>> entryIterator = map.entrySet().iterator();
while(entryIterator.hasNext()){
System.out.println(entryIterator.next());
}
}