Почему хэш-таблица (java.util.HashMap
) сортируются по долго, INT, байт и короткие?Почему хеш-таблица сортируется?
См код ниже:
public class Main {
private static final int INITIAL_CAPACITY = 10;
public static void main(String[] args) {
final Map<Long, Long> longMap = new HashMap<>(INITIAL_CAPACITY);
final Map<Integer, Integer> integerMap = new HashMap<>(INITIAL_CAPACITY);
final Map<Byte, Byte> byteMap = new HashMap<>(INITIAL_CAPACITY);
final Map<Short, Short> shortMap = new HashMap<>(INITIAL_CAPACITY);
final Map<Double, Double> doubleMap = new HashMap<>(INITIAL_CAPACITY);
final Map<Float, Float> floatMap = new HashMap<>(INITIAL_CAPACITY);
final Map<BigDecimal, BigDecimal> bigDecimalMap = new HashMap<>(INITIAL_CAPACITY);
final Map<String, String> stringMap = new HashMap<>(INITIAL_CAPACITY);
final Random random = new Random();
for(int i=0; i < 100; i++){
int value = random.nextInt(10);
longMap.put(Long.valueOf(value), Long.valueOf(value));
integerMap.put(Integer.valueOf(value), Integer.valueOf(value));
byteMap.put(Byte.valueOf((byte)value), Byte.valueOf((byte)value));
shortMap.put(Short.valueOf((short)value), Short.valueOf((short)value));
doubleMap.put(Double.valueOf(value), Double.valueOf(value));
floatMap.put(Float.valueOf(value), Float.valueOf(value));
bigDecimalMap.put(BigDecimal.valueOf(value), BigDecimal.valueOf(value));
stringMap.put(String.valueOf(value), String.valueOf(value));
}
System.out.println("\n========== SORTED ==========\n");
System.out.println("Map<Long, Long>: " + longMap);
System.out.println("Map<Integer, Integer>: " + integerMap);
System.out.println("Map<Byte, Byte>: " + byteMap);
System.out.println("Map<Short, Short>: " + shortMap);
System.out.println("\n======== NOT SORTED ========\n");
System.out.println("Map<Double, Double>: " + doubleMap);
System.out.println("Map<Float, Float>: " + floatMap);
System.out.println("Map<BigDecimal, BigDecimal>: " + bigDecimalMap);
System.out.println("Map<String, String>: " + stringMap);
}
}
Вывод этой программы:
========== SORTED ==========
Map<Long, Long> : {0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
Map<Integer, Integer> : {0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
Map<Byte, Byte> : {0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
Map<Short, Short> : {0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
======== NOT SORTED ========
Map<Double, Double> : {0.0=0.0, 3.0=3.0, 6.0=6.0, 7.0=7.0, 2.0=2.0, 1.0=1.0, 4.0=4.0, 9.0=9.0, 8.0=8.0, 5.0=5.0}
Map<Float, Float> : {1.0=1.0, 0.0=0.0, 4.0=4.0, 3.0=3.0, 5.0=5.0, 2.0=2.0, 8.0=8.0, 9.0=9.0, 7.0=7.0, 6.0=6.0}
Map<BigDecimal, BigDecimal> : {6=6, 0=0, 5=5, 9=9, 7=7, 8=8, 3=3, 4=4, 2=2, 1=1}
Map<String, String> : {3=3, 2=2, 1=1, 0=0, 7=7, 6=6, 5=5, 4=4, 9=9, 8=8}
Там нет нигде ничего, что определяет любой из них сортируется. Любая сортировка, которую вы видите, случайна и не полагается на нее. – EJP
Сортировка основана на том, что разработчики не ушли оттуда, чтобы усложнить реализацию. Есть простые случаи использования, когда вы получаете прямой результат. Поскольку вы продолжаете добавлять целые ключи, вы увидите, что расположение псевдослучайно. Коэффициент мощности и нагрузки играют определенную роль, и если вы создадите емкость 1 и коэффициент загрузки 100, вы увидите ключи в обратном порядке, которые вы добавили. http://vanillajava.blogspot.co.uk/2011/09/order-of-elements-in-hash-collection.html –
BTW. Действительная емкость HashMap - это мощность 2, по умолчанию 16, поэтому, когда вы устанавливаете емкость в 10, это то же самое, что не устанавливать ее вообще. –