【从零开始的Java开发】1-5-4 ArrayList、HashSet、HashMap 概述与案例
文章目录
- 集合框架的体系结构
- List概述
- ArrayList
- 案例:在List中操作String
- 案例:公告管理——在ArrayList中对自定义对象的操作
- Set概述
- 案例:在Set中操作String
- 案例:宠物猫信息管理——在HashSet中对自定义对象的操作
- Map概述
- 案例:在Map中操作String
- 案例:商品信息管理
- 总结
- ArrayList
- HashSet
- HashMap
- Iterator迭代器
- hashCode
- equals
集合框架的体系结构
List概述
- List是元素有序并且可以重复的集合,称为序列。
- List可以精确的控制每个元素的插入位置,或删除某个位置的元素。
- List的两个主要实现类是
ArrayList
和LinkedList
ArrayList
- ArrayList底层是由数组实现的
- 动态增长,以满足应用程序的需求
- 在列表尾部插入或删除数据非常有效
- 更适合查找和更新元素
- 元素可以为
null
案例:在List中操作String
add
size
get
remove
代码:
public static void main(String[] args) {// TODO Auto-generated method stub// 用ArrayList存储编程语言的名称并输出:Java、C、C++、GoList list = new ArrayList();list.add("Java");list.add("C");list.add("C++");list.add("Go");// 输出列表中元素的个数System.out.println(list.size());// 遍历输出所有编程语言for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}System.out.println();// 移除列表中的C++list.remove(2);// 移除列表中的Javalist.remove("Java");// 查看for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}}
输出:
4
Java C C++ Go
C Go
案例:公告管理——在ArrayList中对自定义对象的操作
需求:
- 公告的添加和显示
- 在指定位置处插入公告
- 删除公告
- 修改公告
即:增删查改。
公告类属性:
- 编号 id
- 标题 title
- 创建人 creator
- 创建时间 createTime
公告类方法:
- 构造方法
- Getter Setter
公告类:
public class Notice {private int id;// IDprivate 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;}}
公告测试类:
public class NoticeTest {public static void main(String[] args) {// 创建Notice类的对象,生成三条公告Notice not1 = new Notice(1, "欢迎学习Java!", "管理员", new Date());Notice not2 = new Notice(2, "请按时提交作业!", "老师", new Date());Notice not3 = new Notice(3, "考勤通知!", "老师", new Date());// 添加公告ArrayList noticeList = new ArrayList();noticeList.add(not1);noticeList.add(not2);noticeList.add(not3);// 显示公告System.out.println("公告内容为:");for (int i = 0; i < noticeList.size(); i++) {// 要强制转换:因为get(i)返回的是Object,它没有getTitle方法System.out.println((i + 1) + " " + ((Notice) (noticeList.get(i))).getTitle());}System.out.println();// 在第一条公告后添加新公告Notice not4 = new Notice(4, "在线编辑器可以使用了", "管理员", new Date());noticeList.add(1, not4);// 删除按时完成作业的公告noticeList.remove(2);// 显示公告System.out.println("修改后公告内容为:");for (int i = 0; i < noticeList.size(); i++) {// 要强制转换:因为get(i)返回的是Object,它没有getTitle方法System.out.println((i + 1) + " " + ((Notice) (noticeList.get(i))).getTitle());}System.out.println();//将第二条公告改为:Java在线编辑器可以使用了!not4.setTitle("Java在线编辑器可以使用了");// 显示公告System.out.println("修改后公告内容为:");for (int i = 0; i < noticeList.size(); i++) {// 要强制转换:因为get(i)返回的是Object,它没有getTitle方法System.out.println((i + 1) + " " + ((Notice) (noticeList.get(i))).getTitle());}System.out.println();}}
输出:
公告内容为:
1 欢迎学习Java!
2 请按时提交作业!
3 考勤通知!修改后公告内容为:
1 欢迎学习Java!
2 在线编辑器可以使用了
3 考勤通知!修改后公告内容为:
1 欢迎学习Java!
2 Java在线编辑器可以使用了
3 考勤通知!
Set概述
Set
是元素无序且不可重复的集合,称为集HashSet
:是Set
的一个重要实现类,称为哈希集,具有良好的存取和查找性能,底层是HashMap
案例:在Set中操作String
用HashSet存储多个表示颜色的英文单词,并输出。
关于迭代器 Iterator
- Iterator接口可以以统一的方式对各种集合元素进行遍历
- 有两个重要的方法:
HasNext()
和next()
HasNext()
:检测集合中是否还有下一个元素next()
:返回集合中的下一个元素
由样例可见:set的插入是无序的,且不可重复。
public class SetDemo1 {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("whilte");// 显示输出System.out.println("集合中的元素为:");Iterator it = set.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}System.out.println();// 在集合中插入新的单词set.add("green");// 再显示输出System.out.println("插入元素后集合中的元素为:");it = set.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}System.out.println();// 重复插入set.add("green");// 再显示输出System.out.println("插入重复元素后的集合中的元素为:");it = set.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}// 插入失败,但是不会报错}}
输出:
集合中的元素为:
red blue black yellow whilte
插入元素后集合中的元素为:
red green blue black yellow whilte
插入重复元素后的集合中的元素为:
red green blue black yellow whilte
案例:宠物猫信息管理——在HashSet中对自定义对象的操作
需求:
- 添加和显示宠物猫的信息
- 查找某只宠物猫的信息并输出
- 修改宠物猫的信息
- 删除宠物猫的信息
即:增删查改。
宠物猫属性:
- 名字 name
- 年龄 month
- 品种 species
宠物猫方法:
- 构造方法
- Getter Setter 方法
- 其他方法
重写toString
,hashCode
,equals
方法可以这样:
增
没有重写hashCode
和equals
方法的情况:
宠物猫类:
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;}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;}// 重写toString方法@Overridepublic String toString() {return "[姓名=" + name + ", 年龄=" + month + ", 品种=" + species + "]";}}
测试类:
public class CatTest {public static void main(String[] args) {// 定义宠物猫对象Cat cat1 = new Cat("花花", 1, "狸花");Cat cat2 = new Cat("草草", 2, "英短");// 将宠物猫对象放到HashSet中Set set = new HashSet();set.add(cat1);set.add(cat2);// 显示System.out.println("显示输出:");Iterator it = set.iterator();while (it.hasNext()) {System.out.println(((Cat) (it.next())).toString());}System.out.println();// 添加重复数据Cat cat3 = new Cat("花花", 1, "狸花");set.add(cat3);// 显示System.out.println("插入重复的猫后显示输出:");it = set.iterator();while (it.hasNext()) {System.out.println(((Cat) (it.next())).toString());}System.out.println();//发现插入成功}}
输出:插入成功
显示输出:
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=草草, 年龄=2, 品种=英短]插入重复的猫后显示输出:
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=草草, 年龄=2, 品种=英短]
重写了hashCode
和equals
方法的情况:
// 重写HashCode@Overridepublic int hashCode() {return Objects.hash(month, name, species);}// 重写equals@Overridepublic boolean equals(Object obj) {// 对象相等返回trueif (this == obj)return true;// 比较内容if (obj.getClass() == Cat.class) {Cat cat = (Cat) obj;return cat.getName().equals(name) && cat.getMonth() == month && cat.getSpecies().equals(species);}return false;}
测试输出:插入失败
显示输出:
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=草草, 年龄=2, 品种=英短]插入重复的猫后显示输出:
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=草草, 年龄=2, 品种=英短]
显然,重写后的才符合HashSet的要求。
查
测试类添加代码如下:
// 在集合中查找草草的信息并输出// 通过对象查找if (set.contains(cat2)) {System.out.println("草草找到了!");System.out.println(cat2);} else {System.out.println("草草没找到!");}// 通过名字查找it = set.iterator();boolean flag = false;Cat temp;while (it.hasNext()) {temp = (Cat) (it.next());if (temp.getName().equals("草草")) {System.out.println("草草找到了!");System.out.println(temp);flag = true;break;}}if (flag == false) {System.out.println("草草没找到!");}}
输出:
草草找到了!
[姓名=草草, 年龄=2, 品种=英短]
草草找到了!
[姓名=草草, 年龄=2, 品种=英短]
删
看这一句代码:temp = (Cat) (it.next());
由于next
方法取出的是Object
类型,而我们需要的是Cat类型——我们就要进行强制转换,这里由于我们知道其实这个temp是Cat类型的所以可以强制转换。但如果不是,就会报错。如,我们把代码改成:String temp = (String) (it.next());
,则会:
这是一种隐患:编译时不会报错,运行时才会。
解决方法:泛型。
把代码改成:
Set<Cat> set = new HashSet<Cat>();
...
Iterator<Cat> it = set.iterator();
...
temp = it.next();//这里不用强制类型转换了
这样,如果出现String temp = (String) (it.next());
的代码,就会报错。
删除代码:使用增强型for循环
// 删除草草2的信息并输出
// for (Cat cat : set) 增强型for循环
for (Cat cat : set) {if ("草草2".equals(cat.getName())) {set.remove(cat);break;//注意,这里只有一个满足条件的猫}
}// 输出查看
System.out.println("删除后的信息输出:");
for (Cat cat : set) {System.out.println(cat);
}
输出:
删除后的信息输出:
[姓名=花花, 年龄=1, 品种=狸花]
[姓名=草草, 年龄=2, 品种=英短]
删除成功!
删除集合所有猫的方法:removeAll()
判断集合是否为空的方法:isEmpty()
如果有多种满足删除要求的猫,我们可以这样:new一个新的set1,把满足要求的猫add进去,然后set.removeAll(set1)即可。
Map概述
Map
中的数据是以键值对key-value
的形式存储的key-value
以Entry
类型的对象实例存在- 可以通过
key
值快速查找value
- 一个映射不能包含重复的键:
key
唯一 - 每个键只能映射到一个值
HashMap
- 基于哈希表的Map接口的实现
- 允许使用
null
值和null
键 HashMap
中的Entry
对象是无序排列的
Map
接口的常用方法:(详情请见文档,这里只是大致提一下)
clear
:清空entrySet
:返回键值对的所有信息get
:通过key取得对应valuekeySet
:取出所有key的值put
:相当于set的addremove
:移除参数为key的值values
:返回值
HashMap
类的构造方法:
HashMap
类的常用方法:
clear
entrySet
get
isEmpty
keySet
put
remove
size
values
案例:在Map中操作String
需求:完成一个类似字典的功能
- 将单词以及单词的注释存储到HashMap中
- 显示HashMap的内容
- 查找某单词的注释并显示
添加和显示
输入为:
dog
狗
cat
猫
bird
鸟
代码:
public class DicDemo {public static void main(String[] args) {Map<String, String> animal = new HashMap<String, String>();// 存储/** dog-狗 cat-猫 bird-鸟*/System.out.println("请输入三组单词的注释,并存放到HashMap中");Scanner console = new Scanner(System.in);for (int i = 0; i < 3; i++) {String key = console.next();String value = console.next();animal.put(key, value);}// 显示value的值:无序,因此输出顺序与输入顺序不一致System.out.println("显示value的内容");Iterator<String> it = animal.values().iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}System.out.println();// 显示key和value的值Set<Entry<String, String>> entrySet = animal.entrySet();for (Entry<String, String> e : entrySet) {System.out.println(e.getKey() + "——" + e.getValue());}}}
输出:
显示value的内容
猫 鸟 狗
cat——猫
bird——鸟
dog——狗
查找
代码:
// 通过单词找到注释并输出:KeySet
String strSearch = console.next();
// 1.取得keySet
Set<String> ks = animal.keySet();
// 2.遍历ks
for (String key : ks) {if (key.equals(strSearch)) {System.out.println("找到啦:" + animal.get(key));break;}
}
输入:dog
输出:找到啦:狗
案例:商品信息管理
需求:使用HashMap对商品信息进行管理
- key是商品编号,value是商品对象
- 对HashMap中的商品进行增删查改
商品类:
属性:
- 商品编号:id
- 商品名称:name
- 商品价格:price
方法:
- 构造方法
- Getter Setter
- 其他方法
商品Goods
类:
public class Goods {private String id;private String name;private double price;public Goods(String id, String name, double price) {super();this.id = id;this.name = name;this.price = price;}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;}@Overridepublic String toString() {return "[商品编号=" + id + ", 商品名字=" + name + ", 商品价格=" + price + "]";}}
测试类:
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("请输入三条商品信息:");for (int i = 0; i < 3; i++) {System.out.println("请输入商品编号:");String id = console.next();while (goodsMap.containsKey(id)) {System.out.println("该商品编号已经存在,请重新输入!");id = console.next();}System.out.println("请输入商品名字:");String name = console.next();System.out.println("请输入商品价格:");double price = console.nextDouble();Goods goods = new Goods(id, name, price);goodsMap.put(id, goods);}// 遍历MapSystem.out.println("显示商品信息:");Iterator<Goods> it = goodsMap.values().iterator();while (it.hasNext()) {System.out.println(it.next().toString());}System.out.println();}
}
输入:
s01
冰箱
5000
s02
手机
2000
s03
电脑
5000
输出:
显示商品信息:
[商品编号=s02, 商品名字=手机, 商品价格=2000.0]
[商品编号=s01, 商品名字=冰箱, 商品价格=5000.0]
[商品编号=s03, 商品名字=电脑, 商品价格=5000.0]
总结
ArrayList
- 底层由数组实现
- 元素有序且重复
- 可以动态增长,以满足应用程序的需求
- 元素值可以为
null
HashSet
- 元素无序且不可重复
- 只允许一个
null
元素
HashMap
- 键不能重复
- 允许使用
null
值和null
键 HashMap
中的Entry
对象是无序排列的
Iterator迭代器
Iterator接口以统一的方式对各种集合元素进行遍历。
Iterator<String> it = set.iterator();
while (it.hasNext()) {System.out.println(it.next().toString());
}
hashCode
public int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());result = prime * result + ((species == null) ? 0 : species.hashCode());return result;}
equals
// 重写equals@Overridepublic boolean equals(Object obj) {// 对象相等返回trueif (this == obj)return true;// 比较内容if (obj.getClass() == Cat.class) {Cat cat = (Cat) obj;return cat.getName().equals(name) && cat.getMonth() == month && cat.getSpecies().equals(species);}return false;}
【从零开始的Java开发】1-5-4 ArrayList、HashSet、HashMap 概述与案例相关推荐
- 写给java初学者,从零开始学习java开发的完整学习路线
要问编程王者是谁?自然是非java莫属!发展了20多年,学习java的人络绎不绝.不管是有计算机基础还是没有基础,都想学习这门前途无量的技术.这时候有人担心了,零基础该怎么学java呢?会不会困难重重 ...
- 热门Java开发工具IDEA入门指南——IntelliJ IDEA概述(下)
IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手.代码自动提示.重构.JavaEE支持.各类版本工具(git.sv ...
- 从零开始搭建Java开发环境第四篇:精选IDEA中十大提高开发效率的插件!
Lombok 知名的插件,无需再写那么多冗余的get/set代码 JRebel 热部署插件 alibaba java coding guide 阿里巴巴代码规范插件,自动检查代码规范问题 ![在这里插 ...
- 【从零开始的Java开发】1-4-3 多态:概念、实现、向上转型、向下转型、instanceof、类型转换、抽象类、抽象方法
文章目录 概念 程序中的继承的实现 向上转型 向下转型 instanceof 运算符 类型转换案例 需求1 需求2 总结 抽象 抽象类 抽象方法 总结 总结 多态,即多种形态.我们可以认为,封装和继承 ...
- java开发安装mysql_从零开始搭建Java开发环境第二篇:如何在windows10里安装MySQL
1 下载安装包 1.1 压缩包 [外链图片转存失败(img-oesO8K09-1566652568838)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAA ...
- 【从零开始的Java开发】2-9-3 油画商城静态网页案例
文章目录 项目展示 项目: 0.准备工作 1.页眉区的制作 1-1.logo和menu位置的摆放 1-2.menu功能的实现 1-3.menu功能的样式 1-4.登录与注册 1-5.小结 2.正文区的 ...
- Java当中迭代器的使用(遍历容器ArrayList, HashSet,HashMap)
一:引言 关于entry 的解释代码有注释,觉得挺重要. 二:上码 package cn.wyj.two;import java.util.*; import java.util.Map.Entry; ...
- java开发秒杀脚本,解密秒杀软件 | JavaScript最佳入门案例
网上购物变得的越来普遍,各种"秒杀"抢购的活动越来越多,除了早年雷布斯的"饥饿营销",大多数秒杀活动还是有货源的,我们秒不到货,大多是因为我们败给了计算机脚本. ...
- 唯品会Java开发手册
<唯品会Java开发手册>1.0.2版 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经验,参考& ...
最新文章
- 带你3分钟学Python变量和数据类型
- 想让论文能发表,应该星期几投稿?丨SCI研究
- MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题
- 教你如何在面试中用「10分钟快速分析」一款产品
- 边缘化搭建DotNet Core 2.1 自动化构建和部署环境(上)
- C++ Primer 有感(new和delete表达式)
- 前端请求接口post_接口自动化测试-WEB资讯专栏-DMOZ中文网站分类目录
- Shiro————核心设计思想
- 20200210:(leetcode 623)在二叉树中增加一行
- spring ioc控制反转
- 黑群晖linux删除文件夹命令,不拆机直接修改黑群晖的SN和MAC
- 宝塔/Linux下自动更新maccms到github原版的最新版
- [mooc]open course on github
- 网狐荣耀微星棋牌系列搭建教程
- 协方差、相关系数(Pearson 相关系数)
- vue 使用tracking.js开发人脸识别功能
- cad快看_星期日来啦!分享5个珍藏已久的电影网站,各种大片免费看
- 使用fit函数时,报错KeyError: ‘squared_error‘
- 浏览器端反爬虫特征收集之字体检测
- WPS Excel表格条件格式在哪如何使用以大于500的数字飘红加粗为例
热门文章
- html字体样式(2)
- 利用Python进行股票交易分析(三):A股量化交易策略的验证及数据分析。
- ‘数据分析实战’——战略分析案例(某购物商城分析案例)
- Java 8中 直接通过List进行分组求和
- 崩坏3九游服务器稳定吗,崩坏3:大佬亲身经历告诉你,玩崩坏3到底该不该压等级!...
- 万豪 数据泄露 sql注入_如何防止数据库泄漏和注入
- 艺展中心七夕游园雅集,梦回长安品古韵
- 蒙特卡罗(Monte Carlo)方法计算圆周率π
- 有话费但是上网显示无法连接服务器失败,【10元话费,5GB流量】宽带故障不要怕,教你一招来解决!...
- java做的桌面应用_把一个java web应用包装成桌面应用的简单做法