Pair 的字面意思是「一對」、「一雙」,瞄一眼它的源碼,果不其然,裏面只有兩個字段 first
與 second
.android
public class Pair<F, S> {
public final F first;
public final S second;
public Pair(F first, S second) {
this.first = first;
this.second = second;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Pair)) {
return false;
}
Pair<?, ?> p = (Pair<?, ?>) o;
return Objects.equals(p.first, first) && Objects.equals(p.second, second);
}
// ...
public static <A, B> Pair <A, B> create(A a, B b) {
return new Pair<A, B>(a, b);
}
}
複製代碼
它的使用也是很是簡單的:網絡
// 兩種方式均可以建立 Pair 實例,而第二種方式內部實際上也是使用第一種方式建立
Pair pair1 = new Pair<Integer, String>(1, "111"); // 第一種方式建立
Pair pair2 = Pair.create(1, 111); // 第二種方式建立
Pair pair3 = Pair.create(1, 111);
Log.e(TAG, pair1.first.toString()); // 1
Log.e(TAG, pair1.second.toString()); // 111
Log.e(TAG, pair1.second.equals("111") + ""); // true
Log.e(TAG, pair1.second.equals(111) + ""); // false
Log.e(TAG, pair1.equals(pair2) + ""); // false
Log.e(TAG, pair2.equals(pair3) + ""); // true
複製代碼
從以上示例可知:ide
說到 equals
, 上面的源碼只是 android.util 包下 Pair 類的 equals 方法,因爲 android.support.v4.util 包下也有 Pair 類,經過比較,兩個包下的 Pair 類只有 equals 方法有所不一樣,其它方法無異。this
// android.util 包下
public boolean equals(Object o) {
if (!(o instanceof Pair)) {
return false;
}
Pair<?, ?> p = (Pair<?, ?>) o;
return Objects.equals(p.first, first) && Objects.equals(p.second, second);
}
// android.support.v4.util 包下
public boolean equals(Object o) {
if (!(o instanceof Pair)) {
return false;
} else {
Pair<?, ?> p = (Pair)o;
return ObjectsCompat.equals(p.first, this.first) && ObjectsCompat.equals(p.second, this.second);
}
}
複製代碼
ObjectsCompat 類裏面的 equals 方法:spa
public static boolean equals(@Nullable Object a, @Nullable Object b) {
if (VERSION.SDK_INT >= 19) {
return Objects.equals(a, b);
} else {
return a == b || a != null && a.equals(b);
}
}
複製代碼
Objects 是 Java7 之後纔有的類,而 Android 是從 4.4 開始支持 JDK7 編譯的,所以爲了兼容 4.4 以前的版本,在 v4 中加入了一個不依賴 JDK7 的 Pair 類。code
在既要以鍵值對的方式存儲數據列表,同時在輸出時保持順序的狀況下,咱們能夠使用 Pair 搭配 ArrayList 實現。源碼
場景一:string
假如咱們須要生成 n 個按鈕,而每一個按鈕都有 code 值、展現文本內容的 content 值,當咱們點擊其中一個按鈕後就根據 code 值去作指定的事情(如網絡請求)。it
ArrayList<Pair<String,String>> dataList = new ArrayList();
複製代碼
場景二:io
記錄推送過來的消息,咱們能夠用 Pair 的 first 記錄消息到達的時間戳,second 記錄消息體。
ArrayList<Pair<Long,Message>> dataList = new ArrayList();
複製代碼