首页 > 学院 > 开发设计 > 正文

介绍Collection框架的结构;Collection 和 Collections的区别

2019-11-08 02:26:13
字体:
来源:转载
供稿:网友

集合框架:

Collection:List列表,Set集

Map:Hashtable,HashMap,TreeMap

 

Collection  是单列集合

List   元素是有序的、可重复

有序的 collection,可以对列表中每个元素的插入位置进行精确地控制。

可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。 

可存放重复元素,元素存取是有序的。

List接口中常用类

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

底层数据结构是数组结构

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

            底层数据结构是数组结构

LinkedList:线程不安全。增删速度快。

             底层数据结构是列表结构

 

Set(集) 元素无序的、不可重复。

取出元素的方法只有迭代器。不可以存放重复元素,元素存取是无序的。

Set接口中常用的类

HashSet:线程不安全,存取速度快。

        它是如何保证元素唯一性的呢?依赖的是元素的hashCode方法和euqals方法。

TreeSet:线程不安全,可以对Set集合中的元素进行排序。

 它的排序是如何进行的呢?通过compareTo或者compare方法中的来保证元素的唯一性。元素是以二叉树的形式存放的。

 

 

Map  是一个双列集合

|--Hashtable:线程安全,速度快。底层是哈希表数据结构。是同步的。

不允许null作为键,null作为值。

      |--PRoperties:用于配置文件的定义和操作,使用频率非常高,同时键和值都是字符串。

是集合中可以和IO技术相结合的对象。(到了IO在学习它的特有和io相关的功能。)

|--HashMap:线程不安全,速度慢。底层也是哈希表数据结构。是不同步的。

允许null作为键,null作为值。替代了Hashtable.

   |--LinkedHashMap: 可以保证HashMap集合有序。存入的顺序和取出的顺序一致。

|--TreeMap:可以用来对Map集合中的键进行排序.

 

 

Collection 和 Collections的区别

 

Collection是集合类的上级接口,子接口主要有Set 和List、Map。 

Collections是针对集合类的一个帮助类,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

java.util包中包含了一些在Java 2中新增加的最令人兴奋的增强功能:类集。一个类集(collection)是一组对象。类集的增加使得许多java.util中的成员在结构和体系结构上发生根本的改变。它也扩展了包可以被应用的任务范围。Java的类集(Collection)框架使你的程序处理对象组的方法标准化。在Java 2出现之前,Java提供了一些专门的类如Dictionary,Vector,Stack和Properties去存储和操作对象组。尽管这些类非常有用,它们却缺少一个集中,统一的主题。因此例如说使用Vector的方法就会与使用Properties的方法不同。以前的专门的方法也没有被设计成易于扩展和能适应新的环境的形式。而类集解决了这些(以及其他的一些)问题        Java类集框架的优势:        1) 这种框架是高性能的。对基本类集(动态数组,链接表,树和散列表)的实现是高效率的。一般很少需要人工去对这些“数据引擎”编写代码(如果有的话)。        2) 框架允许不同类型的类集以相同的方式和高度互操作方式工作。        3) 类集是容易扩展和/或修改的。为了实现这一目标,类集框架被设计成包含一组标准的接口。对这些接口,提供了几个标准的实现工具(例如LinkedList,HashSet和TreeSet),通常就是这样使用的。如果你愿意的话,也可以实现你自己的类集。为了方便起见,创建用于各种特殊目的的实现工具。一部分工具可以使你自己的类集实现更加容易。        4) 增加了允许将标准数组融合到类集框架中的机制。        类集的整体框架如下:

        Collection接口是构造类集框架的基础。它声明所有类集都将拥有的核心方法。因为所有类集实现Collection,所以熟悉它的方法对于清楚地理解框架是必要的。

        boolean add(E e):向集合中增加元素,如果该类型集合允许有重复元素(如:ArrayList、LinkedList等)或者不允许有重复元素但新添加的元素不在集合中则返回true,如果该类型集合不允许有重复元素并且新添加的元素已经在集合中则返回false。

        boolean addAll(Collection<? extendsE> c):将一个类集c中的所有元素添加到另一个类集(本类集)。

        void clear():清除本类集中所有元素,调用完该方法后本类集将为空。

        boolean contains(Object o):如果本类集包含元素e,并且满足(o==null ?e==null : o.equals(e))则返回true,否则返回false。

        boolean containsAll(Collection<?> c):如果本类集包含指定类集c中的所有元素则返回true,否则返回false。

        boolean equals(Object o):如果本类集的equals方法是我们自己重写的,则具体两个类集怎样才算equal(是引用相等还是值相等且顺序相同),我们自己决定。如果类集的equals方法不是我们重写的,则当两个类集类型为List(包括ArrayList和LinkedList,元素可以重复)时,必须两个类集的元素个数相等,元素顺序相同,且相同位置的元素对应相等才返回true,否则返回false;当两个类集类型为Set(包括HashSet和TreeSet,元素不能重复)时,只须两个类集的元素个数相等,并且一个类集中的任一个元素在另一个类集中都能找到相同的元素(不必顺序相同,因为Set是无序的),则返回true,否则返回false。

        int hashCode():返回本类集的hash code值,具体算法依赖于类集中元素的值和类型,在后面的讨论中会讲到。

        boolean isEmpty():若本类集没有元素则返回true,否则返回false。

        Iterator<E> iterator():返回本类集中所有元素的迭代函数,至于从该函数中取出的元素的顺序依赖于本类集的类型,若为List则按List的顺序取出,若为Set则无序。

        booleanremove(Object o):若本类集中有值与o的值相等的元素,则删除该元素,并返回true,若没有则返回false。当类集类型为List时,有可能有多个元素与o的值相等,此时,只会删除第一个值为o的元素,其他元素位置不变。

        boolean removeAll(Collection<?>c):删除本类集中与指定类集c中的元素相等的所有元素,不管有多少个元素,只要在c中出现了,调用后d中就不会出现。若调用后本类集的元素有改变(即有元素被删除),则返回true,否则返回false。

        boolean retainAll(Collection<?>c):保持本类集中在指定类集中出现过的所有元素,即删除本类集中不包含在指定类集c中的所有元素。若调用后本类集的元素有改变(即有元素被删除),则返回true,否则返回false。

        int size():返回本类集中元素的个数,但大小不能超过0x7fffffff,若超过则返回0x7fffffff。

        Object[] toArray():返回一个包含了本类集中所有元素的数组,数组类型为:Object[],因为底层是通过iterator()方法来传值的,所以数组中元素的顺序同样依赖于本类集的类型,若为List则按List的顺序放入数组,若为Set则无序。

        <T>T[] toArray(T[] a):以泛型的形式来传递返回数组的类型,其他与Object[]toArray()方法类似。

直接继承Collection接口的有List<E>、Queue<E>、BeanContext和Set<E>四个接口,其中我们用的最多的是List<E>和Set<E>这两个接口,后面的博文将会详细分析;另外两个接口用的相对较少,一般要实现这两个接口的功能时都是开发者自己重新实现,在此不作详细分析。

        说明:部分内容来自网络!后面将会对常用的接口和类作详细分析,希望跟各位网友共同进步,不对的地方欢迎大家指正!

 

        测试代码如下:

[java] view plaincopypublic class CollectionTest  {      public static void main(String[] args)      {          Collection<String> c = new ArrayList<String>();          Collection<String> d = new ArrayList<String>();                    c.add("1");          c.add("2");          c.add("1");          c.add("3");          c.add("1");          c.add("3");          c.add("3");          c.add("2");          c.add("3");            //      c.remove("3");                    d.add("2");          d.add("1");          d.add("4");                    System.out.println(c.equals(d));          System.out.println(c);          System.out.println(d);          System.out.println(c.hashCode());          System.out.println(d.hashCode());  //      System.out.println(c.removeAll(d));          System.out.println(c);          System.out.println("----------------------");                    Object[] o = c.toArray();          String s = null;          for(int i = 0; i < o.length; i++)          {              s = (String)o[i];              System.out.println(s);          }      }  }  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表