В HashSet порядок вставки состоит из символов нижнего регистра («a») и верхнего регистра («A»). Как это поведение может быть оправдано?
public class SetCharTest {
public static void main(String[] args) {
String str = "AzbaAacb"; // this is input string
System.out.println("Unique Characters are: " + uniqueCharSet(str));
}
public static Set<Character> uniqueCharSet(String str) {
Set<Character> charSet = new HashSet<Character>();
for(int i = 0; i < str.length(); i++)
charSet.add(str.charAt(i));
for(Character c : charSet)
System.out.println("Hashcode of " + c + " is: " +c.hashCode());
return charSet;
}
}
Case 1:
inupt: "AzbaAacb"
Output:
Hashcode of A is : 65
Hashcode of a is : 97
Hashcode of b is : 98
Hashcode of c is : 99
Hashcode of z is : 122
Unique Characters are : [A, a, b, c, z]
Case 2:
Input: "zbaAacb"
output:
Hashcode of a is : 97
Hashcode of A is : 65
Hashcode of b is : 98
Hashcode of c is : 99
Hashcode of z is : 122
Unique Characters are : [a, A, b, c, z]
Здесь в обоих случаях позиция «A» (или «a») зависит от порядка вставки. Но как?
Этот класс реализует интерфейс Set, поддерживаемый хеш-таблицей (фактически, экземпляром HashMap). Это не дает никаких гарантий относительно порядка итераций множества;в частности, это не гарантирует, что порядок останется постоянным с течением времени. Этот класс допускает нулевой элемент. Этот класс обеспечивает постоянную производительность по времени для основных операций (добавление, удаление, содержание и размер), при условии, что хеш-функция правильно распределяет элементы по сегментам.
Источник
Поскольку операция добавления HashSet основана на HashCode, она неявно создает отсортированный вывод (от "a" до "z"). Как описано здесь и здесь .
В соответствии с ответом в этом потоке: «Порядок вставки напрямую влияет на порядок итерации, когда у вас естьстолкновение ковша ". Но это не похоже на столкновение «а» и «А» в вышеуказанной программе. Так почему же сохраняется порядок вставки?