[英]How does HashSet sort?
我正在为几周后的编程考试做练习。 较小的任务之一是要求用户输入(链接)并将其添加到唯一列表(集合)。
这是我做到的方式(而且有效):
DefaulListModel m = new DefaulListModel();
JList aList = new JList(m);
ArrayList<String> lenker = new ArrayList<String>();
Set<String> unique;
(...)
String url = JOptionPane.showInputDialog(null, "Skriv inn URL");
lenker.add(url);
unique = new HashSet<String>(lenker);
this.oppdaterGUI(liste, unique);
(...)
public void oppdaterGUI(JList liste, Set<String> array){
m.clear();
for(Object s : array){
m.addElement((String) s);
aList.setModel(m)
}
这是我的问题:测试时,我输入了数字1,2,3,4,5,1
现在,我假设ArrayList包含数字[1,5,4,3,2,1]并且我假设在将其添加到HashSet之后,它看起来应该像{5,4,3,2,1}
但是,它看起来像这样:{3,2,1,5,4}
为什么我的假设是错误的?
编辑:澄清。 我知道HashSet没有排序(即TreeSet),但是当我添加数字时,它们已经排序了,为什么它们不排序就出来? 我已经做过多次了,每次它们以未分类的方式完全一样地出现。 每一次。
那我的假设为什么错了? 我只是好奇。 可能是因为我的代码很烂,我不知道,这就是为什么我在这里询问。
Set不是排序的数据结构。 仅此而已:)
但是,有具有排序机制的Set实现。 例如, treeset 。
回答您的编辑:
它们之所以没有排序,是因为HashSet在内部使用了HashMap,它通过某种哈希算法将条目分配到存储桶中。 那些存储桶以某种顺序检查,因此不能保证保持不变。
HashSet在内部使用哈希映射,并且哈希映射不能保证顺序会随着时间的推移保持恒定。
如果您对Java中任何类的内部工作感到好奇,请在jdk安装文件夹下找到src zip文件并查看内部。
HashSet可能只是一个数组,并使用哈希函数来指示将值插入哪个存储桶。 它保证唯一性,但不保证任何顺序。
如果您需要该集合具有插入顺序 ( for
与插入数字相同的顺序for
迭代),请使用LinkedHashSet
。 当您在插入越来越多的数字时不需要保持集合的排序时, TreeSet
会显得过分TreeSet
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.