zoukankan      html  css  js  c++  java
  • Java中的集合类型体系(一)

    Java中的集合类型体系(一)

    提问:为什么需要集合?

           通常情况下,程序需要根据运行时才知道创建了多少对象。若非程序运行时,而在开发阶段,我们并不知道创建了多少对象,甚至不知道对象的准确类型,为了满足常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,但是用什么容器要存放这些对象呢?首先可能会想到用数组存放,但是数组只能存放同一类型的数据,且数组长度是固定的。所以用什么来存放更合适呢?就这样,集合便应运而生了。

    一、集合的概念

     Java中的集合类统一封装在java.util包中,是一个用来存放对象的容器。它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。集合类是可以往里面保存多个对象的类,存放的是对象,不同的集合类有不同的功能和特点,适合不同的场合,用以解决一些实际问题。

    注意点:

    1、集合只能存放对象。如果存入基本数据类型,如将int型数据10存入集合中,集合会将int自动转换成其封装类Integer存入,Java中每一种基本数据类型都有对应的引用类型;

    2、集合存放的对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。

    3、集合可以存放不同类型,不限数量的数据类型。

    二、Java中集合体系框架

    图1 集合框架简图

    从上图可以看出:上述的所有集合类,除了Map集合系列,即左边的集合都实现了Iterator接口。

    Iterator接口用来遍历集合当中的元素,有hashNext()、next()、remove()三个处理集合的方法;

    ListIterator接口继承Iterator接口,在它的基础上又添加了三种处理集合的方法,分别为:add(),previous(),hasPrevious()等。

    集合的两大的部分:

    1、集合主要分为Collection接口Map接口

    2、Collection接口分别被Queue、List和Set三个接口继承;

    3、List接口被AbstractList实现,分为三个子类:LinkedList、ArrayList、Vector;

    4、Set接口被AbstractSet实现,分为两个子类:HashSet、TreeSet;

    5、Map接口被AbstractMap实现,分为两个子类:HashMap、TreeMap;

    6、Map接口被HashTable实现。

    常用集合的分类

    图2 常用集合的分类

    三、集合和数组的区别

    图3 集合与数组区别

    四、Iterator迭代器

    (一)、Iterator接口是Java中集合的顶层接口。(不包含Map系列接口,Map接口是Map系列集合的顶层接口)。

    三个方法:

    1、Object next():返回迭代器刚越过元素的引用,返回值是Object,需要根据需要强制转换;

    2、boolean hashNext():判断迭代器中是否还有供访问的元素;

    3、void remove():删除迭代器中越过的元素。

    除了Map集合系列,程序都可以通过Iterator迭代器来遍历集合中的元素。

    (二)、Iterator与Iterable

    Iterable接口封装在java.util包中,

    1 public interface Iterable<T>{
    2     /**
    3     * Returns an iterator over elements of type {@code T}
    4     *
    5     * @return an Iterator
    6     */
    7     Iterator<T> iterator();
    8     ...
    9 }

     从上面代码可以看出,Iterable接口封装了Iterator接口,所以只要子类实现了Iterable接口,就可以使用Iterator迭代器的功能了。

    (三)、ListIterator接口

    由于Iterator值提供了next()、hashNext()、remove()功能,如果我们想在使用迭代器遍历的同时添加元素,该怎么办呢?

    这里提供两种方式:

    1、自定义接口或者实现类,实现Iterator接口,在自定义实现类或接口中添加相应的功能;

    2、使用Iterator的子接口ListIterator

    具体运用哪种方式,具体依据需求而定,这里主要说明一下第二种方式。

    ListIterator接口继承自Iterator接口,在其基础上扩展了一些常用的方法,如下图:

    图4 ListIterator中的方法

    五、Collection接口介绍

    COllection接口是List和Set集合的顶层接口,封装了集合操作的基本功能。

    Collection接口分别有List子接口和Set子接口:

      1、List接口:元素按进入先后有序保存,可重复,元素有序 ;

      2、Set接口:仅接收一次,不可重复,元素无序 ;

    Collection定义的方法:

    图5 Collection接口定义的方法

    六、工具类Collections、Arrays及对数组的操作方法

    (一)、Collections:封装在java.utils包中,集合框架中的一个工具类。该类中的方法都是静态的。

    Collections有三个静态字段:EMPTY_LISTEMPTY_MAPEMPTY_SET;这三个字段分别返回一个空的List,Map和Set并且是不可修改的,当我们试图修改这三个返回的集合容器时,会抛出UnsupportedOperationException异常;之所以不能修改这三个返回的集合容器,原因是被返回的这三个容器都是final所修饰的。

        1、常用的方法:

      

    图6 Collections常用方法

    (二)、Arrays:封装在java.utils包中,用于操作数组的工具类。里面都是静态方法。

    该类包含用于操作数组的各种方法(如排序和搜索)。 该类还包含一个静态工厂,可以将数组视为列表。

    1、常用的方法:

    图7 Arrays常用方法

     

    (三)、集合对数组的操作方法

    1、将数组变成集合的好处:可以使用集合的方法和思想来操作数组中的元素。

    2、将数组转换成集合后,只能使用遍历,而不能使用集合中增删改方法,因为数组的长度是固定的,如果你增删。那么会产生UnsupportedOperationException报错。

    3、数组转换为集合:一般用Arrays.asList(T ... a)方法,将数组变成List集合。

    4、集合转换为数组:可以使用toArray()toArray(T[] a)将集合转换为数组。

    toArray():返回一个包含此集合中所有元素的数组。

    toArray(T[] a):返回一个包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。

  • 相关阅读:
    新手第一次联系oracle的碰到的触发器不能创建的问题
    dubbo注册中心占位符无法解析问题(二)
    dubbo注册中心占位符无法解析问题(一)
    .
    Ubuntu16 安装后配置
    TiDB-----使用 TiUP cluster 在单机上模拟生产环境部署步骤
    TiDB 单机安装(在 Linux OS 上部署本地测试环境)
    WPF查找子控件和父控件方法
    Java基础相关
    C++ namespace浅析
  • 原文地址:https://www.cnblogs.com/lingq/p/12723591.html
Copyright © 2011-2022 走看看