Java遍历HashSet为啥输出是有序的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java遍历HashSet为啥输出是有序的相关的知识,希望对你有一定的参考价值。
实现是会变的,HashSet的迭代器在输出时“不保证有序”,但也不是“保证无序”。也就是说,输出时有序也是允许的,但是你的程序不应该依赖这一点。 参考技术AThis 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为啥输出是有序的的主要内容,如果未能解决你的问题,请参考以下文章