在某些情況下蒜鸡,既需要已鍵值的方式存儲數(shù)據(jù)列表婶芭,還需要在輸出的時(shí)候保持順序。HashMap滿足前者吏口,ArrayList則滿足后者奄容,再不打算去多做修改且數(shù)據(jù)類型相對簡單時(shí)冰更,可以選擇Android提供的一種工具類:Pair(搭配ArrayList)。
1. Pair 實(shí)例
Pair生成實(shí)例的方式有兩種:
Pair pair = new Pair(1, "3");
or
Pair pair = Pair.create("1", 3);
實(shí)際上方式二在內(nèi)部的實(shí)現(xiàn)只是對方式一的調(diào)用:
public static <A, B> Pair <A, B> create(A a, B b) {
return new Pair<A, B>(a, b);
}
同時(shí)可以看出昂勒,Pair接收的數(shù)據(jù)類型是兩個(gè)泛型蜀细,因此可以傳入自定義的實(shí)體類。
2. 如何取值
Pair內(nèi)部數(shù)據(jù)的存儲如下:
public class Pair<F, S> {
public final F first;
public final S second;
...
}
僅僅使用了兩個(gè)public的變量戈盈,因此在取值時(shí)可以直接取用奠衔。
int key = pair.first;
String value = pair.second;
3. 關(guān)于比較
無論是ArrayList還是HashMap,凡是列表都會涉及到比較某元素是否已存在的情況塘娶。而Pair在內(nèi)部實(shí)現(xiàn)equals方式是通過兩個(gè)值的比較結(jié)果得出結(jié)果归斤,這里涉及到一個(gè)問題:android.util.Pair與android.support.v4.util.Pair。
v4的Pair與常規(guī)Pair間的區(qū)別只在比較處刁岸,查看源碼如下:
- android.util.Pair
@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);
}
- android.support.v4.Pair
@Override
public boolean equals(Object o) {
if (!(o instanceof Pair)) {
return false;
}
Pair<?, ?> p = (Pair<?, ?>) o;
return objectsEqual(p.first, first) && objectsEqual(p.second, second);
}
private static boolean objectsEqual(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
唯一不同的是調(diào)用最終的比較方法脏里,v4采用自己寫的一個(gè)方法,而常規(guī)Pair則使用Objects類的equals方法虹曙,而Objects的equals方法實(shí)際上內(nèi)部就是v4的objectsEqual使用的邏輯迫横,那么為什么會有這個(gè)差別呢?
Objects這個(gè)類是Java7才有的類酝碳,而Android是從4.4KitKat開始支持JDK7編譯矾踱,因此為了保證4.4之前的版本不會有空指針問題(4.4前的常規(guī)Pair),在v4中加入了一個(gè)不依賴JDK7的獨(dú)立類疏哗。
關(guān)于Pair這個(gè)類呛讲,相對簡單,卻也恰到好處返奉。