java集合继承关系图

  面向对象语言对事物的体现都是以对象的形式,因此为了方便对多个对象的操做,就对对象进行存储,集合就是存储对象最经常使用的一种方式。数组

  数组虽然也能够存储对象,但长度是固定的;集合长度是可变的,数组中能够存储基本数据类型,集合只能存储对象。安全

  集合类的特色:集合只用于存储对象,集合长度是可变的,集合能够存储不一样类型的对象。数据结构

          

           

  上述类图中,实线边框的是实现类,好比ArrayList,LinkedList,HashMap等,折线边框的是抽象类,好比AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,好比Collection,Iterator,List等。多线程

1Iterator接口框架

  Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说若是是先Iterator接口,那么在遍历集合中元素的时候,只能日后遍历,被遍历后的元素不会在遍历到,一般无序集合实现的都是这个接口,好比HashSet,HashMap;而那些元素有序的集合,实现的通常都是LinkedIterator接口,实现这个接口的集合能够双向遍历,既能够经过next()访问下一个元素,又能够经过previous()访问前一个元素,好比ArrayList。工具

  抽象类的使用。若是要本身实现一个集合类,去实现那些抽象的接口会很是麻烦,工做量很大。这个时候就可使用抽象类,这些抽象类中给咱们提供了许多现成的实现,咱们只须要根据本身的需求重写一些方法或者添加一些方法就能够实现本身须要的集合类,工做流昂大大下降。性能

二、Collection (集合的最大接口)继承关系spa

  ——List 能够存放重复的内容线程

  ——Set  不能存放重复的内容,因此的重复内容靠hashCode()和equals()两个方法区分3d

  ——Queue  队列接口

  ——SortedSet  能够对集合中的数据进行排序

  Collection定义了集合框架的共性功能。

    

  add方法的参数类型是Object。以便于接收任意类型对象。

  集合中存储的都是对象的引用(地址)。

三、List的经常使用子类
  特有方法。凡是能够操做角标的方法都是该体系特有的方法。

       

  ——ArrayList   线程不安全,查询速度快

  ——Vector  线程安全,但速度慢,已被ArrayList替代

  ——LinkedList  链表结果,增删速度快

四、Set接口

  Set:元素是无序(存入和取出的顺序不必定一致),元素不能够重复。
  ——HashSet:底层数据结构是哈希表。是线程不安全的。不一样步。
    HashSet是如何保证元素惟一性的呢?
    是经过元素的两个方法,hashCode和equals来完成。
    若是元素的HashCode值相同,才会判断equals是否为true。
    若是元素的hashcode值不一样,不会调用equals。

    注意,对于判断元素是否存在,以及删除等操做,依赖的方法是元素的hashcode和equals方法。

  ——TreeSet:

    有序的存放:TreeSet  线程不安全,能够对Set集合中的元素进行排序

    经过compareTo或者compare方法来保证元素的惟一性,元素以二叉树的形式存放。

五、Object类

  在实际开发中常常会碰到区分同一对象的问题,一个完整的类最好覆写Object类的hashCode()、equals()、toString()三个方法。

六、集合的输出

  ——4种常见的输出方式

  ——Iterator: 迭代输出,使用最多的输出方式

  ——ListIterator: Iterator的子接口,专门用于输出List中的内容

  ——Enumeration

  ——foreach

  在迭代时,不能够经过集合对象的方法操做集合中的元素,由于会发生ConcurrentModificationException异常。因此,在迭代器时,只能用迭代器的放过操做元素,但是Iterator方法是有限的,只能对元素进行判断,取出,删除的操做,若是想要其余的操做如添加,修改等,就须要使用其子接口,ListIterator。该接口只能经过List集合的listIterator方法获取。

七、Map接口

  Correction、Set、List接口都属于单值的操做,而Map中的每一个元素都使用key——>value的形式存储在集合中。

  Map集合:该集合存储键值对。一对一对往里存。并且要保证键的惟一性。

      

八、Map接口的经常使用子类

  Map
  ——HashMap:底层是哈希表数据结构,容许使用 null 值和 null 键,该集合是不一样步的。将hashtable替代,jdk1.2.效率高。
  ——TreeMap:底层是二叉树数据结构。线程不一样步。能够用于给map集合中的键进行排序。

九、集合工具类

  Collections:集合框架的工具类。里面定义的都是静态方法。

  Collections和Collection有什么区别?
    Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。
      它有两个经常使用的子接口,
      ——List:对元素都有定义索引。有序的。能够重复元素。
      ——Set:不能够重复元素。无序。

    Collections是集合框架中的一个工具类。该类中的方法都是静态的。
      提供的方法中有能够对list集合进行排序,二分查找等方法。
      一般经常使用的集合都是线程不安全的。由于要提升效率。
      若是多线程操做这些集合时,能够经过该工具类中的同步方法,将线程不安全的集合,转换成安全的。

10.比较

      是否有序 是否容许元素重复
Collection
List
Set AbstractSet
  HashSet
  TreeSet 是(用二叉排序树)
Map AbstractMap 使用key-value来映射和存储数据,key必须惟一,value能够重复
  HashMap
  TreeMap 是(用二叉排序树)

 

11.总结:

  List:add/remove/get/set。

    1,ArrayList:其实就是数组,容量一大,频繁增删就是噩梦,适合随机查找;

    2,LinkedList:增长了push/[pop|remove|pull],其实都是removeFirst;

    3,Vector:历史遗留产物,同步版的ArrayList,代码和ArrayList太像;

    4,Stack:继承自Vector。Java里其实没有纯粹的Stack,能够本身实现,用组合的方式,封装一下LinkedList便可;

    5,Queue:原本是单独的一类,不过在SUN的JDK里就是用LinkedList来提供这个功能的,主要方法是offer/pull/peek,所以归到这里呢。

  Set:add/remove。能够用迭代器或者转换成list。

    1,HashSet:内部采用HashMap实现的;

    2,LinkedHashSet:采用LinkedHashMap实现;

    3,TreeSet:TreeMap。

  Map:put/get/remove。

    1,HashMap/HashTable:散列表,和ArrayList同样采用数组实现,超过初始容量会对性能有损耗;

    2,LinkedHashMap:继承自HashMap,但经过重写嵌套类HashMap.Entry实现了链表结构,一样有容量的问题;

    3,Properties:是继承的HashTable。

    顺便说一下Arrays.asList,这个方法的实现依赖一个嵌套类,这个嵌套类也叫ArrayList!