zoukankan      html  css  js  c++  java
  • Java集合框架关系图

    集合的特点:

    集合用来存储不同类型的对象(基本数据类型除外),存储长度可变。
    Java集合中实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或者方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时就会被收回的。

    集合框架图:

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

    再附上一个稍微简单些的

    1、Iteraor接口

    (迭代器接口)用于遍历集合中元素的接口,主要包含三种方法:

    1.  
      boolean hasNext()
    2.  
      E next()
    3.  
      void remove()
    4.  
       

    它的一个子接口ListIterator在它的基础上又添加了三种方法:

    1.  
      void add()
    2.  
      E previous()
    3.  
      boolean hasPrevious()
    4.  
       

    也就是说如果实现Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历过的元素不会再遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;
    而实现了ListIterator接口的集合,可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如List。

    Iterator和Iterable的区别:
    1). Iterator是迭代器接口,而Iterable是为了只要实现该接口就可以使用foreach进行迭代。

    2). Iterable中封装了Iterator接口,只要实现了Iterable接口的类,就可以使用Iterator迭代器了。

    3). 集合Collection、List、Set都是Iterable的实现类,所以他们及其他们的子类都可以使用foreach进行迭代。

    4). Iterator中核心的方法next()、hasnext()、remove()都是依赖当前位置,如果这些集合直接实现Iterator,则必须包括当前迭代位置的指针。当集合在方法间进行传递的时候,由于当前位置不可知,所以next()之后的值,也不可知。而实现Iterable则不然,每次调用都返回一个从头开始的迭代器,各个迭代器之间互不影响。

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

    Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行,一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”,如List和Set。
    所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection;有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
    (1)List:有序,可以存放重复的内容
    (2)Set:无序,不能存放重复的内容,所以的重复内容靠hashCode()和equals()两个方法区分
    (3)Queue:队列接口
    (4)SortedSet:可以对集合中的数据进行排序

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

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

    • List接口

    按照元素插入的顺序进行存放,元素可以重复。
    其定义的方法包括:

    1.  
      int size();
    2.  
      boolean isEmpty();
    3.  
      boolean contains(Object o);
    4.  
      Iterator<E> iterator();
    5.  
      Object[] toArray();
    6.  
      <T> T[] toArray(T[] a);
    7.  
      boolean add(E e);
    8.  
      boolean remove(Object o);
    9.  
      boolean containsAll(Collection<?> c);
    10.  
      boolean addAll(Collection<? extends E> c);
    11.  
      boolean addAll(int index, Collection<? extends E> c);
    12.  
      boolean removeAll(Collection<?> c);
    13.  
      void clear();
    14.  
      boolean equals(Object o);
    15.  
      int hashCode();
    16.  
      E get(int index);
    17.  
      E set(int index, E element);
    18.  
      void add(int index, E element);
    19.  
      E remove(int index);
    20.  
      int indexOf(Object o);
    21.  
      int lastIndexOf(Object o);
    22.  
      ListIterator<E> listIterator();
    23.  
      ListIterator<E> listIterator(int index);
    24.  
      List<E> subList(int fromIndex, int toIndex);

    实现List的子类的特点:
    ——ArrayList:线程不安全,查询速度快。底层都是基于数组来储存集合元素,封装了一个动态的Object[]数组,是一种顺序存储的线性表。
    ——Vector:线程安全,但速度慢,已被ArrayList替代。
    ——LinkedList:线程不安全,增删速度快,没有同步方法,是一个链式存储的线性变,本质上是一个双向链表。
    ——Stack: (已经不用,可由LinkedList代替)。

    • Set接口

    Set接口也是Collection的一种扩展,而与List不同的是,在Set中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个Set容器中。它的常用具体实现有HashSet和TreeSet类。
    HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了前面说过的哈希码的算法。
    TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用接口Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口。有时多个类具有相同的排序算法,那就不需要再分别重复定义相同的排序算法,只要实现Comparator接口即可。
    Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
    很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
    请注意:必须小心操作可变对象(MutableObject)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。

    1.  
      int size();
    2.  
      boolean isEmpty();
    3.  
      boolean contains(Object o);
    4.  
      Iterator<E> iterator();
    5.  
      Object[] toArray();
    6.  
      <T> T[] toArray(T[] a);
    7.  
      boolean add(E e);
    8.  
      boolean remove(Object o);
    9.  
      boolean containsAll(Collection<?> c);
    10.  
      boolean addAll(Collection<? extends E> c);
    11.  
      boolean retainAll(Collection<?> c);
    12.  
      boolean removeAll(Collection<?> c);
    13.  
      void clear();
    14.  
      boolean equals(Object o);
    15.  
      int hashCode();
    • SortedSet接口(实现了Set接口)

    其实这就是个Set接口的输出接口

    1.  
      //普通 返回排序有关联的比较器
    2.  
      public Comparator<? super E>
    3.  
      //普通 返回集合中的第一个元素
    4.  
      public E first()
    5.  
      //普通 返回从开始到指定元素的集合
    6.  
      public SortedSet<E> headSet(E toElement)
    7.  
      //普通 返回最后一个元素
    8.  
      public E last()
    9.  
      //普通 返回指定对象间的元素
    10.  
      public SortedSet<E> subSet(E fromElement,E toElement)
    11.  
      //普通 从指定元素到最后
    12.  
      public SortedSet<E> tailSet(E fromElement)

    实现Set接口子类的特点:
    ——HashSet:底层数据结构由HashMap的键来实现。不保证集合中元素的顺序,即不能保证迭代的顺序与插入的顺序一致。是线程不安全的。
    ——TreeSet:有序的存放,线程不安全,可以对Set集合中的元素进行排序,由红黑树来实现排序,TreeSet实际上也是SortedSet接口的子类,其在方法中实现了SortedSet的所有方法,并使用comparator()方法进行排序。
    ——LinkedHashSet:底层由链表实现,按照元素插入的顺序进行迭代,即迭代输出的顺序与插入的顺序保持一致

    3、Map接口

    Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。
    请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
    注意:由于Map中作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。

    实现Map接口的子类:
    ——Hashtable:Hashtable继承Dictionary<K,V>类,实现了Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。是同步的。
    ——HashMap:HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。
    但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。
    ——LinkedHashMap:是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现。Key和Value都允许空;Key重复会覆盖、Value允许重复;非线程安全;有序。
    ——TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

    4、Collections和Collection有什么区别?

    Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。
    它有两个常用的子接口:
    ——List:对元素都有定义索引。有序的。可以重复元素。
    ——Set:不可以重复元素。无序。

    Collections是集合框架中的一个工具类。该类中的方法都是静态的。提供的方法中有可以对list集合进行排序,二分查找等方法。通常常用的集合都是线程不安全的。因为要提高效率。如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。

    集合框架是工作中常用的一些类,也是常使用的功能,后续使用的最多的也是这些类~

  • 相关阅读:
    [java]struts2 模型驱动 2016-05-01 21:40 702人阅读 评论(19) 收藏
    [CS]C#操作word 2016-04-17 18:30 1506人阅读 评论(35) 收藏
    软件设计 2016-04-03 18:21 1012人阅读 评论(26) 收藏
    sqlite数据库文件导入到sqlserver 2016-03-26 21:55 1292人阅读 评论(1) 收藏
    C/S和B/S交互 2016-03-19 11:27 1275人阅读 评论(30) 收藏
    DESede/CBC/PKCS5Padding
    Gson应用:利用map和list来拼装Json消息
    使用Log4j2,打包后提示ERROR StatusLogger Log4j2 could not find a logging implementation.
    Jinkins定时任务设置
    给Fitnesse添加调用多参数fixture的调用方法
  • 原文地址:https://www.cnblogs.com/huyang1988/p/14484831.html
Copyright © 2011-2022 走看看