在我的程序中,我想使用兩個鍵(整數)的Map。我的第一個想法是加入到整數以某種方式的字符串,如:有兩個鍵的Java Map - 解決方案的速度比較
String key = k1.toString()+"-"+k2.toString();
這個解決方案沒有看對我好:1)醜; 2)慢(處理數字作爲文本)。
我在這裏發現了其他方法在stackoverflow。它們基於將整數封裝在一個類中 - 一個目的類(MyKey)或更通用的類(Pair)。
我試圖運行一些速度測試,我的虛擬解決方案似乎是最快的。第一次拍攝後,我嘗試將轉換整數字符串封裝到一個新類(MyString)中,並針對此解決方案運行測試。
的地圖定義是:
Map<Pair<Integer,Integer>,String> map1 = new HashMap<>();
Map<MyKey,String> map2 = new HashMap<>();
Map<String,String> map3 = new HashMap<>();
Map<MyString,String> map4 = new HashMap<>();
的測試結果(跑了多次,顯得穩重):
map: put+get=total
1: 52+154=206
2: 29+77=106
3: 23+49=72
3: 17+55=72
用繩子解決方案更快。搜索時,字符串鍵的直接連接更快,輸入時更慢。
我的問題是:
1)爲什麼使用String的解決方案更快? (一次調用hashCode()?)
2)有沒有什麼理由不應該用String來解決問題?
其他信息:
在地圖記錄數是約6000
測試試圖獲得也爲許多unexisting鍵的值。它能改變測試結果嗎?
在我的程序中,我生成布爾[N]的排列,其中M值爲真。有一次,我得到某個N,M的結果;我想存儲它們以備再次使用。
而這就是在我的例子中使用的類的完整代碼:
class Pair<L,R> {
private final L left;
private final R right;
public Pair(L left, R right) {
this.left = left;
this.right = right;
}
public L getLeft() { return left; }
public R getRight() { return right; }
@Override
public int hashCode() { return left.hashCode()^right.hashCode(); }
@Override
public boolean equals(Object o) {
if (o == null) return false;
if (!(o instanceof Pair)) return false;
Pair pairo = (Pair) o;
return this.left.equals(pairo.getLeft()) &&
this.right.equals(pairo.getRight());
}
}
class MyKey {
public Integer k1;
public Integer k2;
public MyKey(Integer k1, Integer k2) {
this.k1 = k1;
this.k2 = k2;
}
@Override
public int hashCode() {
return k1.hashCode() + 17 * k2.hashCode();
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (o == null || !(o instanceof MyKey)) {
return false;
}
MyKey cp = MyKey.class.cast(o);
return k1.equals(cp.k1) && k2.equals(cp.k2);
}
}
class MyString {
private String value;
public MyString(Integer k1, Integer k2) {
value=k1+"-"+k2;
}
@Override
public int hashCode() {
return value.hashCode();
}
@Override
public boolean equals(Object o) {
return o.equals(value);
}
}
正如我在第二個代碼示例中看到的,我只需要爲關鍵數字(它甚至可以小於int的範圍)設置一些限制,〜按位逐個連接數字並將其用作一個數字。是對的嗎? 第一個代碼示例:我不確定創建映射圖是否是一種好方法。 – jcjr
你是對的,但你沒有獲得太多的收益。我會做你認爲你的問題在概念上更清晰的內容。 –