为什么Java map.get(index)
中没有HashMap
?
要访问HashMap
中第一个键的值,我必须将密钥放入列表中list.get(0)
,然后将其传递给map.get(list.get(0))
;我觉得这很笨拙。为什么会这样?
从<{1}}访问“第一个或第二个元素”的正确的方法是什么?
(请不要建议“将HashMap
转换为HashMap
并通过LinkedHashMap
访问它。”
答案 0 :(得分:3)
要求HashMap
的“第一个elemet”没有意义,因为顺序可以(并且通常会)随着元素的添加和删除而改变。
“......不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。”
您可以使用以下实验进行测试:
import java.util.HashMap;
public class M {
public static void main(String[] args) {
HashMap<String, Integer> m = new HashMap<String, Integer>();
for (int i=1, p=1; i<100000; i++) {
m.put(""+i, i);
if (i == p) {
p <<= 1; // keys are reordered at power-of-two multiples
System.out.println("at " + p + ": first is now "
+ m.keySet().iterator().next());
}
}
}
}
输出为(JDK 1.7):
at 2: first is now 1
at 4: first is now 2
at 8: first is now 3
at 16: first is now 3
at 32: first is now 15
at 64: first is now 19
at 128: first is now 35
at 256: first is now 35
at 512: first is now 35
at 1024: first is now 338
at 2048: first is now 338
at 4096: first is now 1411
at 8192: first is now 3280
at 16384: first is now 6873
at 32768: first is now 10997
at 65536: first is now 10997
at 131072: first is now 10997
如果您需要可重复排序(=迭代元素将始终为您提供插入顺序),您始终可以使用LinkedHashMap
。请注意,它们需要更多的内存,并且比标准品种稍慢。
答案 1 :(得分:2)
HashMap没有排序:HashMap中的索引i
没有任何意义。
您只能使用密钥访问它。
答案 2 :(得分:1)
请参阅http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html:
&#34;此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。&#34;
所以没有第一个或第二个元素......
答案 3 :(得分:0)
如果元素的顺序对您很重要,则不应使用Hashmap。 Hashmap不是有序的数据结构。
答案 4 :(得分:0)
根据定义,地图(ping)在键或值上没有排序,这就是原因。
如果您查看JavaDoc,您会看到例如。密钥以Set
而不是List
返回。
我想你可以定义一个特殊的地图,例如保留。插入顺序,但不符合Java版本中的合同,后者明确指出它
“......不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。”
干杯,
答案 5 :(得分:0)
HashMap内部使用Set
。 Order is not preserved
。因此,您无法使用索引访问它。
答案 6 :(得分:0)
不确定您是否正在寻找:Iterate to find a Map entry at an index?或其他
List<Entry<String,Foo>> randAccess = new ArrayList<Entry<String,Foo>>(foos.entrySet());
randAccess.get(N)