zoukankan      html  css  js  c++  java
  • JAVA中Collection和Collections的区别

    1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

    以下接口实现了Collection接口: 
    map,set,list,vector 

    Collection  
    ├List  
    │├LinkedList  
    │├ArrayList  
    │└Vector  
    │ └Stack  
    └Set 
    2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
    import java.util.ArrayList; 
    import java.util.Collections; 
    import java.util.List; 
     
    public class TestCollections { 
       
      public static void main(String args[]) { 
        //注意List是实现Collection接口的 
        List list = new ArrayList(); 
        double array[] = { 112, 111, 23, 456, 231 }; 
        for (int i = 0; i < array.length; i++) { 
          list.add(new Double(array[i])); 
        } 
        Collections.sort(list); 
        for (int i = 0; i < array.length; i++) { 
          System.out.println(list.get(i)); 
        } 
        // 结果:23 111 112 231 456 
      } 
    }

    具体来看下Collections中的sort方法:(以下代码摘自Collections类中源码)

     public static <T extends Comparable<? super T>> void sort(List<T> list) {
            Object[] a = list.toArray();
            Arrays.sort(a);
            ListIterator<T> i = list.listIterator();
            for (int j=0; j<a.length; j++) {
                i.next();
                i.set((T)a[j]);
            }
        }

    可以看到他的静态方法sort方法可以传入一个list,上面说过list是实现了Collection接口。然后将list转成了数组对象后,调用了Array的sort方法,将数组排序,再用list的迭代器(注意不是collection迭代器)一个个得赋值回去,就使得传入的list变成了一个有序的list。

    对以上的步骤相信看了源码都能看懂,数组的sort方法底层调用的是一个DualPivotQuicksort的方法,看着名字像快排,但可能有些不同,暂时没有仔细去研究。

    需要注意的是

    • 由于set,map都有SortedSet,TreeSet和SortedMap实现类,所以Collections中并没有对set和map支持sort方法
    • sort方法默认的顺序是升序,如果你想要降序排,你可以调用Collections中的另一个sort方法
    public static <T> void sort(List<T> list, Comparator<? super T> c) {
            Object[] a = list.toArray();
            Arrays.sort(a, (Comparator)c);
            ListIterator i = list.listIterator();
            for (int j=0; j<a.length; j++) {
                i.next();
                i.set(a[j]);
            }
        }

    可以看到,这个sort方法是传入了一个比较器,所以你可以定义如何来排序。

  • 相关阅读:
    JTable使用
    VirtualBox 虚拟机安装
    ICONIX简介
    反射在Java Swing编程中的应用之java 模仿.net事件处理
    【Ubuntu】UBUNTU中如何获得root权限
    html头部代码【转载】
    eclipse code templates 设置
    include与jsp:include区别【转载】
    银行卡
    【AJAX】DWR入门教程
  • 原文地址:https://www.cnblogs.com/shikamaru/p/8926311.html
Copyright © 2011-2022 走看看