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集合存储学生信息,并执行以下操作
- 学生对象信息:学号、姓名、年龄、性别、班级。
- 多个学生信息添加到集合中
- 查看学生的数量及所有学生的信息
- 删除集合中部分学生的元素
- 判断集合中是否包含指定学生
4 LinkedList操作数据
- 插入、删除操作频繁时,可使用LinkedList来提高效率。
- LinkedList特有的操作方法
|
方法名 |
说 明 |
|
void addFirst(Object o) |
在列表的首部添加元素 |
|
void addLast(Object o) |
在列表的末尾添加元素 |
|
Object getFirst() |
返回列表中的第一个元素 |
|
Object getLast() |
返回列表中的最后一个元素 |
|
Object removeFirst() |
删除并返回列表中的第一个元素 |
|
Object removeLast() |
删除并返回列表中的最后一个元素 |
上机练习 :使用LinkedList集合存储新闻对象信息,并执行以下操作
- 新闻对象信息:编号、标题、作者、内容、出版日期。
- 多条新闻信息添加到集合中
- 查看新闻的数量及所有新闻的信息
- 删除头条新闻
- 删除最后一条新闻
- 把指定新闻添加到头条
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 |
实现原理、功能相同,可以互用。 |
|
|
ArrayList |
2 Hashtable和HashMap的异同
|
集合 |
相同 |
区别 |
|
Hashtable |
实现原理、功能相同,可以互用。 |
|
|
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 集合框架的更多相关文章
- JavaSE学习总结第15天_集合框架1
15.01 对象数组的概述和使用 public class Student { // 成员变量 private String name; private int age; // 构造方法 publ ...
- JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue
前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...
- JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...
- JavaSE复习_9 集合框架复习
△列表迭代器也是不支持在迭代的时候添加元素的,只是列表迭代器自己定义了增删的方法而已.迭代器可以看成实在两个元素之间的指针,每当调用next就跳过一个元素并返回刚刚跳过的元素. △HashTable不 ...
- JavaSE学习总结第18天_集合框架4
18.01 Map集合概述和特点 Map接口概述:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值 Map接口和Collection接口的不同 1.Map是双列的,Coll ...
- [javaSE] 集合框架(体系概述)
为什么出现集合类 为了方便对多个对象的操作,对对象进行存储,集合就是存储对象最常用的一种方式 数组和集合的不同 数组是固定长度的,集合是可变长度的 数组可以存储基本数据类型,集合只能存储对象 数组只能 ...
- JavaSE 学习笔记之集合框架(十八)
集合框架:,用于存储数据的容器. 特点: 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合.因为集合是可变长度的. 集合和数组的区 ...
- Java 学习(16):集合框架
Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, Properties 这些类用来存储和操作对象组. 虽然这些类都非常有 ...
- JavaSE_ 集合框架 总目录(15~18)
JavaSE学习总结第15天_集合框架1 15.01 对象数组的概述和使用15.02 对象数组的内存图解15.03 集合的由来及与数组的区别15.04 集合的继承体系图解15.05 Collectio ...
- [集合]Collection集合框架源码分析
Collection接口 在java的集合类库中,基本接口是Collection,该接口的在集合中的源码定义如下(将源码中的注释删掉了): public interface Collection< ...
随机推荐
- codeforces 688B B. Lovely Palindromes(水题)
题目链接: B. Lovely Palindromes time limit per test 1 second memory limit per test 256 megabytes input s ...
- 【SCOI 2005】 扫雷
[题目链接] 点击打开链接 [算法] 只要第一行第一个数确定了,后面的数也都确定了 递推两遍即可 [代码] #include<bits/stdc++.h> using namespace ...
- Pimple研究及PHP框架搭建
此文参考PHP容器--Pimple运行流程浅析 和 利用 Composer 一步一步构建自己的 PHP 框架,如有不清楚的,请参考原文. Pimple貌似在PHP社区里非常流行,听闻是个非常轻量化并且 ...
- 【原创】MapReduce备份Elasticsearch数据到HDFS(JAVA)
一.环境:JAVA8,Elasticsearch-5.6.2,Hadoop-2.8.1二.实现功能:mapreduce读elasticsearch数据.输出parquet文件.多输出路径三.主要依赖 ...
- 洛谷 P3356 火星探险问题 【最大费用最大流】
输出方案好麻烦啊 拆点,石头的连(i,i',1,1)(i,i',inf,0)表示可以取一次价值1,空地直接连(i,i',inf,0),对于能走到的两个格子(不包括障碍),连接(i',j,inf,0), ...
- 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减 直至765398并保持此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动 ,当数码管上数减到停止时,实验板上流水灯出停止然后全部开始闪烁,3秒后(用 T0定时)流水灯全部关闭,数码管上显示出“HELLO”,到此保持住
#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigne ...
- 洛谷 P3285 [SCOI2014]方伯伯的OJ
看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...
- 前缀+排序 HDOJ 4311 Meeting point-1
题目传送门 题意:给一些坐标轴上的点,选一个点,使得其他点到该点曼哈顿距离和最小 分析:这题有很强的技巧性,直接计算每个点的曼哈顿距离和是不可行的.这里用到了前缀的思想,先对点按照x从左到右排序,p[ ...
- ACM_跳坑小能手(暴力)
跳坑小能手 Time Limit: 2000/1000ms (Java/Others) Problem Description: GDUFE-GAME现场有一个游戏场地人头窜动,围观参与游戏的学生在场 ...
- Matlab实现图像分割 分类: 图像处理 2014-06-14 21:31 662人阅读 评论(1) 收藏
下面使用极小值点阈值选取方法,编写MATLAB程序实现图像分割的功能. 极小值点阈值选取法即从原图像的直方图的包络线中选取出极小值点, 并以极小值点为阈值将图像转为二值图像 clear all; cl ...

