Java常用工具_4.Java集合
一、Java集合概述
1.Java中的集合是工具类,可以存储任意数量的具有共同属性的对象
2.数组和集合
数组:存储20名学生的学生信息(存储固定长度的数据)
集合:存储不定量的商品信息(存储不定长数据且数据动态变化)
3.适用场景
(1)无法预测存储数据的数量
(2)同时存储具有一对一关系的数据
(3)需要进行数据的增删改查
(4)数据重复问题
二、集合框架的体系结构
Collection(类的对象)
List(序列)Queue(队列)List和Queue是有序允许重复
ArrayList(相当于长度动态增长的数组)
LinkedList(链表)
Set(集)无序不允许重复
HastSet(哈希集)
Map(键值对)
HashMap(哈希表)
三、List(列表)
1.List是元素有序并且可以重复的集合,成为序列
2.List可以精确的控制每个元素的插入位置,或删除某个元素的位置
3.List的两个主要实现类是ArrayList和LinkedList
4.ArrayList
(1)ArrayList底层是由数组实现的
(2)动态增长,以满足应用程序的需求
(3)在列表尾部插入或删除数据非常有效
(4)更适合查找和更新元素
(5)ArrayList中的元素可以为null
5.在java.util包中
Collection
List
ArrayList
6.代码实现
案例:用ArrayList存储编程语言的名称,并输出
名称包括”Java”,”C”,”C++“,”Go”和”Swift”
package com.study.set;
import java.util.ArrayList;
import java.util.List;
public class ListDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 用ArrayList存储编程语言的名称,并输出
List list = new ArrayList();
list.add("Java");
list.add("C");
list.add("C++");
list.add("Go");
list.add("swift");
// 输出列表中元素的个数
System.out.println("列表中元素的个数为:" + list.size());
// 遍历输出所有编程语言
System.out.println("********************");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
// 移除列表中的C++
System.out.println();
// list.remove(2);
list.remove("C++");
System.out.println("********************");
System.out.println("移除C++以后的列表元素为: ");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
}
}
案例:公告管理
需求-公告的添加和显示 -在指定位置处插入公告 -删除公告 -修改公告
package com.study.set;
import java.util.Date;
public class Notice {
private int id;// ID
private String title;// 标题
private String creator;// 创建人
private Date createTime;// 创建时间
public Notice(int id, String title, String creator, Date createTime) {
super();
this.id = id;
this.title = title;
this.creator = creator;
this.createTime = createTime;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
package com.study.set;
import java.util.ArrayList;
import java.util.Date;
public class NoticeTest {
public static void main(String[] args) {
// 创建Notice类的对象,生成三条公告
Notice notice1 = new Notice(1, "欢迎来到java学习!", "管理员", new Date());
Notice notice2 = new Notice(2, "请按时提交作业!", "老师", new Date());
Notice notice3 = new Notice(3, "考勤通知!", "老师", new Date());
// 添加公告
ArrayList noticeList = new ArrayList();
noticeList.add(notice1);
noticeList.add(notice2);
noticeList.add(notice3);
// 显示公告
System.out.println("公告的内容为:");
for (int i = 0; i < noticeList.size(); i++) {
System.out.println(i + 1 + ":" + ((Notice) (noticeList.get(i))).getTitle());
}
// 公告的内容为:
// 1:欢迎来到java学习!
// 2:请按时提交作业!
// 3:考勤通知!
System.out.println("*************************************");
// 在第一条公告后面添加一条新公告
Notice notice4 = new Notice(4, "在线编辑器可以使用了!", "管理员", new Date());
noticeList.add(1, notice4);
// 显示公告
System.out.println("公告的内容为:");
for (int i = 0; i < noticeList.size(); i++) {
System.out.println(i + 1 + ":" + ((Notice) (noticeList.get(i))).getTitle());
}
// *************************************
// 公告的内容为:
// 1:欢迎来到java学习!
// 2:在线编辑器可以使用了!
// 3:请按时提交作业!
// 4:考勤通知!
System.out.println("*************************************");
// 删除按时提交作业的公告
noticeList.remove(2);
// 显示公告
System.out.println("删除公告后的内容为:");
for (int i = 0; i < noticeList.size(); i++) {
System.out.println(i + 1 + ":" + ((Notice) (noticeList.get(i))).getTitle());
}
// *************************************
// 删除公告后的内容为:
// 1:欢迎来到java学习!
// 2:在线编辑器可以使用了!
// 3:考勤通知!
// 将第二条公告改为Java在线编辑器可以使用了!
System.out.println("*************************************");
// 修改第二条公告中title的值
notice4.setTitle("Java在线编辑器可以使用了!");
noticeList.set(1, notice4);// 显示公告
System.out.println("修改公告后的内容为:");
for (int i = 0; i < noticeList.size(); i++) {
System.out.println(i + 1 + ":" + ((Notice) (noticeList.get(i))).getTitle());
}
// *************************************
// 修改公告后的内容为:
// 1:欢迎来到java学习!
// 2:Java在线编辑器可以使用了!
// 3:考勤通知!
}
}
四、Set
1.Set是元素无序并且不可重复的集合,被称为集
2.HashSet
• HashSet是Set的一个重要实现类,称为哈希集
• HashSet中的元素无序并且不可以重复
• HashSet中只允许一个null元素
• 具有良好的存取和查找性能
3.常用方法
Set
HashSet
4.Iterator(迭代器)
• Iterator接口可以以统一的方式对各种集合元素进行遍历
• hasNext()方法检测集合中是否还有下一个元素
• next()方法返回集合中的下一个元素
5.哈希表
hashCode方法:判断元素在哪一个类型里
equals方法:判断哪个元素是需要查找的
6.代码实现
案例
用HashSet存储多个表示颜色的英文单词,并输出.
单词包括: “blue”,“red”,“black“,”yellow”和“white”
package com.study.set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class WordDemo {
public static void main(String[] args) {
// 将英文单词添加到HashSet中
Set set = new HashSet();
// 向集合中添加元素
set.add("blue");
set.add("red");
set.add("black");
set.add("yellow");
set.add("white");
// 显示集合的内容
System.out.println("集合中的元素为:");
Iterator it = set.iterator();
// 遍历迭代器并输出元素
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
System.out.println();
// 集合中的元素为:
// red blue white black yellow
// 在集合中插入一个新的单词
// set.add("green");
set.add("white");
it = set.iterator();
// 遍历迭代器并输出元素
System.out.println("*****************");
System.out.println("插入重复元素后的输出结果为:");
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
// 插入失败,但是不会报错
// *****************
// 插入重复元素后的输出结果为:
// red blue white black yellow
}
}
案例:宠物猫信息管理
需求 -添加和显示宠物猫信息 -查找某只宠物猫的信息并输出 -修改宠物猫的信息 -删除宠物猫信息
package com.study.set;
public class Cat {
private String name;// 名字
private int month;// 年龄
private String species;// 品种
// 构造方法
public Cat(String name, int month, String species) {
super();
this.name = name;
this.month = month;
this.species = species;
}
// getter与setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
@Override
public String toString() {
return "[姓名:" + name + ", 年龄:" + month + ", 品种:" + species + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + month;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((species == null) ? 0 : species.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)// 判断对象是否相等,相等则返回true
return true;
if (obj.getClass() == Cat.class) {// 判断obj是否是Cat类的对象
Cat cat = (Cat) obj;
return cat.getName().equals(name) && (cat.getMonth() == month) && cat.getSpecies().equals(species);
}
return false;
}
}
package com.study.set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class CatTest {
public static void main(String[] args) {
// 定义宠物猫对象
Cat huahua = new Cat("花花", 12, "英国短毛猫");
Cat fanfan = new Cat("凡凡", 3, "中华田园猫");
// 将宠物猫对象放入HashSet中
Set<Cat> set = new HashSet<Cat>();// <Cat>泛型作用:不用再进行强制类型转换,且如果不是Cat类,会进行报错,避免异常
set.add(huahua);
set.add(fanfan);
// 显示宠物猫信息
Iterator<Cat> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());// 会自动调用toString()方法,需要重写toString()方法,否则会输出地址
}
// [姓名:花花, 年龄:12, 品种:英国短毛猫]
// [姓名:凡凡, 年龄:3, 品种:中华田园猫]
// 添加一个与花花属性一样的猫
Cat huahua01 = new Cat("花花", 12, "英国短毛猫");
set.add(huahua01);
// 显示宠物猫信息
System.out.println("********************************");
System.out.println("添加重复数据后的宠物猫信息:");// 需要重写hashCode()方法和equals()方法,否则还会添加进去
it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// ********************************
// 添加重复数据后的宠物猫信息:
// [姓名:花花, 年龄:12, 品种:英国短毛猫]
// [姓名:凡凡, 年龄:3, 品种:中华田园猫]
// 重新插入一个新宠物猫
Cat huahua02 = new Cat("花花二代", 2, "英国短毛猫");
set.add(huahua02);
System.out.println("********************************");
System.out.println("添加花花二代后的宠物猫信息:");
it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// ********************************
// 添加花花二代后的宠物猫信息:
// [姓名:花花, 年龄:12, 品种:英国短毛猫]
// [姓名:凡凡, 年龄:3, 品种:中华田园猫]
// [姓名:花花二代, 年龄:2, 品种:英国短毛猫]
System.out.println("********************************");
// 在集合中查找花花的信息并输出
if (set.contains(huahua)) {
System.out.println("花花找到了");
System.out.println(huahua);
} else {
System.out.println("花花未找到");
}
// ********************************
// 花花找到了
// [姓名:花花, 年龄:12, 品种:英国短毛猫]
// 在集合中使用名字查找花花的信息
System.out.println("******************");
System.out.println("通过名字查找花花信息");
boolean flag = false;
Cat c = null;
it = set.iterator();// 迭代器需要重新放至集合表头
while (it.hasNext()) {
c = it.next();
if (c.getName().equals("花花")) {
flag = true;// 找到了
break;
}
}
if (flag) {
System.out.println("花花找到了");
System.out.println(c);
} else {
System.out.println("花花未找到");
}
// ******************
// 通过名字查找花花信息
// 花花找到了
// [姓名:花花, 年龄:12, 品种:英国短毛猫]
// 删除花花二代的信息并重新输出
// for (Cat cat : set) {// 增强型for循环
// if ("花花二代".equals(cat.getName())) {
// set.remove(cat);
// break;
// }
// }
// System.out.println("删除花花二代后的数据");
// for (Cat cat : set) {
// System.out.println(cat);
// }
// 删除花花二代后的数据
// [姓名:花花, 年龄:12, 品种:英国短毛猫]
// [姓名:凡凡, 年龄:3, 品种:中华田园猫]
Set<Cat> set1 = new HashSet<Cat>();
for (Cat cat : set) {// 增强型for循环
if (cat.getMonth() < 5) {
// set.remove(cat);
set1.add(cat);
}
}
set.removeAll(set1);
System.out.println("删除小于5岁后的数据");
for (Cat cat : set) {
System.out.println(cat);
}
// 删除集合中的所有宠物猫信息
System.out.println("*****************");
boolean flag1 = set.removeAll(set);
if (set.isEmpty()) {// if(flag1){
System.out.println("已删除集合中所有信息");
} else {
System.out.println("集合中还有信息");
}
// *****************
// 已删除集合中所有信息
}
}
五、Map
1.Map是什么
• Map中的数据是以键值对(key-value)的形式存储的
• key-value以Entry类型的对象实例存在
• 可以通过key值快速地查找value
• 一个映射不能包含重复的键
• 每个键最多只能映射到一个值
2.HashMap
• 基于哈希表的Map接口的实现
• 允许使用null值和null键
• key值不允许重复
• HashMap中的Entry对象是无序排列的
3.java.util包中
**
4.代码实现
案例1
完成一个类似字典的功能.
- 将单词以及单词的注释存储到HashMap中 - 显示HashMap中的内容 - 查找某个单词的注释并显示
package com.study.set;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class DictionaryDemo {
public static void main(String[] args) {
Map<String, String> animal = new HashMap<String, String>();
System.out.println("请输入三组单词对应的注释,并存放到HashMap中");
Scanner console = new Scanner(System.in);
// 添加数据
int i = 0;
while (i < 3) {
System.out.println("请输入key值(单词):");
String key = console.next();
System.out.println("请输入value值(注释):");
String value = console.next();
animal.put(key, value);
i++;
}
// 打印输出value的值(直接使用迭代器)
System.out.println("*********************");
System.out.println("使用迭代器输出所有的value:");
Iterator<String> it = animal.values().iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
System.out.println();
System.out.println("***********************");
// 打印输出key和value的值
// 通过entrySet方法
System.out.println("通过entrySet方法得到key-value:");
Set<Entry<String, String>> entrySet = animal.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.print(entry.getKey() + "-");
System.out.println(entry.getValue());
}
System.out.println();
System.out.println("***********************");
// 通过单词找到注释并输出
// 使用keySet方法
System.out.println("请输入要查找的单词:");
String strSearch = console.next();
// 1.取得keySet
Set<String> keySet = animal.keySet();
// 2.遍历keySet
for (String key : keySet) {
if (strSearch.equals(key)) {
System.out.println("找到了!" + "键值对为:" + key + "-" + animal.get(key));
break;
}
}
}
}
案例2:商品信息管理
使用HashMap对商品信息进行管理 -其中key为商品编号,value为商品对象
对HashMap中的商品信息进行增,删,改,查操作
package com.study.set;
public class Goods {
private String id;// 商品编号
private String name;// 商品名称
private double price;// 商品价格
// 构造方法
public Goods(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
// getter和setter方法
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String toString() {
return "商品编号:" + id + ",商品名称:" + name + ",商品价格:" + price;
}
}
package com.study.set;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
public class GoodsTest {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
// 定义HashMap对象
Map<String, Goods> goodsMap = new HashMap<String, Goods>();
System.out.println("请输入三条商品信息:");
int i = 0;
while (i < 3) {
System.out.println("请输入第" + (i + 1) + "条商品信息:");
System.out.println("请输入商品编号:");
String goodsId = console.next();
// 判断商品编号id是否存在
if (goodsMap.containsKey(goodsId)) {
System.out.println("该商品编号已经存在,请重新输入");
continue;
}
System.out.println("请输入商品名称:");
String goodsName = console.next();
System.out.println("请输入商品价格:");
double goodsPrice = 0;
try {
goodsPrice = console.nextDouble();
} catch (java.util.InputMismatchException e) {
System.out.println("商品价格的格式不正确,请输入数值型数据!");
console.next();
continue;
}
Goods goods = new Goods(goodsId, goodsName, goodsPrice);
// 将商品信息添加到HashMap中
goodsMap.put(goodsId, goods);
i++;
}
// 遍历Map,输出商品信息
System.out.println("商品的全部信息为:");
Iterator<Goods> itGoods = goodsMap.values().iterator();
while (itGoods.hasNext()) {
System.out.println(itGoods.next());
}
}
}