Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java*排序*HashMap条目,即使它不应该';T_Java_Collections - Fatal编程技术网

为什么Java*排序*HashMap条目,即使它不应该';T

为什么Java*排序*HashMap条目,即使它不应该';T,java,collections,Java,Collections,Java中的HashMap不应该被排序,也不能保证顺序。它的顺序可以在应用程序的整个生命周期中更改,如果您想要一个已排序的映射,您应该使用LinkedHashMap,或者更好的是,使用TreeMap 我知道这一点,也经历过这一点,这一点得到了专家的证实 但是,我刚刚编写了一些代码,这些代码不会保持HashMap未排序。起初,我认为这是侥幸的巧合,但我多次运行代码,并显示了相同的输出 Map Map=newhashmap(); 地图.put(A),99.5 ;; 地图.put(“B”,67.4);

Java中的
HashMap
不应该被排序,也不能保证顺序。它的顺序可以在应用程序的整个生命周期中更改,如果您想要一个已排序的映射,您应该使用
LinkedHashMap
,或者更好的是,使用
TreeMap

我知道这一点,也经历过这一点,这一点得到了专家的证实

但是,我刚刚编写了一些代码,这些代码不会保持
HashMap
未排序。起初,我认为这是侥幸的巧合,但我多次运行代码,并显示了相同的输出

Map Map=newhashmap();
地图.put(A),99.5 ;;
地图.put(“B”,67.4);
地图放置(“C”,67.4);
地图放置(“D”,67.3);
System.out.println(“未排序映射:+map”);
这导致:

Unsorted map: {A=99.5, B=67.4, C=67.4, D=67.3}
Marcus=31
David=21
Vladimir=24
Scott=34
我假设
String
键以某种方式按字典顺序排序,因为它们遵循
A
B
C
D
,不过,下面是另一个示例,其中排序的
String
键不一定按字典值排序:

Map unsortedMap=newhashmap();
未分类地图放置(“David”,21);
未分类地图放置(“Scott”,34);
未分类地图放置(“Marcus”,31);
未分类地图放置(“Vladimir”,24);
unsortedMap.entrySet().forEach(System.out::println);
这一个结果是:

Unsorted map: {A=99.5, B=67.4, C=67.4, D=67.3}
Marcus=31
David=21
Vladimir=24
Scott=34
Marcus
在词汇上大于
David
,但
David
在词汇上小于
Vladimir

我假设源代码的这一部分具体负责:

static int tieBreakOrder(Object a, Object b) {
    int d;
    if (a == null || b == null ||
        (d = a.getClass().getName().
         compareTo(b.getClass().getName())) == 0)
        d = (System.identityHashCode(a) <= System.identityHashCode(b) ?
             -1 : 1);
    return d;
}
static int tieborkerder(对象a、对象b){
int d;
如果(a==null | | b==null||
(d=a.getClass().getName()。
比较(b.getClass().getName())==0)

d=(System.identityHashCode(a)假设
String
键已排序,这是正确的-但它不是按字典顺序排序的,而是基于键的散列。
方法
java.util.HashMap#put
使用方法
java.util.HashMap#hash
计算本例中键的散列-
String

字母A-65、字母B-66、字母C-67等的
java.util.HashMap#hash的结果针对单字母对象(检查了A-Za-z,不能说明任何其他值)。
David-65805752的
java.util.HashMap#hash的结果

然后,在方法
java.util.HashMap#putVal
中,使用计算出的哈希值来确定底层数组
java.util.HashMap#table
中的bucket索引。代码的确切部分:

p = tab[i = (n - 1) & hash]
它有效地根据哈希值对数组进行适当的索引


因此,是的-条目的顺序没有保证-但是它可以通过知道底层节点数组的确切大小和要放入map的键的hashcode进行操作

假设
String
键已排序,这是正确的-但它不是按字典排序的,而是基于键的哈希。
方法
java.util.HashMap#put
使用方法
java.util.HashMap#hash
计算本例中键的散列-
String

字母A-65、字母B-66、字母C-67等的
java.util.HashMap#hash的结果针对单字母对象(检查了A-Za-z,不能说明任何其他值)。
David-65805752的
java.util.HashMap#hash的结果

然后,在方法
java.util.HashMap#putVal
中,使用计算出的哈希值来确定底层数组
java.util.HashMap#table
中的bucket索引。代码的确切部分:

p = tab[i = (n - 1) & hash]
它有效地根据哈希值对数组进行适当的索引


所以,是的-条目的顺序没有保证-但是可以通过知道底层节点数组的确切大小和要放入map的键的hashcode来操作它

您使用了单字母键,它将散列到它们的ASCII值。一般来说,散列值不会随运行而改变,但可能会随版本而改变。t他是什么“未指明的行为”意思是说。如果你根据当前的工作方式编写代码,但这种行为尚未明确,那么代码将来可能会崩溃……或者可能会持续工作30年,直到突然失效。我总是很惊讶,像这样一个有效的、写得很好的、彻底的、有趣的问题经常会在堆栈上溢出,并得到否决票。«a
HashMap不应该排序»不正确。
Map
HashMap
对它们的顺序都没有具体的保证。这并不意味着无序。它们可以是有序的,也可以是不有序的。有序的内部管理是一个实现细节,与我作为调用程序员的职责无关。尽管您的问题和解决方案很有趣。您使用了单字母键,它将散列到它们的ASCII值。通常,散列值不会在不同的运行中更改,但可能会在不同的版本中更改。这就是“未指定行为”的含义意思是说。如果你根据当前的工作方式编写代码,但这种行为尚未明确,那么代码将来可能会崩溃……或者可能会持续工作30年,直到突然失效。我总是很惊讶,像这样一个有效的、写得很好的、彻底的、有趣的问题经常会在堆栈上溢出,并得到否决票。«a
HashMap不应该排序»不正确。
Map
HashMap
对它们的顺序都没有具体的保证。这并不意味着无序。它们可以是有序的,也可以是不有序的。有序的内部管理是一个实现细节,与我作为调用程序员的职责无关。尽管您的问题和答案很有趣。