public class HashMapKeySet {
public static void main(String[] args) {
Map<HashCodeSame,Boolean> map=new HashMap();
map.put(new HashCodeSame(10),true);
map.put(new HashCodeSame(2),false);
for(HashCodeSame i:map.keySet())
System.out.println("Key: "+i+"\t Key Value: "+i.getA()+"\t Value: "+map.get(i)+"\t Hashcode: "+i
.hashCode());
System.out.println("\nEntry Set******");
for(Map.Entry<HashCodeSame, Boolean> i:map.entrySet())
System.out.println("Key: "+i.getKey().getA()+"\t Value: "+i.getValue()+"\t Hashcode: "+i.hashCode());
System.out.println("\nValues******");
for(Boolean i:map.values())
System.out.println("Key: "+i+"\t Value: "+map.get(i)+"\t Hashcode: "+i.hashCode());
}
static class HashCodeSame{
private int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
HashCodeSame(int a){
this.a=a;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
HashCodeSame that = (HashCodeSame) o;
return a == that.a;
}
@Override
public int hashCode() {
return 1;
}
}
}Зачем нам нужен LinkedHashMap, если keySet() поддерживает порядок для HashMap?
Если бы вы могли видеть в приведенном выше примере, я явно сделал хэш-код() возвращение 1 во всех случаях, чтобы проверить, что происходит, когда происходит столкновение key.hashcode() в HashMap , Что произойдет, связанный список сохраняется для этих Map.Entry объектов, таких как
1 (key.hashcode()) будет ссылаться на < 2, ложная> будет ссылка на < 10, правда>
(поскольку ложное значение вводится после истинного значения, как я понимаю).
Но когда я делаю keySet(), сначала возвращается значение true, а затем false, вместо того, чтобы сначала возвращать false.
Итак, что я здесь принимаю, поскольку keySet() - это набор и набор, поддерживающий порядок, мы получаем true и false во время итерации. Но, опять же, почему бы нам не сказать, что hashmap поддерживает порядок, так как единственный способ получить по порядку. Или почему мы используем LinkedHashMap?
Key: [email protected] Key Value: 10 Value: true Hashcode: 1
Key: [email protected] Key Value: 2 Value: false Hashcode: 1
Entry Set******
Key: 10 Value: true Hashcode: 1230
Key: 2 Value: false Hashcode: 1236
Values******
Key: true Value: null Hashcode: 1231
Key: false Value: null Hashcode: 1237
Теперь, когда я добавить chsnge метод хэш, чтобы возвращать как
@Override
public int hashCode() {
return a;
}
Я получаю обратный порядок. Кроме того при добавлении
map.put(new HashCodeSame(10),true);
map.put(new HashCodeSame(2),false);
map.put(new HashCodeSame(7),false);
map.put(new HashCodeSame(3),true);
map.put(new HashCodeSame(9),true);
выход получил есть
Key: [email protected] Key Value: 2 Value: false Hashcode: 2
Key: [email protected] Key Value: 3 Value: false Hashcode: 3
Key: [email protected] Key Value: 7 Value: false Hashcode: 7
Key: [email protected] Key Value: 9 Value: true Hashcode: 9
Key: [email protected] Key Value: 10 Value: true Hashcode: 10
Entry Set******
Key: 2 Value: false Hashcode: 1239
Key: 3 Value: false Hashcode: 1238
Key: 7 Value: false Hashcode: 1234
Key: 9 Value: true Hashcode: 1222
Key: 10 Value: true Hashcode: 1221
Values******
Key: false Value: null Hashcode: 1237
Key: false Value: null Hashcode: 1237
Key: false Value: null Hashcode: 1237
Key: true Value: null Hashcode: 1231
Key: true Value: null Hashcode: 1231
Теперь снова заставляет меня задаться вопросом, почему заказ приходит в отсортированном образом.? Может ли кто-нибудь объяснить мне подробно, как работают методы keySet(), entrySet() hashmap?
это происходит потому, что элементы, добавленные с тем же хэш-код все в конечном итоге в том же ведре, и сохраняется порядок вставки, что это не так, если вы распространили хэш-коды. Использование одного и того же хэш-кода для всех объектов - плохая идея. –
«Зачем нам нужен LinkedHashMap, если keySet() поддерживает порядок для HashMap?» Заказ ключей хэш-карт не определен; если вы видите, что они выходят в порядке, который вы ожидаете, это совпадение и не всегда гарантируется. –
Можете ли вы мне понять внутреннюю реализацию keySet()? Как и в этой http://stackoverflow.com/questions/1882762/is-the-java-hashmap-keyset-iteration-order-consistent link, она задана, keySet всегда в том же порядке, что и введенный, хотя итерация по нему будет дороже, чем повторение связанногоHashMap. – dgupta3091