这个问题只是出于好奇,但我注意到使用键集迭代HashMap似乎总是按排序顺序排列。显然,使用HashMaps永远不会保留插入顺序,但排序的键顺序对我来说似乎有点奇怪。使用这个例子:
<form id="form">
<label for="number">Guess number between 0-100: </label>
<input id="number" type="text" name="number">
<button type="submit">Guess</button>
</form>
<p id="lower"></p>
<p id="higher"></p>
<p id="hint"></p>
<p id="numbers"></p>
<script src="numbergame.js"></script>
输出:
import java.util.HashMap;
public class test {
public static void main(String[] args) {
HashMap<Integer, String> someMap = new HashMap<Integer, String>();
someMap.put(0, "nothing");
someMap.put(7, "nothing");
someMap.put(3, "nothing");
someMap.put(4, "nothing");
someMap.put(10, "nothing");
someMap.put(11, "nothing");
someMap.put(2, "nothing");
someMap.put(1, "nothing");
someMap.put(5, "nothing");
for (Integer someInt : someMap.keySet()) {
System.out.println(someInt);
}
}
}
这是否可靠且一致?如果HashMap实现是一个数组,如果keyset只是遍历从0开始的所有可用数组索引,这将是有意义的,但我可能错了,它比这更复杂。
答案 0 :(得分:2)
HashMaps
和HashSets
期间不保证特定订单。您可以通过删除和添加一些元素来解除订单。
结帐:
import java.util.HashMap;
public class test {
public static void main(String[] args) {
HashMap<Integer, String> someMap = new HashMap<Integer, String>();
someMap.put(0, "nothing");
someMap.put(7, "nothing");
someMap.put(3, "nothing");
someMap.put(4, "nothing");
someMap.put(10, "nothing");
someMap.put(11, "nothing");
someMap.put(2, "nothing");
someMap.put(10004, "nothing");
someMap.put(1, "nothing");
someMap.put(5, "nothing");
for (Integer someInt : someMap.keySet()) {
System.out.println(someInt);
}
}
}
在大多数类型的散列集中,散列函数排除特定值的位置。
答案 1 :(得分:1)
来自javadoc:
此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。
您所看到的可能是关于JVM实现以及如何管理哈希码的巧合,或者可能(但不太可能):
请注意,使用具有相同hashCode()的许多键是降低任何哈希表性能的可靠方法。为了改善影响,当键是可比较的时,这个类可以使用键之间的比较顺序来帮助打破关系。
无论如何,这不可靠或不变。
答案 2 :(得分:1)
可能是这样;但由于它没有在java文档中记录,因此您不应该根据此类行为进行编码。由于新的Java版本可以更改public void run()
{
int h = 0;
int t = 0;
boolean wasHeads = false;
boolean isHeads = false;
int longest = 0;
int streak = 0;
int ih = 0;
for (int i = 0; i < FLIPS; i++) {
int coinFlip = Randomizer.nextInt(1, 2);
if (coinFlip == 2) { //heads
System.out.println("Heads");
if (wasHeads = true) {
streak++;
} else {
streak = 0;
}
wasHeads = true;
} else if(coinFlip == 1) { //tails
System.out.println("Tails");
t++;
isHeads = false;
if (streak > longest){
longest = streak;
}
streak = 0;
ih = 0;
}
}
System.out.println("Longest streak of heads: " + longest);
}
实现,这可能会提供非升序订单密钥;所以根据这种行为你所做的任何代码都会破坏