• 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


  • 相关阅读:
    裁剪圆形图片原理
    Scrollview回弹效果自定义控件
    Android热修复、插件化、组件化
    Android 6.0权限
    Android如何缩减APK包大小
    Android MVP理解
    Mat转化为IplImage类型的方法
    【QT】Qaction和触发函数建立连接的方法
    【QT】【OpenCv】初始配置以及测试功能
    【MATLAB】画信号频谱的子函数
  • 原文地址:https://www.cnblogs.com/rask/p/8253986.html
Copyright © 2020-2023  润新知