首页 > 技术文章 > Java 集合:(一)集合框架概述

niujifei 2021-04-14 13:19 原文

一、集合框架概述

  1、为什么要使用集合?

    一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。
    另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。
    不管是哪一种数据结构,其实本质上都是容器来着,就是用来装对象的。因此,我们就要搞清楚两点:(1)如何存储(2)存储特点

  2、数组

    (1)数组结构

      •  逻辑结构:线性的
      •     物理结构:顺序的存储结构
      •     申请内存:一次申请一大段连续的空间,一旦申请到了,内存就固定了
      •     存储特点:所有数据存储在这个连续的空间中,数组中的每一个元素都是一个具体的数据(或对象),所有数据都紧密排布,不能有间隔。

    (2)如图所示:

      

      

    (3)常用操作

        a、查询:每一个元素都有一个数值下标,可以通过下标瞬间定位到某个元素

       b、增加:

        •  先使用 total 变量辅助记录实际存储元素个数
        •    从尾部增加:数组名[total++]=新元素
        •    从其他位置插入:先把index位置开始所有元素后移,然后数组名[index]=新元素

      c、删除:先把index后面的元素前移,然后数组名[total--]=null

      d、修改: 直接数组名[index]=新元素

    (4)优缺点:

      优点:按索引查询效率高

      缺点:添加/删除效率低,因为都涉及到移动元素;无法直接获取有效元素的个数,需要total来辅助

      如图所示:

      

      

  3、数组和集合对比

    数组在内存存储方面的特点:
      ① 数组初始化以后,长度就确定了。
      ② 数组声明的类型,就决定了进行元素初始化时的类型
    数组在存储数据方面的弊端:
      ① 数组初始化以后,长度就不可变了,不便于扩展
      ② 数组中提供的属性和方法少,不便于进行添加、删除、插入等操作,且效率不高。
        同时无法直接获取存储元素的个数
      ③ 数组存储的数据是有序的、可以重复的。---->存储数据的特点单一
      ④ 数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,同时效率不高
      ⑤  数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象,而且对象的类型可以不一致。
    Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。
 

二、集合的使用场景

  1、使用场景

   

三、集合框架

  1、集合框架

    为了可以满足用户数据更多种的逻辑关系,而设计的一系列的不同于数组的可变的聚合的抽象数据类型。这些接口和类在java.util包中,因为类型很丰富,因此我们通常称为集合框架集。

  2、分类

    Java 集合可分为 Collection 和 Map 两种体系
      Collection接口:单列数据,定义了存取一组对象的方法的集合
        List:元素有序、可重复的集合
        Set:元素无序、不可重复的集合
      Map接口:双列数据,保存具有映射关系“key-value对”的集合
    Collection 接口继承树:
      

 

      

 

    Map 接口继承树:
    

    

 

 

  3、集合系列框架

    

 

四、结构说明

   1、Collection接口:层次结构中的根接口。Collection 表示一组对象,这些对象也称为 Collection 的元素。一些 Collection 允许有重复的元素,而另一些则不允许。一些 Collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List、Queue)实现。此接口通常用来传递 Collection,并在需要最大普遍性的地方操作这些 Collection。

    (1)List:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

   (2)Queue:队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。

   (3)Set:一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

       SortedSet 进一步提供关于元素的总体排序 的 Set。这些元素使用其自然顺序进行排序,或者根据通常在创建有序 set 时提供的 Comparator进行排序。该 set 的迭代器将按元素升序遍历 set。提供了一些附加的操作来利用这种排序。

  2、Map接口:将键映射到值(key,value)的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类。

     SortedMap接口:进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有序映射时提供的 Comparator 进行排序。

五、

 

推荐阅读