Java基础知识——容器浅析

Posted David-Kuper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础知识——容器浅析相关的知识,希望对你有一定的参考价值。

容器类图结构

容器简介


Collection:

一个元素的序列,这些元素都服从一条或多条规则。其中List必须按照插入的顺序保存元素、Set不能有重复的元素、Queue按照排队规则来确定对象的产生顺序(通常也是和插入顺序相同);作为List,Set,Queue的基类,定义了这三种子类容器的操作规则和模版方法。

List:


继承自Collection,将元素维护在一个特定的序列当中,在Collection的基础上增加了很多操作方法。

  • ArrayList:
    数组序列,该容器的优点即随机访问速度快,因为它是按照数组来存放元素的,元素序列在一段连续的内存当中,可以通过下标来访问元素。但其缺点就是在中间插入元素的时候,由于涉及到数据的移动,导致插入数据比较慢。

  • LinkedList:
    链式序列,该容器实现了List和Queue的接口。它是按照链表的结构来存储元素。优点是可以很快的通过节点指针的变向来完成元素的插入和删除的操作。但是缺点是随机访问的时候速度比较慢,因为要涉及遍历的操作。同时,它也可以作为队列,和栈来使用。
    从序列的使用上来说,它与ArrayList优势互补,如果对访问要求较高那么采用ArrayList,如果对插入、删除要求比较高就使用LinkedList。

  • SparseArray:
    SparseArray是android框架独有的类。是Google官方推荐当key为整形的时候,替代HashMap(integer,value)的形式,替代HashMap的一种存储结构。它的目的是用来节省Android的内存消耗,但是执行消耗并不比HashMap快。

  • Vector:
    向量序列,该序列是线程安全的(ArrayList、LinkedList)都不是,因此,如果需要一个线程安全的序列可以用这个对象。它的缺点就是效率没有ArrayList高,在扩容的时候它会增加一倍的容器,而ArrayList默认增加50%。

Set:


Set是一个集合(概念与数学的集合相似),特点是不可以有重复的对象、无序,所以Set最常用的就是测试归属性,很容易的询问出某个对象是否存在Set中。并且Set是具有和Collection完全一样的接口,没有额外的功能,只是表现的行为不同。

  • HashSet:
    采用Hash算法实现的一个集合,集合里面无重复元素,查询速度很快,但是是没有序的。它的插入和查询的速度均表现很好。

  • TreeSet:
    采用红黑树实现的集合,特点是能够维护当前的集合顺序(元素需要实现Comparable)。对于每一个添加的元素都可以维护当前集合的顺序。

  • LinkedHashSet:
    链表式HashSet,元素的插入和查询通过Hash算法,但同时也维护了一个插入元素的链表,使得通过iterator访问集合的时候能够按照插入顺序来访问。由于维护了一个链表,因此他的访问速度不如HashSet。

Queue:


Queue是队列,队列是典型的先进先出的容器,就是从容器的一端放入元素,从另一端取出,并且元素放入容器的顺序和取出的顺序是相同的。LinkedList提供了对Queue的实现,LinkedList向上转型为Queue。其中Queue有offer、peek、element、pool、remove等方法。

offer是将元素插入队尾,返回false表示添加失败。peek和element都将在不移除的情况下返回对头,但是peek在对头为null的时候返回null,而element会抛出NoSuchElementException异常。poll和remove方法将移除并返回对头,但是poll在队列为空时返回null,而remove会抛出NoSuchElementException异常。

  • PriorityQueue:
    优先队列,该队列按照元素的优先级在插入的时候维护一个优先级的队列(元素需要实现Comparable)。同样的TreeSet也可以维护一个序列,但是区别在于TreeSet元素不可重复,而PriorityQueue元素可以重复。

Map:


Map在实际开发中使用非常广,它可以将两个对象关联起来。允许使用一个对象来查询,而List则是通过下标整数来查询。因此它也被称为关联数组,或者字典。

  • HashMap:
    HashMap采用是散列函数所以查询的效率是比较高的,如果我们需要一个有序的我们就可以考虑使用TreeMap。

**注意:**HashMap的键可以是null,而且键值不可以重复,如果重复了以后就会对第一个进行键值进行覆盖。

  • TreeMap:
    TreeMap采用红黑树的数据结构,对插入的键、值都维护一个序列,使得通过Iterator访问的时候能够按照顺序(元素需要实现Comparable,作为维护序列的依据)来访问。

Iterable+Iterator:


Iterable\\Iterator是一个迭代器,它能够让我们在不知道具体对象的情况下遍历它。实现该接口还能够使用foreach语法,如果通过反编译,我们就可以看到foreach语法其实在class文件中解析为for(Iterator I = obj.iterator; i.hasNext();)。

Comparable\\Comparator:


对象比较类,实现此两个接口能够比较两个对象的大小。在容器中要维护元素的序列,那么元素就需要实现这两个接口中的某一个(比如:HashSet、TreeSet、TreeMap等)。

以上是关于Java基础知识——容器浅析的主要内容,如果未能解决你的问题,请参考以下文章

JAVA基础——集合浅析

容器中Java 程序OOMKilled原因浅析

浅析栈与队列在java中的基本应用

面试必会必知:线程池架构浅析

浅析java设计模式----异构容器,可以存储任何对象类型为其他类提供该对象

Java中List集合的浅析