1700445705
1700445706
set.add(new Person(180));
1700445707
1700445708
//身高175CM
1700445709
1700445710
set.add(new Person(175));
1700445711
1700445712
//身高最矮的人大变身
1700445713
1700445714
set.first().setHeight(185);
1700445715
1700445716
//set重排序
1700445717
1700445718
set=new TreeSet<Person>(new ArrayList<Person>(set));
1700445719
1700445720
}
1700445721
1700445722
就这一句话即可重新排序。可能有读者会问,使用TreeSet(SortedSet<E>s)这个构造函数不是可以更好地解决问题吗?不行,该构造函数只是原Set的浅拷贝,如果里面有相同的元素,是不会重新排序的。
1700445723
1700445724
(2)彻底重构掉TreeSet,使用List解决问题
1700445725
1700445726
我们之所以使用TreeSet是希望实现自动排序,即使修改也能自动排序,既然它无法实现,那就用List来代替,然后再使用Collections.sort()方法对List排序,代码较简单,不再赘述。
1700445727
1700445728
两种方法都可以解决我们的困境,到底哪一个是最优的呢?对于不变量的排序,例如直接量(也就是8个基本类型)、String类型等,推荐使用TreeSet,而对于可变量,例如我们自己写的类,可能会在逻辑处理中改变其排序关键值的,则建议使用List自行排序。
1700445729
1700445730
又有问题了,如果需要保证集合中元素的唯一性,又要保证元素值修改后排序正确,那该如何处理呢?List不能保证集合中的元素唯一,它是可以重复的,而Set能保证元素唯一,不重复。如果采用List解决排序问题,就需要自行解决元素重复问题(若要剔除也很简单,转变为HashSet,剔除后再转回来)。若采用TreeSet,则需要解决元素修改后的排序问题,孰是孰非,就需要根据具体的开发场景来决定了。
1700445731
1700445732
注意 SortedSet中的元素被修改后可能会影响其排序位置。
1700445733
1700445734
1700445735
1700445736
1700445738
编写高质量代码:改善Java程序的151个建议 建议82:由点及面,一叶知秋—集合大家族
1700445739
1700445740
Java中的集合类实在是太丰富了,有常用的ArrayList、HashMap,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap,有阻塞式的ArrayBlockingQueue,也有非阻塞式的PriorityQueue等,整个集合家族非常庞大,而且也是错综复杂,可以划分为以下几类:
1700445741
1700445742
(1)List
1700445743
1700445744
实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack,其中ArrayList是一个动态数组,LinkedList是一个双向链表,Vector是一个线程安全的动态数组,Stack是一个对象栈,遵循先进后出的原则。
1700445745
1700445746
(2)Set
1700445747
1700445748
Set是不包含重复元素的集合,其主要的实现类有:EnumSet、HashSet、TreeSet,其中EnumSet是枚举类型的专用Set,所有元素都是枚举类型;HashSet是以哈希码决定其元素位置的Set,其原理与HashMap相似,它提供快速的插入和查找方法;TreeSet是一个自动排序的Set,它实现了SortedSet接口。
1700445749
1700445750
(3)Map
1700445751
1700445752
Map是一个大家族,它可以分为排序Map和非排序Map,排序Map主要是TreeMap类,它根据Key值进行自动排序;非排序Map主要包括:HashMap、HashTable、Properties、EnumMap等,其中Properties是HashTable的子类,它的主要用途是从Property文件中加载数据,并提供方便的读写操作;EnumMap则是要求其Key必须是某一个枚举类型。
1700445753
1700445754
Map中还有一个WeakHashMap类需要说明,它是一个采用弱键方式实现的Map类,它的特点是:WeakHashMap对象的存在并不会阻止垃圾回收器对键值对的回收,也就是说使用WeakHashMap装载数据不用担心内存溢出的问题,GC会自动删除不用的键值对,这是好事。但也存在一个严重问题:GC是静悄悄回收的(何时回收?God knows!),我们的程序无法知晓该动作,存在着重大的隐患。
[
上一页 ]
[ :1.700445705e+09 ]
[
下一页 ]