java.util.Collections

来源:互联网 发布:沈阳管家婆软件代理 编辑:程序博客网 时间:2024/05/01 14:55

1、Collection使用比数组方便

例如:toString方法

String[] arr = new String[]{"A","B","C"};System.out.println(arr.toString());List<String> list = java.util.Arrays.asList(arr);System.out.println(list.toString());输出结果:[Ljava.lang.String;@15db9742[A, B, C]

2、Arrays.asList(T… t)

Arrays.asList(T… t)返回的list是一个不可以编辑的集合对象。但是可以添加空对象,但是不可以添加“null”

Arrays.asList(T… t)方法会的list,为Arrays的内部类 ,此私有静态内部类继承了AbstractList,此抽象AbstractList类对于add,remove方法的时下为直接抛出"unSopportedOperationException".

String[] arr = new String[]{"A","B","C"};System.out.println(arr.toString());List<String> list = java.util.Arrays.asList(arr);System.out.println(list.toString());//抛出异常:java.lang.UnsupportedOperationExceptionlist.remove(1);//抛出异常:java.lang.UnsupportedOperationExceptionlist.add(null);//抛出异常:java.lang.NullPointerExceptionlist.addAll(null);List<String> list2 = new ArrayList<String>();list2.add("D");list.addAll(list2);//不抛出异常list.addAll(Collections.EMPTY_LIST);

Arrays的源码如下:

 @SafeVarargs    @SuppressWarnings("varargs")    public static <T> List<T> asList(T... a) {        return new ArrayList<>(a);    }    private static class ArrayList<E> extends AbstractList<E>        implements RandomAccess, java.io.Serializable

AbstractList<E>源码如下:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {    public E remove(int index) {        throw new UnsupportedOperationException();    }}

list.addAll的源码如下,所以,在添加null元素是抛出异常“NullPointException”,添加“空的集合”时,不抛出异常,添加“有元素的集合”是,抛出“unSopportedException”

public boolean addAll(Collection<? extends E> c) {        Object[] a = c.toArray();        int numNew = a.length;        ensureCapacityInternal(size + numNew);  // Increments modCount        System.arraycopy(a, 0, elementData, size, numNew);        size += numNew;        return numNew != 0;    }

3、Collecionts集合操作

使用removeAll(Collection<?> c) 、containsAll(Collection<?> c) 、addAll(Collection<? extends E> c)、retainAll(Collection<?> c)  方法对集合进行操作,实现将一个集合(特别是由数组转化而成的集合)的内容转移到另一个集合,或者从一个较大对象集合中移除一个较小对象集合,或者判断一个较大的集合中是否存在一个较小的集合,或者保留某一个集合中的内容。

    取代数组的循环遍历方法查找、删除、判断有无。

    这些方法的效率远高于自己程序写的循环遍历方法。

4、遍历接口java.langIterator

实现了接口java.lang.Iterable中的iterator()方法返回一个java.util.Iterator,此接口在是在[JDK1.5]版本添加,返回一个实现了接口java.lang.Iterator [JDK1.2]的类。

我们可以随意使用 for 循环的变种,它可以在幕后处理上述所有工作,

例如:通过 Iterator 提供 Person 对象的孩子列表的一种方法。 这里提供内部 List 的一个引用 (这使 Person 外的调用者可以为家庭增加孩子 — 而大多数父母并不希望如此),Person 类型实现 Iterable。这种方法还使得 for 循环可以遍历所有孩子。

此方法实现了对“对父母的孩子的遍历,并且无法对Person的实例进行添加“child Person”与删除“child Person”,并且实现了Person类的向下递归

// Person.javaimport java.util.*;public class Person implements Iterable<Person>{    public Person(String name, Person... kids){        this.name = name;        for (Person child : kids)            children.add(child);    }    public String geName() { return this.name; }    public Iterator<Person> iterator() { return children.iterator(); }    public void setName(String value) { this.name = value; }    public String toString() {         return "[Person: " +"name=" + name +  "]";    }         private String name;    private List<Person> children = new ArrayList<Person>();} // App.javapublic class App{    public static void main(String[] args){        Person ted = new Person("Ted", new Person("Michael"), new Person("Matthew"));        // Iterate over the kids        for (Person kid : ted){            System.out.println(kid.getFirstName());        }    }}

 5、Collections的经典算法

 

1、反转 reverse(List<?> list) 

翻转指定列表中的元素的顺序。

2、 排序sort(List<T> list) 

据元素的自然顺序 对指定列表按升序进行排序,数组可以使用Arrays.sort()进行排序。

3、 混排(Shuffling) 

shuffle(List<?> list)混排算法所做的正好与 sort 相反: 它打乱在一个 List 中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排该 List, 这样的排列具有相同的可能性(假设随机源是公正的)

4、 替换所以的元素(Fill)

Collections.fill(li,"aaa"); 

5、 拷贝(Copy) 

copy(List<? super T> dest, List<? extends T> src) 用两个参数,一个目标 List 和一个源 List, 将源的元素拷贝到目标,并覆盖它的内容。目标 List 至少与源一样长。如果它更长,则在目标 List 中的剩余元素不受影响。 

dest的长度必须大于等于src集合的长度,如果小于,则抛出IndexOfBoundsException异常。

6、min方法,

返回Collections中最小元素(min) 

7、max方法

返回Collections中最小元素(max) 

8、lastIndexOfSubList方法,

返回指定源列表中最后一次出现指定目标列表的起始位置lastIndexOfSubList(List<?> source, List<?> target)

9、indexOfSubList

indexOfSubList(List<?> source, List<?> target) 返回指定源列表中第一次出现指定目标列表的起始位置

10、Rotate 

根据指定的距离循环移动指定列表中的元素 Collections.rotate(list,-1); 如果是负数,则正向移动,正数则方向移动 这个方法常常和List的subList方法结合使用,用于将一个list的某个或多个元素进行移动,而不破坏其余元素的顺序。例如为了将某个list的位置j的元素向前移动到k的位置。(设移动的距离为d(d >= 0),k = j + d + 1)。

Collections.rotate(list.subList(j, k+1), -1);

详情参见:http://blog.csdn.net/u014532901/article/details/52891183  

11、nCopies(int n, T o)  

返回由指定对象的 n 个副本组成的不可变列表

12、reverseOrder() 

返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序

13、reverseOrder(Comparator<T> cmp) 

返回一个比较器,它强行逆转指定比较器的顺序。

//Student类实现了Comparable接口,实现了compare方法,Collections.reverseOrder()返回的比较器为Student比较器的反向比较器

Comparator<Student> com = Collections.reverseOrder();

        Collections.sort(list, com);

14、swap(list,i,j)

在指定列表的指定位置处交换元素。

15、 swap(List<?> list,int i, int j)

(如果指定位置相同,则调用此方法不会更改列表。)

16、binarySearch(List<? extends Comparable<? super T>> list, T key) 
使用二分搜索法搜索指定列表,以获得指定对象。

 

 

 

 




原创粉丝点击