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());
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值