zoukankan      html  css  js  c++  java
  • JavaSE-16 集合框架

    学习要点

    • Java集合框架内容
    • ArrayList和LinkedList
    • HashMap
    • Iterator
    • 泛型集合

      

    Java的集合框架

    1  概述

    数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。

    数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法。

    在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework)。

    在Java 2之前,Java是没有完整的集合框架的。它只有一些简单的可以自扩展的容器类,比如Vector,Stack,Hashtable等。这些容器类在使用的过程中由于效率问题饱受诟病,因此在Java 2中,Java设计者们进行了大刀阔斧的整改,重新设计,于是就有了现在的集合框架。需要注意的是,之前的那些容器类库并没有被弃用而是进行了保留,主要是为了向下兼容的目的,平时尽量少用。

    在编写Java程序在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。

    Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。

    2  Java集合框架图

     

    3  Java集合框架简化图

     

    4  Collection接口

     

    Collection 接口存储一组不唯一,无序的对象

    List 接口存储一组不唯一,有序(插入顺序)的对象

    Set 接口存储一组唯一,无序的对象

     

    5  Map接口

    Map接口存储一组键值对象,提供key到value的映射。

     

    List接口实现类

     

    1        ArrayList

    ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。

     

    2        LinkedList

    LinkedList采用链表存储方式。插入、删除元素时效率比较高。

     

    3        ArrayList操作数据

    • List接口提供的常用操作方法

    方法名

    说    明

    boolean  add(Object o)

    在列表的末尾顺序添加元素,起始索引位置从0开始。

    void  add(int index,Object o)

    在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间。

    int  size()

    返回列表中的元素个数。

    Object  get(int index)

    返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换。

    boolean  contains(Object o)

    判断列表中是否存在指定元素。

    boolean  remove(Object o)

    从列表中删除元素。

    Object   remove(int index)

    从列表中删除指定位置元素,起始索引位置从0开始。

    演示:使用ArrayList集合存储学生信息,并执行以下操作

    1. 学生对象信息:学号、姓名、年龄、性别、班级。
    2. 多个学生信息添加到集合中
    3. 查看学生的数量及所有学生的信息
    4. 删除集合中部分学生的元素
    5. 判断集合中是否包含指定学生

    4        LinkedList操作数据

    • 插入、删除操作频繁时,可使用LinkedList来提高效率。
    • LinkedList特有的操作方法

    方法名

    说    明

    void  addFirst(Object o)

    在列表的首部添加元素

    void  addLast(Object o)

    在列表的末尾添加元素

    Object  getFirst()

    返回列表中的第一个元素

    Object  getLast()

    返回列表中的最后一个元素

    Object  removeFirst()

    删除并返回列表中的第一个元素

    Object  removeLast()

    删除并返回列表中的最后一个元素

    上机练习 使用LinkedList集合存储新闻对象信息,并执行以下操作

    1. 新闻对象信息:编号、标题、作者、内容、出版日期。
    2. 多条新闻信息添加到集合中
    3. 查看新闻的数量及所有新闻的信息
    4. 删除头条新闻
    5. 删除最后一条新闻
    6. 把指定新闻添加到头条

     

     

    Map接口实现类

    1  HashMap

    Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作。最常用的实现类是HashMap。

    Map接口常用方法

    方法名

       

    Object put(Object key, Object val)

    以“键-值对”的方式进行存储

    Object get (Object key)

    根据键返回相关联的值,如果不存在指定的键,返回null

    Object remove (Object key)

    删除由指定的键映射的“键-值对”

    int size()

    返回元素个数

    Set keySet ()

    返回键的集合

    Collection values ()

    返回值的集合

    boolean    containsKey (Object key)

    如果存在由指定的键映射的“键-值对”,返回true

    上机练习 使用Map存储元素

    需求描述:建立姓名和学生对象之间的键值映射,并通过key和value进行操作,如何实现数据的存储和操作?

    2  遍历Map集合

    方法1:通过迭代器Iterator实现遍历

    获取Iterator :Collection 接口的iterate()方法

    Iterator的方法:

    • boolean hasNext(): 判断是否存在另一个可访问的元素。
    • Object next(): 返回要访问的下一个元素。

    示例代码:

    /* 1、创建多个学生对象*/
    
           Student zs = new Student("张三", "大一");
    
           Student ls = new Student("李四", "大二");
    
           Student ww = new Student("王五", "大三");
    
           Student zl = new Student("赵六", "大四");
    
           /* 2、创建Map集合对象并把多个学生对象放入其中*/
    
           Map studentMap=new HashMap();
    
           studentMap.put(zs.getName(),zs);
    
           studentMap.put(ls.getName(),ls);
    
           studentMap.put(ww.getName(),ww);
    
           studentMap.put(zl.getName(),zl);
    
           /*3、通过迭代器依次输出集合中所有学生的信息*/
    
           System.out.println("使用Iterator遍历,所有学生的姓名和年级分别是:");
    
           Set keys=studentMap.keySet();//取出所有key的集合
    
           Iterator it=keys.iterator();//获取Iterator对象
    
           while(it.hasNext()){
    
               String key=(String)it.next();  //取出key
    
               Student stu=(Student)studentMap.get(key); //根据key取出对应的值
    
               System.out.println(key+"	"+stu.getGrade());
    
               }
    

      

    方法2:增强型for循环

    示例代码:

            //使用foreach语句输出集合中所有学生的信息
    
             for(Object key:keys){
    
                Student stu=(Student)studentMap.get(key);  //根据key取出对应的值
    
                System.out.println(key+"	"+stu.getGrade());   
    
            }
    

      

    上机练习3:遍历学生Map集合

    集合类对比

    1  Vector和ArrayList的异同

    集合

    相同

    区别

    Vector

    实现原理、功能相同,可以互用。

    1. Vector线程安全,ArrayList重速度轻安全,线程非安全。
    2. 长度需增长时,Vector默认增长一倍,ArrayList增长50%。

    ArrayList

     

     

     

     

     

     

     

    2  Hashtable和HashMap的异同

    集合

    相同

    区别

    Hashtable

    实现原理、功能相同,可以互用。

    1. Hashtable继承Dictionary类,HashMap实现Map接口。
    2. Hashtable线程安全,HashMap线程非安全
    3. Hashtable不允许null值,HashMap允许null值。

    HashMap

     

     

     

     

     

     

    3  建议

    开发过程中,推荐使用ArrayList和HashMap。

    泛型集合

    1        问题

    List和Map在存储数据时候,发生装箱操作,所有数据类型都转换成Object类型。当取出的时候需要拆箱,可能导致数据类型转换失败。

    例如:

    List的get(int index)方法获取元素

    Map的get(Object key)方法获取元素

    Iterator的next()方法获取元素

    2  解决方案

    泛型:JDK5.0使用泛型改写了集合框架中的所有接口和类,使之实现参数化类型。

    参数化类型:parameterized type。也称为泛型(Generic)。

    泛型保证数据存取的时候不再进行装箱和拆箱的操作,避免类型转换失败,保证数据类型的安全。

    例如:

    List<Student>  list = new  ArrayList<Student>(); //jdk1.7以后支持菱形写法
    
    // List<Student>  list = new  ArrayList<>();
    
    Map<String,Student>  stuMap=new  HashMap<String,Student>();
    
    // Map<String,Student>  stuMap=new  HashMap<>();
    
    Set<String>  keys=stuMap.keySet();   //取出所有key的集合
    
    Iterator<String>  it=keys.iterator();     
    

      

    上机练习:使用泛型改造上机练习1-3



    本博客文章未经许可,禁止转载和商业用途!

    如有疑问,请联系: 2083967667@qq.com


  • 相关阅读:
    《DSP using MATLAB》 示例 Example 9.12
    《DSP using MATLAB》示例 Example 9.11
    《DSP using MATLAB》示例 Example 9.10
    《DSP using MATLAB》示例Example 9.9
    《DSP using MATLAB》示例 Example 9.8
    《DSP using MATLAB》示例Example 9.7
    《DSP using MATLAB》示例 Example 9.6
    《DSP using MATLAB》示例Example 9.5
    《DSP using MATLAB》示例 Example 9.4
    (转载)【C++11新特性】 nullptr关键字
  • 原文地址:https://www.cnblogs.com/rask/p/8253986.html
Copyright © 2011-2022 走看看