举个简单的例子,考虑一个Place
类:
public class Place {
//fields
private String name;
private String state;
private int population;
private int squareMileage;
private int elevation;
//constructors
public Place() {
}
public Place(String name, String state) {
this.name = name;
this.state = state;
}
public Place(String name, String state, int population, int squareMileage,
int elevation) {
this.name = name;
this.state = state;
this.population = population;
this.squareMileage = squareMileage;
this.elevation = elevation;
}
//getters and setters
public String getName() {
return this.name;
}
public String getState() {
return this.state;
}
//... (other getters and setters omitted)
//do stuff
}
还有一个 Places
类(一个 Place
对象的 HashMap
):
import java.util.*;
public class Places {
private Map searchablePlaces;
public Places() {
searchablePlaces = new HashMap();
}
public void add(Place value) {
Place key = new Place(value.getName(), value.getState());
searchablePlaces.put(key, value);
}
public Place find(Place key) {
return searchablePlaces.get(key);
}
//override hashCode, equals
//do stuff
}
本质上,我的问题是:
- 在
HashMap
中搜索key
与直接搜索value
相比,比方说,a排序ArrayList
? - 如果
key
的类型String
等于name + state
(或类型String[2]
)?
最佳答案
恕我直言,这令人困惑。我会定义一个 PlaceKey 类,只包含一个名称和一个状态,并定义 hashCode 和 equals。一个地方将拥有一个 PlaceKey 和其他属性。我会使用 Map<PlaceKey, Place>
.
请注意,在您的示例中,需要 equals 和 hashCode 的是 Place 类,而不是 Places 类。
现在,回答您的 2 个问题:
- HashMap 的复杂度为 O(1),而列表的复杂度为 O(n)。因此, map 通常会更快(除非 n 值非常小)
- 连接几乎总是一个坏主意。您可以让 name1 = aa、state1 = a、name2 = a 和 state2 = aa,这会导致冲突。数组不会在内容方面覆盖 equals 和 hashCode,因此不是合适的映射键类。
关于java - (Java) 使用 map 时,键和值具有相同的类型是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412787/