filter(list, new Predicate<Integer>() { public boolean test(Integer i) { return i <= 5; } });
List转Set最简单的方法有两种方法来实现该功能,取决于你如何定义“相等”。第一种方法将list存入HashSet,元素的重复主要由hashCode()来区分,大多数情况下,这是可行的。但是,如果你需要自己定义相等的比较方式,最好使用第二种方法,定义自己的比较器。
Set<Integer> set = new HashSet<Integer>(list);
Set<Integer> set = new TreeSet<Integer>(aComparator); set.addAll(list);
ArrayList中删除重复元素这个问题和上一个很像,如果你不关心ArrayList中元素的顺序的话,一个聪明的方法是通过将list元素存入set集合中来去除重复元素,然后将set集合的元素移回到List中。如下代码:
ArrayList** list = ... // initial a list with duplicate elements Set<Integer> set = new HashSet<Integer>(list); list.clear(); list.addAll(set);
如果你关心元素的顺序的话,可以使用标准JDK中的LinkedHashSet来实现该功能。
对集合排序Java中有几种方式来维持集合中元素的顺序,它们提供了默认的排序顺序或者通过指定比较器来排序。不过即使是默认的排序,集合中的任何元素也需要实现Comparable接口。
Collections.sort()方法能够对一个List集合进行排序,正如javadoc中描述的,这种排序方法是稳定且能保证排序性能为n log(n)。
PriorityQueue为一个有序队列,它与Collections.sort()的区别是PriorityQueue队列一直是有序的,但是你只能访问队头和队尾,不能随即访问元素,如PriorityQueue.get(4)之类的操作。
如果集合中没有重复的元素,TreeSet是另外一种选择。跟PriorityQueue类似,它能一直维护元素的顺序,你能直接获取TreeSet中的第一个和最后一个元素,但是你仍然不能随即访问集合中的元素。
简单的说,Collections.sort()提供了对List的一次性排序,PriorityQueue和TreeSet能一直维持集合中元素的顺序,但是不能随即访问元素。
Collections.emptyList()与直接new一个实例的区别该问题也适用于emptyMap()和emptySet()。
这两种方式都返回了一个空集合,但是Collections.emptyList()返回的是一个不可变集合,意味着你不能往这个空集合新增元素。事实上,每次调用Collections.emptyList()并不会创建一个空集合,而是复用已经存在的空集合实例。如果你熟悉单例模式的话,你应该知道我所说的,如果你频繁调用的话,这将会提供更好的性能。
Collections.copy方法有两种方法讲一个List集合拷贝到另外一个List集合,其中一种是使用ArrayList的构造方法,如下:
ArrayList<Integer> dstList = new ArrayList<Integer>(srcList);
另一种是使用Collections.copy()方法(如下),注意第一行,我们分配了一个和源List集合长度相等的初始容量。
ArrayList<Integer> dstList = new ArrayList<Integer>(srcList.size()); Collections.copy(dstList, srcList);
这两种方法都使用浅拷贝,那么这两种方法的区别是什么呢?
首先,当目标集合没有足够的空间存放源集合中的元素时,Collections.copy()方法不会对目标集合扩容,它会抛出一个IndexOutOfBoundsException异常。
Collections.copy()的参数类型只能是List接口的实现类,而ArrayList的构造方法可以接受Collection接口的实现类作为入参,因此更加普通。