Java集合容器的深度理解

Java容器里有很多写好的容器API,这使我们很方便的可以存储、操作我们的数据。

下面是我写的容器的特点,一些容器的不同之处,从底层源码解析一下容器实现原理

 

一、常用的容器目录

  Java集合容器的深度理解

 

 

 

 上图可以看出,java容器分为两种:CollectionMap

 Collection:主要是单个元素的集合,由List、Queue、Set三个接口区分不同的集合特征,然后由下面的具体的类来实现对应功能,然后Collection还继承了Iterable(为集合提供了for-each循环的支持,是一个可以为不同的集合类提供遍历的最佳方式)迭代器

Java集合容器的深度理解

 

 Map:有一组键值对的存储形式来保存,可以用键对象来查找值.

Java集合容器的深度理解

 Map里的K-key(密钥类型),v-value(映射值的类型)

  简介:

    1.Map是java集合框架的根接口,另一个是Collection的接口

    2.一个Map中,不能包含重复的Key,一个Key只能映射到一个value

Map本身并不是一种集合,但是Map可以提供三种集合视图:

    1.Key——value映射Set视图

    2.Key的Set视图

    3.value的Collection视图

注意!!: 如果一个可变(Mutable)对象作为Map的key,需要特别注意,如果这个对象的修改影响到了equals比较,那Map的行为是不明确的。针对此种情况有一个很好的示例,Map不允许将自身作为key,因                           为这种情况下,equals()和hashcode()不能被很好地定义。

一般用于的Map应该提供两个构造函数:

    1.无参构造函数,创建一个空的Map

    2.有一个形参为Map的构造函数,既复制一个Map

 

    Map的实现类对所包含的元素会有不同的限制,HashTable的键和值都不允许为null,HashMap的键和值都允许为null

 二、List

Java集合容器的深度理解

 

 

  从此图看出List继承的是Collection集合接口,List最大特点就是所有的元素是可重复的,List接口在Collection的基础上增加了很多的方法.List主要分为ArrayListLinkedList,前者的底层是使用数组实现的

List,后者是使用链表实现的List,还有一个Vector,它是一个被弃用的类,因为它是线程同步的,而我们平常使用的时候都是非同步的,使用同步的坏处就是会在一个记录上加锁,防止多个程序访问同一条数

据导致数据不同步.这样会导致访问速度变慢

 Stack是满足"后进先出"规则的容器,注意LinkedList可以实现所有栈的功能

 

   1).ArrayList

   1.ArrayList是一个可以动态增长的数组

   2.我们都知道Java中的数组一旦指定了长度就不可变了,如果我们在业务中需要使用动态的数组,就可以使用ArrayList(默认长度是10,如果插入的数据超过了10,ArrayList会不断的自我增长)

   3.ArrayList由于底层是使用数组实现的,所以随机访问速度快,插入删除慢

   Java集合容器的深度理解

 

 

   我们可以看到在ArrayList里的底层有EMPTY_ELEMENTDATA 这一段源码,它的作用是为了优化创建ArrayList空实例时产生不必要的空数组,使得所有ArrayList空实例都指向同一个空数组。                DEFAULTCAPACITY_EMPTY_ELEMENTDATA是为了确保无参构成函数创建的实例在添加第一个元素时,最小的容量是默认大小10。

  2.)LinkedList

  LinkedList是使用链表实现的容器。

  在列表中插入和删除速度快,但是查找需要遍历整个链表,速度较慢

  使用LinkedList可以实现很多队列、栈的数据结构,并且有很多方法很类似,但是有细小的差别

  • getFirst和element都返回列表的头,但是不删除它,如果列表为空,抛出异常
  • peek实现的功能一样,但是列表为空时返回null
  • removeFirst和remove都是删除并返回列表的头,如果列表为空抛出异常
  • pool实现的功能一样,但是列表为空时返回null

  3.)Queue

  队列是一个满足“先进先出”的数据结构。
  LinkedList提供了方法支持队列操作,并且实现了Queue接口,所以LinkedList是队列的一种实现,可以通过LinkedList向上转型为Queue

  • offer:讲一个元素插入对尾
  • peek:不移除的情况下将元素插入队尾,队列为空返回null
  • element:不移除的情况下将元素插入队尾,队列为空报错
  • poll:移除并返回队头,队列为空返回null
  • remove:不移除的情况下将元素插入队尾,队列为空报错

  4.)Set

  • Set不允许出现重复元素-----------无重复
  • Set不保证集合中元素的顺序---------无序
  • Set允许包含值为null的元素,但最多只能有一个null元素。
  • Set支持泛型(类型的参数化),我们应尽可能使用它。将Generics与List一起使用将在运行时避免ClassCastException。
  • 先去看Map,Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,LinkedHashSet是通过LinkedHashMap来实现的)。

   (LinkedHashSet

  集合框架提供LinkedHashSet类作为Set接口的另一个实现类

  HashSet不保证顺序元素.LinkedHashSet在插入元素时保持元素顺序

                                                                       (文章有待补充,哪里没有解释到位,请指出)

上一篇:Linked List类


下一篇:算法小结-1