为什么HashSet不能按代码中的顺序添加对象?

问题描述

这是我尝试过的。

import java.util.*;
public class SetDemo {

    public static void main(String[] args) {
        // Todo Auto-generated method stub
        HashSet<String> s1=new HashSet<String>();
        s1.add("Java");
        s1.add("C++");
        s1.add("C");
        s1.add("dotNet");
        s1.add("JavaScript");
        s1.add("Script");
        s1.add("Python");
        s1.add("JavaScript");
    }
}

输出 [Java,脚本,C ++,dotNet,C,JavaScript,Python]

编辑:Just read this,i think it might be answer to what i was asking

解决方法

来自relevant JavaDoc

该类实现Set接口,由哈希表支持 (实际上是一个HashMap实例)。 它不能保证 集合的迭代顺序;特别是,它不能保证 随着时间的推移,订单将保持不变。此类允许null 元素。

基本上是HashSet:

  • 存储唯一元素并允许为空
  • 由HashMap支持
  • 不保持广告插入顺序
  • 不是线程安全的
,

您需要同时使用LinkedHashSet<>()

import java.util.*;
public class SetDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashSet<String> s1=new LinkedHashSet<String>();
        s1.add("Java");
        s1.add("C++");
        s1.add("C");
        s1.add("dotNet");
        s1.add("JavaScript");
        s1.add("Script");
        s1.add("Python");
        s1.add("JavaScript");
    }
}

如果需要自然顺序,也可以使用SortedSet