学习要点

  • 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+"\t"+stu.getGrade());

           }

  

方法2:增强型for循环

示例代码:

        //使用foreach语句输出集合中所有学生的信息

         for(Object key:keys){

            Student stu=(Student)studentMap.get(key);  //根据key取出对应的值

            System.out.println(key+"\t"+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

JavaSE-16 集合框架的更多相关文章

  1. JavaSE学习总结第15天_集合框架1

      15.01 对象数组的概述和使用 public class Student { // 成员变量 private String name; private int age; // 构造方法 publ ...

  2. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  3. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  4. JavaSE复习_9 集合框架复习

    △列表迭代器也是不支持在迭代的时候添加元素的,只是列表迭代器自己定义了增删的方法而已.迭代器可以看成实在两个元素之间的指针,每当调用next就跳过一个元素并返回刚刚跳过的元素. △HashTable不 ...

  5. JavaSE学习总结第18天_集合框架4

      18.01 Map集合概述和特点 Map接口概述:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值 Map接口和Collection接口的不同 1.Map是双列的,Coll ...

  6. [javaSE] 集合框架(体系概述)

    为什么出现集合类 为了方便对多个对象的操作,对对象进行存储,集合就是存储对象最常用的一种方式 数组和集合的不同 数组是固定长度的,集合是可变长度的 数组可以存储基本数据类型,集合只能存储对象 数组只能 ...

  7. JavaSE 学习笔记之集合框架(十八)

    集合框架:,用于存储数据的容器. 特点: 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合.因为集合是可变长度的. 集合和数组的区 ...

  8. Java 学习(16):集合框架

    Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack,  Properties 这些类用来存储和操作对象组. 虽然这些类都非常有 ...

  9. JavaSE_ 集合框架 总目录(15~18)

    JavaSE学习总结第15天_集合框架1 15.01 对象数组的概述和使用15.02 对象数组的内存图解15.03 集合的由来及与数组的区别15.04 集合的继承体系图解15.05 Collectio ...

  10. [集合]Collection集合框架源码分析

    Collection接口 在java的集合类库中,基本接口是Collection,该接口的在集合中的源码定义如下(将源码中的注释删掉了): public interface Collection< ...

随机推荐

  1. SimpliciTI 地址分配

    1.多个ED节点和AP正确连接后,AP都会给ED分配一个相应的地址.当某个ED出现意外,比如电源问题,和AP断开连接,AP并不将该ED节点的地址消除.当该ED恢复正常,重新申请加入网络时,AP会检测该 ...

  2. poj 3321(带时间戳 + 区间统计)

    题目描述: 给定一颗树,求某个节点的子树的val值之和 可以用树的前序遍历给每一个节点编号,从而可以确定一个节点的子树的范围,这样就可以进行直接在区间上进行统计了. vector < int & ...

  3. 11.2NOIP模拟赛

    /* 根右左遍历后最长上升子序列 */ #include<iostream> #include<cstdio> #include<cstring> #include ...

  4. Step 4: Install and Configure Databases

    https://www.cloudera.com/documentation/enterprise/latest/topics/cm_ig_installing_configuring_dbs.htm ...

  5. SQL 实战教程(八)

    http://www.studyofnet.com/news/247.html 1.修改字段为自增 alter table [dbo].[Logs] drop column ID alter tabl ...

  6. Qt下存储读写应用程序设置的三种方法

    一.简介 用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小.位置和密码等等.有三种方法可以实现: 使用注册表: 使用配置文件(.ini): 使用自定义文件(例如.txt) ...

  7. 洛谷 P1501 [国家集训队]Tree II

    看来这个LCT板子并没有什么问题 #include<cstdio> #include<algorithm> using namespace std; typedef long ...

  8. 找规律/贪心 Codeforces Round #310 (Div. 2) A. Case of the Zeros and Ones

    题目传送门 /* 找规律/贪心:ans = n - 01匹配的总数,水 */ #include <cstdio> #include <iostream> #include &l ...

  9. 操作JavaScript的Alert弹框

    @Testpublic void testHandleAlert(){ WebElement button =driver.findElement(By.xpath("input" ...

  10. pycharm的使用小技巧111

    如果你想快速敲出if __name__ == '__main__':只需你敲个main 然后回车就ok了 import和from xx模块 import *的区别是前者使用时要加模块名加点,后者可以直 ...