Java遍历HashSet为啥输出是有序的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java遍历HashSet为啥输出是有序的相关的知识,希望对你有一定的参考价值。

实现是会变的,HashSet的迭代器在输出时“不保证有序”,但也不是“保证无序”。也就是说,输出时有序也是允许的,但是你的程序不应该依赖这一点。 参考技术A

This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This class permits the null element.

看HashSet的API描述,说不保证循环元素的顺序,所以就有可能是有序的,也有可能是无序的。

本回答被提问者采纳

初识java集合——树集

*TreeSet与HashSet相比,树集是有序集合,对树集遍历,每个值将自动按照排序顺序呈现。
* TreeSet当前使用的是红黑树,每次将一个元素添加到树中时,都将被放置正确的位置之中
*
* 在TreeSet中添加元素的速度要快于数组和链表,但慢于散列表(HashSet)
*
* TreeSet在默认情况下,假定插入的元素实现了Comparable接口,该接口值返回负数,表明a位于b之前
*
* public interface Comparable<T>
* {
* int compareTo( T other);
* }
*
* 使用Comparable接口定义的排序有其局限性
* 如果要插入自定义的对象,就必须实现Comparable接口定义排列顺序
* 这里有一个问题需要思考,如果在一个集合中需要按照某一种规则,在另外一个集合却使用另一种规则
* 而如果要对一个类的对象进行排序,该类并没有实现Comparable接口,这时候怎么办?
*
* 此时,可以将Comparator对象传递给TreeSet的构造器来告诉使用该种排列规则
*
* public interface Comparator<T>
* {
* int compara(T a, T b);
* }
*

 1 //例子
 2 class  myComparator implements Comparator<String>{
 3 
 4     @Override
 5     public int compare(String o1, String o2) {
 6         if (o1.length() > o2.length()) {
 7             return 1;
 8         }else if( o1.length() < o1.length()){
 9             return -1;
10         }else{
11             return 0;
12         }
13     }
14 };
15 
16 //然后将构造的比较器传入
17 myComparator my = new myComparator();
18 TreeSet<String> tree = new TreeSet<>(my);

 


* 如果按照描述信息进行排序就如 例子一样, 然后将类的对象传递树集的构造器,这样就构造了一颗带比较的树
* 注意到,这个比较器没有任何数据,它只是比较方法的持有器(有时将这种对象称为函数对象)
* 函数对象通常动态定义,即常常用匿名内部类,如例子2
*

//例子2
TreeSet<Student> stuTree = new TreeSet<Student>(new Comparator<Student>(){
    @Override
    public int compare(Student o1, Student o2) {
        if (o1.getBook().getPrice() > o2.getBook()
                .getPrice()) {
            return -1;
        } else if (o1.getBook().getPrice() < o2
                .getBook().getPrice()) {
            return 1;
        } else {
            return 0;
        }
    }
});

 


* 如果不需要进行排序,那么没必要为排序开销,对于某些数据来说,对其排序比散列函数更加困难
*






























以上是关于Java遍历HashSet为啥输出是有序的的主要内容,如果未能解决你的问题,请参考以下文章

java面试题9

Java HashSet源码解析

java容器

java中HashSet怎样遍历取出里面的值?给个例子~~

java - 集合 - set

java,hashset,string一点问题?为啥hashset可以识别String唯一性?