1. 程式人生 > 其它 >Java開發手冊-集合處理

Java開發手冊-集合處理

  1. 關於 hashCode 和 equals 的處理
  2. 判斷所有集合內部的元素是否為空,使用 isEmpty()方法
  3. 在使用 java.util.stream.Collectors 類的 toMap()方法轉為 Map 集合時,一定要使 用含有引數型別為 BinaryOperator

1.【強制】關於 hashCode 和 equals 的處理,遵循如下規則:

  1) 只要覆寫 equals,就必須覆寫 hashCode。   2) 因為 Set 儲存的是不重複的物件,依據 hashCode 和 equals 進行判斷,所以 Set 儲存的物件必須覆寫     這兩種方法。   3) 如果自定義物件作為 Map 的鍵,那麼必須覆寫 hashCode 和 equals。
    說明:String 因為覆寫了 hashCode 和 equals 方法,所以可以愉快地將 String 物件作為 key 來使用2.【強制】判斷所有集合內部的元素是否為空,使用 isEmpty()方法,而不是 size()==0 的方式。 說明:在某些集合中,前者的時間複雜度為 O(1),而且可讀性更好。 正例:
Map<String, Object> map = new HashMap<>(16);
if(map.isEmpty()) {
  System.out.println("no element in this map.");
}
3.【強制】在使用 java.util.stream.Collectors 類的 toMap()方法轉為 Map 集合時,一定要使
用含有引數型別為 BinaryOperator,引數名為 mergeFunction 的方法,否則當出現相同 key 值時會丟擲 IllegalStateException 異常。 說明:引數 mergeFunction 的作用是當出現 key 重複時,自定義對 value 的處理策略。 正例:
List<Pair<String, Double>> pairArrayList = new ArrayList<>(3);
pairArrayList.add(new Pair<>("version", 12.10));
pairArrayList.add(
new Pair<>("version", 12.19)); pairArrayList.add(new Pair<>("version", 6.28)); Map<String, Double> map = pairArrayList.stream().collect( // 生成的 map 集合中只有一個鍵值對:{version=6.28} Collectors.toMap(Pair::getKey, Pair::getValue, (v1, v2) -> v2));

Pair<T1, T2> 定義如下:

class Pair<T1, T2> {
    private T1 key;
    private T2 value;
    public Pair(T1 t11, T2 t22) {
        super();
        this.key = t11;
        this.value = t22;
    }
    public T1 getKey() {
        return key;
    }
    public void setKey(T1 key) {
        this.key = key;
    }
    public T2 getValue() {
        return value;
    }
    public void setValue(T2 value) {
        this.value = value;
    }
}
View Code

當這樣寫時,報錯 java.lang.IllegalStateException: Duplicate key 12.1

Map<String, Double> map = pairArrayList.stream().collect(
       Collectors.toMap(Pair::getKey, Pair::getValue));
反例,下面也會報 IllegalStateException:
String[] departments = new String[] {"iERP", "iERP", "EIBU"};
// 丟擲 IllegalStateException 異常
Map<Integer, String> map = Arrays.stream(departments)
.collect(Collectors.toMap(String::hashCode, str -> str));