gpt4 book ai didi

java - NetBeans 更改 HashMap 中键的顺序

转载 作者:太空宇宙 更新时间:2023-11-04 11:12:20 25 4
gpt4 key购买 nike

与直接调用 javac.exejava.exe 创建的 HashMap 对象相比,NetBeans 在将键值对放入 HashMap 时倾向于修改它们的顺序。

考虑以下类定义(省略packageimport声明):

class Coder {

enum Gender { FEMALE, MALE }
String name;
Gender gender;

Coder(String name, Gender gender) {
this.name = name;
this.gender = gender;
}

String getName() { return name; }
Gender getGender() { return gender; }
}

class Test{
public static void main(String[] args) {
List<Coder> list = Arrays.asList(
new Coder("Alice", Coder.Gender.FEMALE),
new Coder("Chuck", Coder.Gender.MALE),
new Coder("Bob", Coder.Gender.MALE));
Map<Coder.Gender, List<String>> classification = list.stream()
.collect(Collectors.groupingBy(Coder::getGender,
Collectors.mapping(Coder::getName, Collectors.toList())));
System.out.println(classification);

// Getting metainfo:
System.out.println("Actual map's type at runtime is " +
classification.getClass().getSimpleName());
System.out.println("OS: " + System.getProperty("os.name") +
", ver." + System.getProperty("os.version"));
System.out.println("Java ver.: " + System.getProperty("java.version"));

// Serializing:
String filename = "classification_cmd.ser";
// String filename = "classification_NetBeans.ser"; // toggle commenting-out as needed
File file = new File(filename);
try (
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream outs = new ObjectOutputStream(fos)
)
{ outs.writeObject(classification);
} catch (IOException ioe) { ioe.printStackTrace(); };
}
}

直接从 Windows 命令行(Java ver.1.8.0_066)编译并运行上述代码会产生以下结果:

{MALE=[Chuck, Bob], {FEMALE=[Alice]}

在 Linux 下,通过 Raspberry Pi(Java 版本 1.80_065)上的 CLI 并通过 ideone.com (Java ver.1.8.0_112)结果基本相同:第一个是男性组,然后是女性组。但是,在 Windows 下的 NetBeans 8.1(Java 版本 1.8.0_066)中,输出相反:

{FEMALE=[Alice], MALE=[Chuck, Bob]}

在所有情况下,相关映射的实际类型都是HashMap。将映射序列化到磁盘并查看内部,确认对象在键值对的顺序方面确实不同:

- 从命令行: enter image description here

- 来自 NetBeans 内部: enter image description here

因此我的问题是:

  • 为什么会发生这种情况,以及
  • 应该做什么(我的意思是,除了强制排序,例如使用围绕自定义 Comparator 构建的 TreeMap 等)来确保无论我们如何从命令行还是从 NetBeans 编译和运行程序,结果都完全相同?

最佳答案

不能保证一般的 Map 实现保留添加元素的任何顺序。

如果您确实关心该顺序,则确实需要使用像 TreeMap 这样的 NavigableMap 来保持键的顺序。您通常不需要提供比较器,如果没有给出,它会使用它们键类型的自然顺序。

关于java - NetBeans 更改 HashMap 中键的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45863174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com