java的集合框架浅析:包含的基本接口以及常用类

    java集合的根本是Iterator和Collection两个接口。Collection本身代表了集合,拥有最基本的方法:添加、删除、返回个数、清空集合等。而Iterator接口是Collection的父接口主要用来定义遍历集合的规则,被称作迭代器,里面有两个重要方法next()和hashnext()。

    在java集合里大致可以分为Set、List、Queue、Map四种体系。Set带表无序不可重复的集合,List代表有序可重复的集合,Map代表具有映射关系的集合,Queue代表了一种队列集合。其中List、Set、Queue是Collection的子接口。

    一、List:有序可重复的集合每个元素都有对应的顺序索引位置,可以通过索引来访问指定位置的集合元素。

    (1)ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全,效率高

    (2)AttributeList:继承ArrayList表示MBean属性值的列表。用于在AttributeList中插入Attribute对象的方法应重写超类ArrayList中的相应方法。为了确保AttributeList中所包含的对象只是Attribute对象,这是必需的。这可避免在检索AttributeList中的元素时出现异常。

    (3)LinkedList: 底层数据结构是链表,查询慢,增删快。线程不安全,效率高

    (4)Vector: 底层数据结构是数组,查询快,增删慢。线程安全,效率低

    (4)Stack:继承Vector,Stack类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类Vector进行了扩展 ,允许将向量视为堆栈。它提供了通常的push和pop操作,以及取堆栈顶点的peek方法、测试堆栈是否为空的empty方法、在堆栈中查找项并确定到堆栈顶距离的search方法。

    二、Queue:先进先出FIFO的容器,队列的头部是在队列中存放时间最长的元素,在尾部的元素存放时间最短,通常队列不允许随机访问队列中的元素

    (1)PriorityQueue:一个基于优先级堆的无界优先级队列。其元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator进行排序,具体取决于所使用的构造方法。优先级队列不允许使用null元素。依靠自然顺序的优先级队列不允许插入不可比较的对象。优先级队列是无界的但是有一个内部容量,控制存储队列元素的数组大小通常至少等于队列的大小。随着不断向优先级队列添加元素其容量会自动增加。

    (2)Deque:一个线性 collection,支持在两端插入和移除元素即双端队列,此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。

    (3)ArrayDeque:实现了Deque接口,数组双端队列没有容量限制它们可根据需要增加以支持使用。它们不是线程安全的在没有外部同步时,它们不支持多个线程的并发访问。禁止null元素。此类很可能在用作堆栈时快于Stack,在用作队列时快于LinkedList。此类的 iterator 方法返回的迭代器是fail-fast。

    三、Set:与Collection基本相同没有提供任何的额外方法,实际上Set就是Collection只是实现略有不同,Set不容许有重复元素。

    (1)HashSet:底层数据结构是哈希表。通过hashCode()和equals()来保证元素唯一性,通用的存储数据的集合

    (2)LinkedHashSet:底层数据结构是链表和哈希表。(FIFO插入有序,唯一)由链表保证元素有序,由哈希表保证元素唯一,主要功能用于保证FIFO即有序的集合(先进先出)

    (3)SortedSet:元素的总体排序的Set。对元素使用其自然顺序进行排序,或者根据通常在创建有序set时提供的Comparator进行排序。该set的迭代器将按元素升序遍历set,插入有序 set 的所有元素都必须实现 Comparable 接口,有序 set 使用它的compareTo(或compare)方法对所有元素进行比较。

    (4)TreeSet:底层数据结构是红黑树。(唯一,有序),通过自然排序(重写Comparable接口中的Compareto方法)和比较器排序(重写Comparator接口中的Compare方法)进行元素排序,主要功能用于排序。

    (5)EnumSet:枚举类型一起使用的专用Set实现。枚举set中所有键都必须来自单个枚举类型,该枚举类型在创建set时显式或隐式地指定。枚举set在内部表示为位向量。EnumSet是不同步的。如果多个线程同时访问一个枚举set,并且至少有一个线程修改该set,则此枚举set 在外部应该是同步的。

    四、Map:保存具有映射关系的数据,Map集合保存两组数一组值用户保存Map里的key一组值保存Map里的value,Key和value可以是任何引用类的数据,Map的key不允许重复,key和value之间存在一对一的关系。

    (1)HashMap:使用hash映射来存取数据,这个速度是相当快,是O(1)的速度。但HashMap可以使用null做为key和value

    (2)LinkedHashMap:和HashMap类似,只不过内部用链表来维护次序。因此遍历时候的顺序是其插入顺序同时遍历起来会比HashMap慢。但是当HashMap容量很大但是实际数据较少的时候,遍历起来可能会比LinkedHashMap慢。LinkedHashMap的遍历只与实际数据有关,但HashMap的遍历速度和它的容量有关。

    (3)weakHashMap:WeakHashMap与HashMap的用法基本类似,但WeakHashMap的key只保留对实际对象的弱引用,意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。如果需要使用WeakHashMap的key来保留对象的弱引用,则不要让该key所引用的对象具有任何强引用,否则将失去WeakHashMap的意义。

    (4)IdentityHashMap:在IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为两个key相等;相对于普通HashMap而言,只要key1和key2通过equals()方法返回true,且它们的hashCode值相等即可

    (5)HashTable:Hashtable是一个古老的Map实现类,Hashtable是一个线程安全的Map实现,如果有多条线程访问同一个Map对象时,使用Hashtable实现类会更好,Hashtable不容许使用null作为key和value,如果试图把null放进Hashtable中,将会引发NullPointerException异常

    (6)Properties:是Hashtable类的子类该类处理属性文件。 Properties类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件,也可以把属性文件中的属性名=属性值加载到Map对象中。由于属性文件里的属性名、属性值只能是字符串类型,所以Properties里的key、value都是字符串类型。

    (7)SortedMap:此接口扩展了Map 接口并提供了其元素的总排序(元素可以按键的排序顺序遍历)。TreeMap实现了SortedMap接口保证了有序性。默认的排序是根据key值进行升序排序,也可以重写comparator方法来根据value进行排序。

    (8)TreeMap:实现了SortedMap接口,基于红黑树的Map,能够把插入的数据根据键有次序保存默认为升序排序,并且有很高的效率。因此在遍历输出的时候可以得到排序的数据。但是这要求插入的数据实现了comparable接口。如果要按自定义排序或者自然顺序遍历键就可以使用TreeMap

猜你喜欢

转载自blog.csdn.net/ZytheMoon/article/details/89301253