zoukankan      html  css  js  c++  java
  • Java中的集合框架

    概念与作用

    集合概念

    现实生活中:很多事物凑在一起

    数学中的集合:具有共同属性的事物的总体

    java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象

     在编程时,常常需要集中存放多个数据,当然我们可以使用数组来保存多个对象。但数组长度不可变化,一旦初始化数组时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数组就有点无能为力了;而且数组无法保存具有映射关系的数据,如成绩表:语文-79,数学-80,这种数据看上去像两个数组,但这个两个数组元素之间有一定的关联关系。

            为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),java提供集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有集合类都位于java.util包下。

            集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上也是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。     

    集合的作用

    集合与数组对比

    集合框架的体系结构

    Java的集合类主要由两个接口派生而出:Collection和Map,

    Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。

    图7.1是Collection接口、子接口及其实现类的继承树。

      图7.1中的粗线圈出的Set和List接口是Collection接口派生出的两个子接口,它们分别代表了无序集合和有序集合,阴影部分HashSet和ArrayList是两个主要的实现类。

     图7.2是Map体系的继承数,所有的Map实现类用于保存具有映射关系的数据(也就是前面介绍的关系数组)

       图7.2中显示了Map接口的众多实现类,这些实现类在功能、用法上存在一定的差异,但它们都有一个功能特征:Map保存的每项数据都是Key-value对,也就是有key和value两个值组成。就像前面介绍的成绩单:语文-79,数学-80,每项成绩都由2个值组成。Map里的key是不可重复的,key用于标识集合里每项数据,如果需要查阅Map中数据时,总是根据Map的key来获取。

     根据图7.1和图7.2中粗线标识的3个接口,我们可以把java的所有集合分成三大类:其中Set集合类似于一个罐子,把一个对象添加到Set集合时,Set集合无法记住这个元素的顺序,所以Set里的元素不能重复(否则系统无法准确识别这个元素);List集合非常像一个数组,它可以记住每次添加元素的顺序,只是List的长度是可变的。Map集合也像一个罐子,只是它里面的每项数据都由两个值组成。

      如果访问List集合中的元素,可以直接根据元素的索引来访问;如果需要访问Map集合中的元素,可以根据每项元素的key来访问其value;如果希望访问Set集合中的元素,则只能根据元素本身来访问(这也是Set集合里元素不允许重复的原因)。

     对于List、Set和Map三种集合,最常用的实现类在图7.1、7.2中以灰色区域覆盖,分别是HashSet、ArrayList和HashMap三个实现类。

    Collection接口和List接口简介

    List接口是一个有序集合,其元素以线性方法存储,集合中允许存放重复的元素。

    List接口及其实现类——ArrayList

    ArrayList 类是数组列表类,实现了可变长度的数组,允许对集合中的元素进行快速的访问,但向ArrayList 集合中插入或删除速度较慢。。(需要移动元素)

    ArrayList 集合允许所有的元素,包括null。

    每一个ArrayList 实例都有一个默认的容量,即存储元素的个数,这个容量可以随着元素的增加而自动变大。

    链表类:LinkedList类 

    LinkedList 是链表类,采用链表结构保存元素。链表结构的优点是便于向集合中插入和删除元素。

    因为在插入或删除元素时,不需要移动任何元素。

    List的增删改查的方法

    实现功能

    创建Course类

    真正工程中应将所有的属性私有化,通过get和set方法去访问属性

    创建学生类

    学生能选课,就有很多课程信息,把他的课程信息存放在set类型的属性courses里

    因为Set是一个接口,所以不能直接实例化,通过HashSet这个实现类来进行实例化。

    创建一个备选课程类ListTest类

    创建List类型的属性courseToselect(用于存放备选课程的List)

    添加ListTest构造方法,并初始化courseToselect属性,因为List是一个接口,所以在构造方法中不能直接实例化,而通过它的实现类ArrayList来实例化。

    对象存入集合当中的时候都会变成Object类型,取出时需要进行类型转换
    如果添加到List中的长度大于他目前的长度,则系统会出现异常,即数组下表越界异常。
    List是接口,所以在构造方法中不能直接实例化,而通过ArrayList实例化。

    用ArrayList的addall方法时,需要将添加的数据转换为列表类型,用asList方法。Arrays.asList(a) 将a由数据类型转变为列表类型list。
    用List的add(Object e)和add(int index,Object e)可以向List中添加单个元素,用addall(Collextion c)和addall(int index,Collextion c)可以添加集合(多个元素)。若在index位置有元素,则此元素及后面的元素向下移动。

    用List的add(Object e)和add(int index,Object e)可以想List中添加单个元素,用addall(Collextion c)和addall(int index,Collextion c)可以添加集合(多个元素),

    通过get()方法,可以把List中相应的索引位置上的元素给取出来。那么如果想要取得List中每一个元素的值,需要用一个for循环像遍历数组一样遍历List。

    创建一个testGet方法,为依次遍历List中的元素,首先我们需要取得List的长度,通过调用List的Size()方法来实现。

    1.用for循环配合get()方法遍历集合

    1. 迭代器:获取集合迭代器lt--while(lt.hasNext())循环遍历集合--将lt.Next()强转成集合元素类型并用其接收。注意:迭代器只遍历不存储,必须依赖集合存在。

      Iterator本身也是一个接口,Iterator接口。有一个hasNext方法(参数布尔类型)

    foreach循环遍历:for(object obj:集合名)

    修改List中的元素

    List中有个set方法

    set(int index, E element)方法,修改列表中的元素
    参数:index - 要替换的元素的索引,element - 要在指定位置存储的元素

    返回:以前在指定位置的元素

    删除List中的元素

    remove(Object e)

    remove(int index)

    removeAll()

    泛型

    创建一个TestGeneric类(测试泛型)

    添加一个带有泛型的List类型的属性。在构造器中初始化courses属性

    测试循环遍历,用for(Course cr: courses)

    是把元素作为Course类型取出来,而不是作为Object类型取出来

    泛型集合不仅可以存入泛型类型的对象实例,还可以添加泛型的子类型的对象实例

    新建一个继承Course类的ChildCourse类。Course类如果只有含参构造器的话,编译器就不会自动添加隐式的无参构造器。子类中必须调用父类的隐式构造器ChildCourse类就会报错。需要手动的在父类中加一个无参构造器。

    在TestGeneric类中添加一个testChild方法

    泛型集合可以添加泛型的子类型的对象实例

    泛型集合中,不能添加泛型规定的类型及其子类型以外的对象,否则会报错。

    泛型应该注意的地方:
    1.泛型集合中的限定类型不能使用基本数据类型。必须是引用数据类型。
    2.如果非要使用基本数据类型时,必须使用它们的包装类 如:int->Integer

    Set

    Set接口及其实现类--HashSet

    list有序的,Set无序的 ,所以Set没有set()这个给定指定索引位置去修改元素的方法。

    案例功能

    创建一个SetTest类

    将Student类中Set类型的属性修改一下,添加一个Course类型的泛型。

    在SetTest类添加一个带有泛型Course的List类型的属性courseToSelect,创建SetTest的构造器,初始化courseToSelect属性

    因为课程的ID是一个字符串,是一个对象,用equals方法跟输入的字符串比较是否相等。

    set特点:无序,不可重复

    无序:循环遍历set时只能用foreach或者迭代器iterator方法,不能用get()方法,因为set是无序的,没有index。遍历输出也是乱序的。

    不可重复:如果添加几个相同的元素,则只会保留一个!

    散列级:HashSet 类 

    HashSet类是按照哈希算法来存取集合中的元素的,使用哈希算法可以提高存取的效率。当向HashSet 集合中添加元素时,就会调用该元素的hashCode() 方法,获取哈希码值,然后根据这个哈希码值计算出该元素的存放位置。

    HashSet 集合具有以下特点:

    • 不能保证元素的排列顺序,集合中元素的顺序随时有可能发生改变。
    • 集合中最多允许存在一个null元素
    • HashSet 集合不是线程同步的。

    Map和HashMap简介

    Collection存储的都是单个元素。而Map提供了一种映射的关系(key到value的映射)。

    因此,Map集合中保存这两组值,一组用于保存key,另一组用于保存value,key和value都可以是任何引用数据类型。Map集合中的key不允许重复,每一个key只能映射一个value。

    Map接口

    通过put()方法添加一个键值对的映射

    put

    V put(K key, V value)

    将指定的值与此映射中的指定键关联(可选操作)。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值(当且仅当 m.containsKey(k) 返回 true 时,才能说映射 m 包含键 k 的映射关系)。

    参数:

    key - 与指定值关联的键

    value - 与指定键关联的值

    返回:

    以前与 key 关联的值,如果没有针对 key 的映射关系,则返回 null。(如果该实现支持 null 值,则返回 null 也可能表示此映射以前将 null 与 key 关联)。

    Map接口提供三种方法:1.

    Set<K>

    keySet() 返回此映射中包含的键的 Set 视图。

    2.

    Collection<V>

    values() 返回此映射中包含的值的 Collection 视图。

    3.

     Set<Map.Entry<K,V>>

    entrySet() 返回此映射中包含的映射关系的 Set 视图。

    HashMap类

    案例功能

    集合工具类:Collections

    Collections 类是用于操作List、Set和Map等集合的工具类,该类提供了大量的方法可以对集合元素进行排序、查询和修改等操作。

    Collections 类是java.util包下的。它所提供的方法均为静态方法,可以直接通过“类名.方法”的形式调用。

    小结

    1. 集合的长度是可变的,但是只能存放引用数据类型的数据,不能存放基本数据类型的数据;
    2. Collection 是集合类的基本接口,其主要的子接口有List 和 Set。而Map 不是其子接口。Collection 接口声明所有集合类的核心方法,一般情况下都不会使用Collection 接口,而是使用其子类List和Set集合。
    3. List 是有序的Collection,使用List 接口可以精确地控制每个元素插入的位置,也可以通过索引来访问List集合中的元素。List接口常用的实现类有ArrayList 和LinkedList。List 集合允许存放重复的元素。
    4. Set 是一个不包含重复元素的Collection,Set允许包含null元素,但不能包含重复的元素。一般重写类的equals() 和 hashCode() 方法来区别Set集合中元素是否相同。
    5. Set 接口常用的子类有HashSet 和TreeSet,其中HashSet 是按照哈希算法来存取集合中的元素的,其存取的效率高。HashSet 类是无序存放元素的,而TreeSet 是有序存放元素的,但是需要使用Comparable 进行排序操作。
    6. 集合的输出有多种方式,其中使用Iterator 迭代器是标准的输出方式,在JDK1.5 之后集合也支持了foreach 方式。
    7. Map 没有继承Collection 接口,可以用于保存具有映射关系的数据,其提供的是key 到value的映射。
    8. Map接口常用实现类有HashMap 和TreeMap。HashMap 类是基于哈希表的Map接口的实现,对于元素的添加和删除有着较高的效率。TreeMap 集合主要是对所有的key进行排序,从而保证所有的key-value 映射关系处于有序状态。TreeMap 集合在元素的添加、删除和定位映射性能较低。
  • 相关阅读:
    select、poll和epoll
    Linux 常用命令之文件和目录
    SmartPlant Review 帮助文档机翻做培训手册
    SmartPlant Foundation 基础教程 3.4 菜单栏
    SmartPlant Foundation 基础教程 3.3 标题栏
    SmartPlant Foundation 基础教程 3.2 界面布局
    SmartPlant Foundation 基础教程 3.1 DTC登陆界面
    SmartPlant Foundation 基础教程 1.4 SPF架构
    SmartPlant Foundation 基础教程 1.3 SPF其他功能
    SmartPlant Foundation 基础教程 1.2 SPF集成设计功能
  • 原文地址:https://www.cnblogs.com/Qian123/p/5685155.html
Copyright © 2011-2022 走看看