# 集合框架
## 什么是集合
Java中的集合是工具类,可以存储任意数量的具有共同属性的对象。
> 集合类存放于java.util包中。
> 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用
> 在集合框架中,主要分为 Collection 和 Map 两大接口。
> 在 Collection 中又分为 List (有序集合) 和 Set (无序集合)。List 和 Set 都是接口。
> 其中Collection存储的是元素,Map存储的key-value键值对。
> 集合框架存储的元素可以是不定长的,即可以任意的添加,但是数组在定义的时候就确定了长度。实际开发中,对于同类型数据的结构,一般使用 Collection 结构会较多。
## Collection

在Collection中,根据不同的数据结构是使用方法,分为Set(无序的数据集合,元素不可重复)、Queue(队列)、List(有序的集合,元素可以重复)。
在Collection中的定义中Interface Collection,是一种泛型结构,意思是在使用Collection定义对象的时候,需要指定存储的元素数据类型(强调:**在集合中存储的数据元素必须都是引用数据类型**)。
### List
list中的内容是有序的并且可以重复的,我们也称之为序列;
list可以精确的控制每个元素的插入位置,或者删除某个位置的元素;
> 是实际开发中用的最多的一种数据结构,存储的单个元素,使用**泛型**去强制约束 List 中存放的是一致的数据类型
> 在List接口中,最常用的实现类为ArrayList和LinkedList,其中ArrayList是运用最多的。
**语法**
~~~
List<E> list = new ArrayList<E>();
~~~
**插入元素**
add()
**遍历元素**
* 通过元素索引下标方式 for 循环
* 通过 foreach 循环
* 通过迭代器 Iterator
**删除元素**
如果通过遍历去查找相关元素进行删除的时候,不要使用 list.remove(int index) 该方法,因为使用该方法,会动态的直接改变集合的元素结构,导致遍历的不完整或者有错误。要使用迭代器遍历集合,调用 Iterator.remove() 方法删除。
### Set
不详细阐述,在遍历的时候不能使用索引方式,只能通过迭代器和 foreach。
## Map

类似的可以理解给集合元素中的值定义了一个 Key 键(遍历),之后可以通过相关的方法快速的定位到具体的 Value 中。
Map中存储是key-value键值对,在Map接口中,我们主要使用的实现类为HashMap。
在使用HashMap类的时候,插入的顺序和最后遍历出来的顺序可以是有差异的,因为本身HashMap结构它是无序的。
通过map.put(key, value)方法进去数据的写入,同样的要注意使用泛型。(强调:**Map中的key键和value值的数据元素必须都是引用数据类型**)。
* * *
**语法**
~~~
Map<k,v> map= new HashMap<k,v>();
~~~
**获取某个 key 的 value**
Value get(Key)
**如何遍历 Map 结构**
获取 Map 的 Key 集合,通过遍历 Key 集合,获取 Value 值。
1. 获取 key 集合:map.keySet();
2. 遍历 Key 集合:iterator;
3. 获取 Value 值:get(key);
## 开发注意事项
在实际开发中,List 一般使用 ArrayList 实现类去构建,Map 一般使用 HashMap 实现类去构建。
要掌握对于 List 和 Map 的添加元素、遍历元素。
要认识集合框架中关于对象在内存中的存储方法。
## 本节课的代码片段
~~~java
public class Students {
private String name;
private String code;
public Students() {
}
public Students(String code, String name) {
this.code = code;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@Override
public String toString() {
return "Students [name=" + this.getName() + ", code=" + this.getCode() + "]";
}
}
public class Demo {
public static void main(String[] args) {
Students qdd = new Students("001","仇冬冬");
Students drm = new Students("002","丁润萌");
Clazz amateur = new Clazz();
amateur.setCode("j01");
amateur.setName("JAVA业余班");
List<Students> stu = new ArrayList<Students>();
//list中使用add()方法,来添加元素
stu.add(qdd);
stu.add(drm);
//当我们想要在list集合中追加元素的时候,同样使用add()方法
Students qh = new Students("003","邱晗");
stu.add(qh);
/*for(int i = 0; i < stu.size(); i++) {
//list集合中,通过索引的方式,来查找集合中的元素get()
System.out.println(stu.get(i));
}
System.out.println("************");
//通过size()方法查看集合的大小
System.out.println(stu.size());
//所以 list集合中索引的范围是0~size-1;
//这是错误的,因为我们的索引超过了,索引的范围
//stu.get(3);
//通过传入索引来删除索引对应的元素
stu.remove(0);
for(int i = 0; i < stu.size(); i++) {
System.out.println(stu.get(i));
}
//通过传入对象来删除集合中对应的对象
//stu.remove(qdd);
//for循环查询list中的元素
for(int i = 0; i < stu.size(); i++) {
System.out.println(stu.get(i));
}
System.out.println("-------------------------");
//使用foreach() 查询list中的元素
for(Students st : stu) {
System.out.println(st);
}
System.out.println("-------------------------");
//创建迭代器
Iterator<Students> it = stu.iterator();
while(it.hasNext()) {
//student对象就是我们遍历出来的集合的对象
Students student = it.next();
System.out.println(student);
}*/
//集合中元素的修改
for(int i = 0; i < stu.size(); i++) {
Students student = stu.get(i);
String name = student.getName();
if(name.equals("邱晗")) {
student.setCode("070");
}
}
for(Students st : stu) {
System.out.println(st);
}
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//如何在list集合中进行循环删除
/*for(int i = 0; i < stu.size(); i++) {
Students student = stu.get(i);
System.out.println(student.getName());
String name = student.getName();
if(name.equals("丁润萌")) {
stu.remove(i);//这样的实现是有问题的
System.out.println(stu.size());
}
}
for(Students st : stu) {
System.out.println(st);
}*/
//使用迭代器进行迭代器中的遍历删除
Iterator<Students> it = stu.iterator();
while(it.hasNext()) {
//student对象就是我们遍历出来的集合的对象
Students student = it.next();
String name = student.getName();
if(name.equals("丁润萌")) {
it.remove();
}
}
System.out.println("处理完的结果————————————————————");
Iterator<Students> it2 = stu.iterator();
while(it2.hasNext()) {
Students st = it2.next();
System.out.println(st);
}
}
}
~~~
~~~
public class Demo {
public static void main(String[] args) {
Students qdd = new Students("001","仇冬冬");
Students drm = new Students("002","丁润萌");
Students lzj = new Students("003","刘子杰");
//map集合中添加元素的方式
Map<String,Students> map = new HashMap<String,Students>();
map.put("qdd", qdd);
map.put("drm", drm);
map.put("lzj", lzj);
//map集合中元素的查找
System.out.println(map.get("qdd"));
System.out.println("***************");
//针对map集合中元素的修改
Students stu = map.get("qdd");
stu.setCode("007");
//遍历map集合
//第一步:获取map中的key集合;
Set<String> set = map.keySet();
//第二部:迭代key集合
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String key = it.next();
System.out.println(key);
Students st = map.get(key);
System.out.println(st);
}
Students wc = new Students("004","王晨");
map.put("wc", wc);
//删除元素
map.remove("wc");
//这样是错误的
/*Iterator<String> it1 = set.iterator();
while(it1.hasNext()) {
String key = it1.next();
if(key.equals("wc")) {
map.remove(key);
}
}
System.out.println(map);*/
}
}
~~~
## 练习
定义一个方法listTest(List\<Integer> al, Interger s),要求返回s在al里面第一次出现的索引,如果s没有出现返回-1
~~~java
public class Demo {
public static int listTest(List<Integer> al, Integer s) {
/*int result = al.indexOf(s);
return result;*/
for(int i = 0; i < al.size(); i++) {
//al.get(i) == s
if(al.get(i).equals(s)) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(6);
list.add(2);
list.add(4);
list.add(5);
list.add(1);
list.add(4);
int a = listTest(list,4);
System.out.println(a);
}
}
~~~
现有一个map集合,如下:
~~~
Map<String,String> map = new HashMap<String,String>();
map.put("001","仇冬冬");
map.put("002","丁润萌");
map.put("003","刘子杰");
map.put("004","邱晗");
~~~
要求:
1. 遍历集合,并将人名与学号对应的打印出来
2. 向该集合插入一条学号为“005”的王晨的信息
3. 要去移除该map中仇冬冬的信息
4. 将map集合中学号为002的学生姓名改为小丁
~~~
Map<String,String> map = new HashMap<String,String>();
map.put("001","仇冬冬");
map.put("002","丁润萌");
map.put("003","刘子杰");
map.put("004","邱晗");
map.put("005", "王晨");
map.remove("001");
map.put("002", "小丁");
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String key = it.next();
System.out.println("学号:" + key + " 姓名:" + map.get(key));
}
~~~
有两个数组,第一个数组内容为:【黑龙江省,浙江省,江西省,广东省,福建省】,第二个数组的内容为:【哈尔滨,杭州,南昌,广州,福州】,将第一个数组元素作为key,第二个数组的元素作为value存储到Map集合中,如【黑龙江=哈尔滨,浙江省=杭州】
~~~
String[] province = {"黑龙江省","浙江省","江西省","广东省","福建省"};
String[] city = {"哈尔滨","杭州","南昌","广州","福州"};
Map<String,String> map = new HashMap<String,String>();
for(int i = 0; i < province.length; i++) {
map.put(province[i],city[i]);
}
System.out.println(map);
~~~
~~~
List<String> province = new ArrayList<String>();
province.add("黑龙江省");
province.add("福建省");
province.add("浙江省");
province.add("广东省");
province.add("江西省");
List<String> city = new ArrayList<String>();
city.add("杭州");
city.add("哈尔滨");
city.add("广州");
city.add("福州");
city.add("南昌");
Map<String,String> map = new HashMap<String,String>();
for(int i = 0; i < province.size(); i++) {
String pro = province.get(i);
for(int j = 0; j < city.size(); j++) {
String ci = city.get(j);
if("黑龙江省".equals(pro)) {
if("哈尔滨".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
} else if("福建省".equals(pro)) {
if("福州".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
} else if("浙江省".equals(pro)) {
if("杭州".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
} else if("广东省".equals(pro)) {
if("广州".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
} else if("江西省".equals(pro)) {
if("南昌".equals(ci)) {
map.put(pro, ci);
} else {
continue;
}
}
}
}
System.out.println(map);
~~~
- Java业余班教学管理
- JAVA基础
- JAVA开发学习准备
- JAVA介绍
- 开发JAVA的准备
- JAVA的运行原理
- JDK配置
- 我的第一个JAVA程序
- 类与对象
- 基础语言要素
- 数据类型
- Eclipse的安装与使用
- 变量
- 直接量
- 运算符
- 流程控制
- 数组结构
- 面向对象
- 隐藏与封装
- 深入构造器
- 类的继承
- 多态
- 包装类
- final修饰符
- 抽象类
- 接口
- 设计模式
- 单例模式
- 工厂模式
- 集合框架
- 集合排序
- 常用类学习
- 异常处理
- Java基础综合练习
- JAVA高级
- 泛型
- 多线程
- 线程的创建
- 线程的生命周期
- 线程同步
- 线程通信
- 输入输出流(I/O编程)
- File文件操作
- 字节流与字符流
- 数据库
- 数据库介绍
- 数据库安装
- SQL
- 表的基本操作
- 修改数据语句
- 数据检索操作
- 多表数据操作
- 表结构设计
- 综合应用
- JavaWeb
