Java集合(上)
Java中的集合是工具类,可以存储任意数量的具有共同属性的对象
为什么使用集合,而不用数组呢?
– 存储20名学生信息(数组)
– 存储商品信息(集合)
应用场景
无法预测存储数据的数量
同时存储具有一对一关系的数据
需要进行数据的增删
数据重复问题
Java集合框架体系结构
List(列表)
List 是元素有序并且可以重复的集合,称为序列
List 可以精确的控制每个元素的插入位置,或删除某个位置的元素
List 的两个主要实现类是 ArrayList 和 LinkedList
ArrayList
ArrayList 底层是由数组实现的
动态增长,以满足应用程序的需求
在列表尾部插入或删除非常有效
更适合查找和更新元素
ArrayList 中的元素可以为 null
集合是属于 java.util 包的(想要具体了解可以查找API文档,下面我全部列举)
Collection
![](http://tiebapic.baidu.com/forum/w%3D580/sign=89b7b0796cf40ad115e4c7eb672d1151/51c5642762d0f7031243129d1ffa513d2497c5d1.jpg?tbpicau=2025-02-27-05_d68b2c570e7aeeb8d7b10a2e3773138a)
List
![](http://tiebapic.baidu.com/forum/w%3D580/sign=efcaafe41d7b02080cc93fe952d8f25f/ca09aeec8a136327e31c4572868fa0ec0afac7d1.jpg?tbpicau=2025-02-27-05_23deba3c6a089b627a51a4256bbfbce8)
ArrayList
![](http://tiebapic.baidu.com/forum/w%3D580/sign=ccc4dc770a950a7b75354ecc3ad0625c/8cfa16dfa9ec8a13e3ebd0a1e003918fa2ecc0d1.jpg?tbpicau=2025-02-27-05_d393b65f3a7ec831facc98fcdbaddb53)
案例一
用ArrayList存储编程语言的名称,并输出
名称包括“ Java” 、“C”、“C++”、“Go” 和 “Swift”
具体用到了 add()、size()、remove(int index)、remove(Object o) 方法
package com.sh.set;
import java.util.ArrayList;
import java.util.List;
public class ListDemo1 {
public static void main(String[] args) {
// 用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)+",");
}
}
}
在内存中的存储方法
![](http://tiebapic.baidu.com/forum/w%3D580/sign=d6cdfe7979061d957d4637304bf50a5d/2905502c11dfa9ecf5dfd15675d0f703938fc1d1.jpg?tbpicau=2025-02-27-05_6d91100abcc5a75971c0ae383a2a5c0a)
运行结果
案例二(公告管理)
需求
– 公告的添加和显示
– 在指定位置处插入公告
– 删除公告
– 修改公告
公告类属性
– 编号 id
– 标题 title
– 创建人 creator
– 创建时间 createTime
公告类方法
–构造方法
–获取和设置属性值的方法
所用方法
– add(int index, E element) 在列表的指定位置插入指定元素
– remove(int index) 移除列表中指定位置的元素
– set(int index, E element) 用指定元素替换列表中指定位置的元素
package com.sh.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.sh.set;
import java.util.ArrayList;
import java.util.Date;
public class NoticeTest {
public static void main(String[] args) {
// 创建Notice类的对象,生成三条公告
Notice notice1 = new Notice(1, "欢迎来到学习网!", "管理员", 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());
}
System.out.println("时间:"+((Notice)(noticeList.get(1))).getCreateTime());
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());
}
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());
}
//将第二条公告改为: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());
}
}
}
运行结果
LinkedList
与 ArrayList 一样,LinkedList 也按照索引位置排序,但它的元素之间是双向链接的
适合快速地插入和删除元素
LinkedList 实现 List 和 Queue 两个接口
构造方法
![](http://tiebapic.baidu.com/forum/w%3D580/sign=8c1dd0a8e5d3572c66e29cd4ba126352/2cd5968fa0ec08fad7f194e64eee3d6d57fbdad1.jpg?tbpicau=2025-02-27-05_55cf8957dcaeb26b893a21a063c1d9d4)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=22203862742762d0803ea4b790ed0849/fd415eee3d6d55fb3937f1677a224f4a22a4ddd1.jpg?tbpicau=2025-02-27-05_db4bf1dff39e30375eab727947e42c69)
案例一:使用 LinkedList 对字符串进行管理
package com.sh.set;
import java.util.LinkedList;
public class LinkedListDemo1 {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
//向链表添加数据
list.add("apple");
list.add("pear");
//将数据添加到链表的开始
list.addFirst("banana");
//将数据添加到链表的末尾
list.addLast("grape");
//在指定位置处添加数据,第一个参数为index值,从0开始
list.add(2, "orange");
//显示链表中的所有数据
System.out.println(list);
//判断列表中是否包含指定的元素,并输出相应的结果
boolean flag = list.contains("grape");
if (flag) {
System.out.println("grape找到了!");
} else {
System.out.println("grape没找到!");
}
//返回index值为3的数据并输出
System.out.println("index值为3的数据为:" + list.get(3));
//返回第一个元素
System.out.println("第一个元素为:" + list.getFirst());
//返回最后一个元素
System.out.println("最后一个元素为:" + list.getLast());
}
}
运行结果
案例二:使用 LinkedList 对自定义类进行管理
\\Student类
package com.sh.set;
public class Student {
private String stuNum;
private String stuName;
private int age;
public Student(String stuNum, String stuName, int age) {
this.stuNum = stuNum;
this.stuName = stuName;
this.age = age;
}
public String getStuNum() {
return stuNum;
}
public void setStuNum(String stuNum) {
this.stuNum = stuNum;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return " [学号:" + stuNum + ", 姓名:" + stuName + ", 年龄:" + age + "]";
}
}
\\LinkedListDemo2类
package com.sh.set;
import java.util.LinkedList;
public class LinkedListDemo2 {
public static void main(String[] args) {
LinkedList<Student> stuList = new LinkedList<Student>();
Student stu1 = new Student("001", "Mike", 18);
Student stu2 = new Student("002", "Jack", 20);
Student stu3 = new Student("003", "Lucy", 19);
// 将学生添加到链表,使用push完成
// LinkedList实现List接口的同时,也实现了Queue接口
// push和pop就是针对Queue进行添加和取出数据的操作的
stuList.push(stu1);
stuList.push(stu2);
stuList.push(stu3);
System.out.println("链表为:" + stuList);
// 弹出一个元素,这里可以把链表看成一个容器,先加入到链表的数据后弹出,
// 依据的原则是先进后出
System.out.println("弹出的数据为:" + stuList.pop());
System.out.println("调用pop()方法后的链表为:\n" + stuList);
// peek()方法获取并不移除元素
System.out.println("调用peek()方法的数据为:" + stuList.peek());
System.out.println("调用peek()方法后的链表为:\n" + stuList);
// 再次调用pop()方法,发现调用pop()方法后数据从链表中移除了,而peek()方法不会
System.out.println("再次调用pop()方法" + stuList.pop());
System.out.println("再次调用pop()方法后的链表为:\n" + stuList);
// 在链表中再重新添加元素
stuList.push(stu2);
stuList.push(stu3);
System.out.println("再次添加元素后的链表为:\n" + stuList);
// 调用poll()方法
System.out.println("调用poll()方法输出元素" + stuList.poll());
// 调用poll()方法将获取元素的同时从链表中删除了元素
System.out.println("调用poll()方法后的链表为:\n" + stuList);
}
}
运行结果
Set
Set 是元素无序并且不可以重复的集合,被称为集
HashSet
HashSet 是Set 的一个重要实现类,称为哈希集
HashSet 中的元素无序并且不可以重复
HashSet 中只允许一个null元素
具有良好的存取和查找性能
TreeSet(具体可以查看API文档)
Set
![](http://tiebapic.baidu.com/forum/w%3D580/sign=e7e3b5793f381f309e198da199004c67/c6430d7b02087bf4731dd0a8e5d3572c13dfcfd1.jpg?tbpicau=2025-02-27-05_1e0a906ac858c97bf92f04ac16dafe0d)
HashSet
Iterator(迭代器)
Iterator 接口可以以统一的方式对各种集合元素进行遍历
hasNext() 方法检测集合中是否还有下一个元素
next() 方法返回集合中的下一个元素
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f2cd13fa90d6277fe912323018391f63/634fae014c086e066859b80a15087bf408d1cbd1.jpg?tbpicau=2025-02-27-05_4cecf1ed63484fb601a4bd9236b6d13f)
迭代器遍历流程
–实现方法 for 循环和while 循环
![](http://tiebapic.baidu.com/forum/w%3D580/sign=53f4ad41fe24b899de3c79305e071d59/d9de7cf40ad162d9891fe55d06dfa9ec8813cdd1.jpg?tbpicau=2025-02-27-05_ced0313cf6f27ae8bb5df925e3f23407)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f01a950e892f07085f052a08d925b865/97de69061d950a7b75c4c9851dd162d9f0d3c9d1.jpg?tbpicau=2025-02-27-05_4cb982353a77a14dff0463645b461358)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=7a1fe55d06dfa9ecfd2e561f52d1f754/7b3a0ffa513d2697d1228f1c42fbb2fb4116d8d1.jpg?tbpicau=2025-02-27-05_e53b48d421090b247578f714a31632b5)
案例一
HashSet 存储多个表示颜色的英文单词,并输出
单词包括 “blue”、“red”、“black”、" yllow" 和 “white”
使用 add()方法 迭代器Iterator
package com.sh.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() + " ");
}
//for(Iterator<Set> it1=set.iterator();it1.hasNext();) {
// System.out.println(it1.next());
// }
System.out.println();
// 在集合中插入一个新的单词
// set.add("green");
set.add("white");
it = set.iterator();
// 遍历迭代器并输出元素
System.out.println("**************************");
System.out.println("插入重复元素后的输出结果为:");
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
//插入失败,但是不会报错
}
}
案例二(宠物猫信息管理)
需求
– 添加和显示宠物猫信息
– 查找某只宠物猫的信息并输出
– 修改宠物猫的信息
– 删除宠物猫信息
属性
–名字 name
–年龄 month
–品种 species
方法
–构造方法
–获取和设置属性值的方法
–其他方法 hashCode 和 equals
–查找方法
hashCode 和 equals![](http://tiebapic.baidu.com/forum/w%3D580/sign=c6551b705b086e066aa83f4332097b5a/b90ff5d3572c11dfd7203862742762d0f503c2d1.jpg?tbpicau=2025-02-27-05_9bad84d00ecede43555409aa8dee4ccb)
哈希表和普通存储序列 (哈希表可以提高数据查找速度)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=dee0a3aebeec8a13141a57e8c7029157/d32c563d269759eeb4a1e78aa5fb43166f22dfd1.jpg?tbpicau=2025-02-27-05_fca0f1f19bb8f99fac280f6d47104d85)
哈希表分三个(多个)区域来存放数据,什么数据放到哪个区域 有一的规则(hashCode)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=94e80ae8be014c08193b28ad3a7a025b/d10765d9f2d3572c6c131b9d9d13632760d0c3d1.jpg?tbpicau=2025-02-27-05_264b6d680d5bcd64d595de677d9b243d)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=eeebd0a1e003918fd7d13dc2613c264b/e6bb52fbb2fb4316e0eefd3b37a446230bf7d3d1.jpg?tbpicau=2025-02-27-05_f180b3e4435668d8137e927698ed1582)
判断属于哪个区域用hashCode方法
判断某个区域对象是否是我们所要找的,用equals方法
package com.sh.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) {
//判断对象是否相等,相等则返回true,不用继续比较属性了
if(this==obj)
return true;
//判断obj是否是Cat类的对象
if(obj.getClass()==Cat.class){
Cat cat=(Cat)obj;
return cat.getName().equals(name)&&(cat.getMonth()==month)&&(cat.getSpecies().equals(species));
}
return false;
}
}
//测试类
package com.sh.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>();
set.add(huahua);
set.add(fanfan);
// 显示宠物猫信息
Iterator<Cat> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// 再添加一个与花花属性一样的猫
Cat huahua01 = new Cat("花花", 12, "英国短毛猫");
set.add(huahua01);
System.out.println("**********************************");
System.out.println("添加重复数据后的宠物猫信息:");
it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("**********************************");
// 重新插入一个新宠物猫
Cat huahua02 = new Cat("花花二代", 2, "英国短毛猫");
set.add(huahua02);
System.out.println("添加花花二代后的宠物猫信息:");
it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("**********************************");
// 在集合中查找花花的信息并输出
if (set.contains(huahua)) {
System.out.println("花花找到了!");
System.out.println(huahua);
} else {
System.out.println("花花没找到!");
}
// 在集合中使用名字查找花花的信息
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("花花没找到");
}
// 删除花花二代的信息并重新输出
for (Cat cat : set) {
if ("花花二代".equals(cat.getName())) {
set.remove(cat);
break;
}
}
System.out.println("**********************************");
System.out.println("删除花花二代后的数据");
for(Cat cat:set){
System.out.println(cat);
}
//删除集合中的所有宠物猫信息
System.out.println("**********************************");
boolean flag1=set.removeAll(set);
if(set.isEmpty()){
System.out.println("猫都不见了。。。");
}else{
System.out.println("猫还在。。。");
}
}
}
运行截图
![](http://tiebapic.baidu.com/forum/w%3D580/sign=c7d03570b68b87d65042ab1737092860/32f2bf99a9014c081acaafe41d7b020879f4f4d1.jpg?tbpicau=2025-02-27-05_94d7bbba77a743ca4b1f4def774c5ffb)
Java中的集合是工具类,可以存储任意数量的具有共同属性的对象
为什么使用集合,而不用数组呢?
– 存储20名学生信息(数组)
– 存储商品信息(集合)
应用场景
无法预测存储数据的数量
同时存储具有一对一关系的数据
需要进行数据的增删
数据重复问题
Java集合框架体系结构
![](http://tiebapic.baidu.com/forum/w%3D580/sign=9f59b80a15087bf47dec57e1c2d2575e/723a8d13632762d075cf23feb7ec08fa533dc6d1.jpg?tbpicau=2025-02-27-05_c789ffcbd607fe8678268f665a30fb1b)
List 是元素有序并且可以重复的集合,称为序列
List 可以精确的控制每个元素的插入位置,或删除某个位置的元素
List 的两个主要实现类是 ArrayList 和 LinkedList
ArrayList
ArrayList 底层是由数组实现的
动态增长,以满足应用程序的需求
在列表尾部插入或删除非常有效
更适合查找和更新元素
ArrayList 中的元素可以为 null
集合是属于 java.util 包的(想要具体了解可以查找API文档,下面我全部列举)
Collection
![](http://tiebapic.baidu.com/forum/w%3D580/sign=89b7b0796cf40ad115e4c7eb672d1151/51c5642762d0f7031243129d1ffa513d2497c5d1.jpg?tbpicau=2025-02-27-05_d68b2c570e7aeeb8d7b10a2e3773138a)
List
![](http://tiebapic.baidu.com/forum/w%3D580/sign=efcaafe41d7b02080cc93fe952d8f25f/ca09aeec8a136327e31c4572868fa0ec0afac7d1.jpg?tbpicau=2025-02-27-05_23deba3c6a089b627a51a4256bbfbce8)
ArrayList
![](http://tiebapic.baidu.com/forum/w%3D580/sign=ccc4dc770a950a7b75354ecc3ad0625c/8cfa16dfa9ec8a13e3ebd0a1e003918fa2ecc0d1.jpg?tbpicau=2025-02-27-05_d393b65f3a7ec831facc98fcdbaddb53)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=5fb32c5e10082838680ddc1c8898a964/b5d01a950a7b02080338b8a075d9f2d3552cc8d1.jpg?tbpicau=2025-02-27-05_b0b3953c8fa1b01465550d24e3bcd94b)
用ArrayList存储编程语言的名称,并输出
名称包括“ Java” 、“C”、“C++”、“Go” 和 “Swift”
具体用到了 add()、size()、remove(int index)、remove(Object o) 方法
package com.sh.set;
import java.util.ArrayList;
import java.util.List;
public class ListDemo1 {
public static void main(String[] args) {
// 用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)+",");
}
}
}
在内存中的存储方法
![](http://tiebapic.baidu.com/forum/w%3D580/sign=d6cdfe7979061d957d4637304bf50a5d/2905502c11dfa9ecf5dfd15675d0f703938fc1d1.jpg?tbpicau=2025-02-27-05_6d91100abcc5a75971c0ae383a2a5c0a)
运行结果
![](http://tiebapic.baidu.com/forum/w%3D580/sign=06dfd15675d0f703e6b295d438fb5148/82383a6d55fbb2fbcfdadf53584a20a44423dcd1.jpg?tbpicau=2025-02-27-05_51bf977f08aaf27993ae57552c7d2989)
需求
– 公告的添加和显示
– 在指定位置处插入公告
– 删除公告
– 修改公告
公告类属性
– 编号 id
– 标题 title
– 创建人 creator
– 创建时间 createTime
公告类方法
–构造方法
–获取和设置属性值的方法
所用方法
– add(int index, E element) 在列表的指定位置插入指定元素
– remove(int index) 移除列表中指定位置的元素
– set(int index, E element) 用指定元素替换列表中指定位置的元素
package com.sh.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.sh.set;
import java.util.ArrayList;
import java.util.Date;
public class NoticeTest {
public static void main(String[] args) {
// 创建Notice类的对象,生成三条公告
Notice notice1 = new Notice(1, "欢迎来到学习网!", "管理员", 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());
}
System.out.println("时间:"+((Notice)(noticeList.get(1))).getCreateTime());
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());
}
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());
}
//将第二条公告改为: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());
}
}
}
运行结果
LinkedList
与 ArrayList 一样,LinkedList 也按照索引位置排序,但它的元素之间是双向链接的
适合快速地插入和删除元素
LinkedList 实现 List 和 Queue 两个接口
构造方法
![](http://tiebapic.baidu.com/forum/w%3D580/sign=8c1dd0a8e5d3572c66e29cd4ba126352/2cd5968fa0ec08fad7f194e64eee3d6d57fbdad1.jpg?tbpicau=2025-02-27-05_55cf8957dcaeb26b893a21a063c1d9d4)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=22203862742762d0803ea4b790ed0849/fd415eee3d6d55fb3937f1677a224f4a22a4ddd1.jpg?tbpicau=2025-02-27-05_db4bf1dff39e30375eab727947e42c69)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=fe38b8a075d9f2d3201124e799ed8a53/b906f003918fa0ec8d36e34c319759ee3f6ddbd1.jpg?tbpicau=2025-02-27-05_d1cc8d3a4f9f31d216590d6c10c662da)
package com.sh.set;
import java.util.LinkedList;
public class LinkedListDemo1 {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
//向链表添加数据
list.add("apple");
list.add("pear");
//将数据添加到链表的开始
list.addFirst("banana");
//将数据添加到链表的末尾
list.addLast("grape");
//在指定位置处添加数据,第一个参数为index值,从0开始
list.add(2, "orange");
//显示链表中的所有数据
System.out.println(list);
//判断列表中是否包含指定的元素,并输出相应的结果
boolean flag = list.contains("grape");
if (flag) {
System.out.println("grape找到了!");
} else {
System.out.println("grape没找到!");
}
//返回index值为3的数据并输出
System.out.println("index值为3的数据为:" + list.get(3));
//返回第一个元素
System.out.println("第一个元素为:" + list.getFirst());
//返回最后一个元素
System.out.println("最后一个元素为:" + list.getLast());
}
}
运行结果
![](http://tiebapic.baidu.com/forum/w%3D580/sign=9b131b9d9d13632715edc23ba18ea056/8aeb219759ee3d6ddf37008a54166d224d4aded1.jpg?tbpicau=2025-02-27-05_cfa57b2860a0f30e59d58303607b0421)
\\Student类
package com.sh.set;
public class Student {
private String stuNum;
private String stuName;
private int age;
public Student(String stuNum, String stuName, int age) {
this.stuNum = stuNum;
this.stuName = stuName;
this.age = age;
}
public String getStuNum() {
return stuNum;
}
public void setStuNum(String stuNum) {
this.stuNum = stuNum;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return " [学号:" + stuNum + ", 姓名:" + stuName + ", 年龄:" + age + "]";
}
}
\\LinkedListDemo2类
package com.sh.set;
import java.util.LinkedList;
public class LinkedListDemo2 {
public static void main(String[] args) {
LinkedList<Student> stuList = new LinkedList<Student>();
Student stu1 = new Student("001", "Mike", 18);
Student stu2 = new Student("002", "Jack", 20);
Student stu3 = new Student("003", "Lucy", 19);
// 将学生添加到链表,使用push完成
// LinkedList实现List接口的同时,也实现了Queue接口
// push和pop就是针对Queue进行添加和取出数据的操作的
stuList.push(stu1);
stuList.push(stu2);
stuList.push(stu3);
System.out.println("链表为:" + stuList);
// 弹出一个元素,这里可以把链表看成一个容器,先加入到链表的数据后弹出,
// 依据的原则是先进后出
System.out.println("弹出的数据为:" + stuList.pop());
System.out.println("调用pop()方法后的链表为:\n" + stuList);
// peek()方法获取并不移除元素
System.out.println("调用peek()方法的数据为:" + stuList.peek());
System.out.println("调用peek()方法后的链表为:\n" + stuList);
// 再次调用pop()方法,发现调用pop()方法后数据从链表中移除了,而peek()方法不会
System.out.println("再次调用pop()方法" + stuList.pop());
System.out.println("再次调用pop()方法后的链表为:\n" + stuList);
// 在链表中再重新添加元素
stuList.push(stu2);
stuList.push(stu3);
System.out.println("再次添加元素后的链表为:\n" + stuList);
// 调用poll()方法
System.out.println("调用poll()方法输出元素" + stuList.poll());
// 调用poll()方法将获取元素的同时从链表中删除了元素
System.out.println("调用poll()方法后的链表为:\n" + stuList);
}
}
运行结果
![](http://tiebapic.baidu.com/forum/w%3D580/sign=d74735a7307f9e2f70351d002f31e962/72d74b086e061d957cb7b0796cf40ad160d9cad1.jpg?tbpicau=2025-02-27-05_a687120cad4f48010a3c7eda66ddf157)
Set 是元素无序并且不可以重复的集合,被称为集
HashSet
HashSet 是Set 的一个重要实现类,称为哈希集
HashSet 中的元素无序并且不可以重复
HashSet 中只允许一个null元素
具有良好的存取和查找性能
TreeSet(具体可以查看API文档)
Set
![](http://tiebapic.baidu.com/forum/w%3D580/sign=e7e3b5793f381f309e198da199004c67/c6430d7b02087bf4731dd0a8e5d3572c13dfcfd1.jpg?tbpicau=2025-02-27-05_1e0a906ac858c97bf92f04ac16dafe0d)
HashSet
![](http://tiebapic.baidu.com/forum/w%3D580/sign=e51540a2402c11dfded1bf2b53266255/4a59a7ec08fa513da15beb9f2a6d55fbb0fbd9d1.jpg?tbpicau=2025-02-27-05_71868e6b490a916a67146c88987d5a71)
Iterator 接口可以以统一的方式对各种集合元素进行遍历
hasNext() 方法检测集合中是否还有下一个元素
next() 方法返回集合中的下一个元素
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f2cd13fa90d6277fe912323018391f63/634fae014c086e066859b80a15087bf408d1cbd1.jpg?tbpicau=2025-02-27-05_4cecf1ed63484fb601a4bd9236b6d13f)
迭代器遍历流程
–实现方法 for 循环和while 循环
![](http://tiebapic.baidu.com/forum/w%3D580/sign=53f4ad41fe24b899de3c79305e071d59/d9de7cf40ad162d9891fe55d06dfa9ec8813cdd1.jpg?tbpicau=2025-02-27-05_ced0313cf6f27ae8bb5df925e3f23407)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f01a950e892f07085f052a08d925b865/97de69061d950a7b75c4c9851dd162d9f0d3c9d1.jpg?tbpicau=2025-02-27-05_4cb982353a77a14dff0463645b461358)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=7a1fe55d06dfa9ecfd2e561f52d1f754/7b3a0ffa513d2697d1228f1c42fbb2fb4116d8d1.jpg?tbpicau=2025-02-27-05_e53b48d421090b247578f714a31632b5)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=63fc5b55af99a9013b355b3e2d940a58/a0220dd162d9f2d32be0a3aebeec8a136127ccd1.jpg?tbpicau=2025-02-27-05_62126bc2cd7e0a225d19f3f9ee90c16c)
HashSet 存储多个表示颜色的英文单词,并输出
单词包括 “blue”、“red”、“black”、" yllow" 和 “white”
使用 add()方法 迭代器Iterator
package com.sh.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() + " ");
}
//for(Iterator<Set> it1=set.iterator();it1.hasNext();) {
// System.out.println(it1.next());
// }
System.out.println();
// 在集合中插入一个新的单词
// set.add("green");
set.add("white");
it = set.iterator();
// 遍历迭代器并输出元素
System.out.println("**************************");
System.out.println("插入重复元素后的输出结果为:");
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
//插入失败,但是不会报错
}
}
案例二(宠物猫信息管理)
需求
– 添加和显示宠物猫信息
– 查找某只宠物猫的信息并输出
– 修改宠物猫的信息
– 删除宠物猫信息
属性
–名字 name
–年龄 month
–品种 species
方法
–构造方法
–获取和设置属性值的方法
–其他方法 hashCode 和 equals
–查找方法
hashCode 和 equals
![](http://tiebapic.baidu.com/forum/w%3D580/sign=c6551b705b086e066aa83f4332097b5a/b90ff5d3572c11dfd7203862742762d0f503c2d1.jpg?tbpicau=2025-02-27-05_9bad84d00ecede43555409aa8dee4ccb)
哈希表和普通存储序列 (哈希表可以提高数据查找速度)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=dee0a3aebeec8a13141a57e8c7029157/d32c563d269759eeb4a1e78aa5fb43166f22dfd1.jpg?tbpicau=2025-02-27-05_fca0f1f19bb8f99fac280f6d47104d85)
哈希表分三个(多个)区域来存放数据,什么数据放到哪个区域 有一的规则(hashCode)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=94e80ae8be014c08193b28ad3a7a025b/d10765d9f2d3572c6c131b9d9d13632760d0c3d1.jpg?tbpicau=2025-02-27-05_264b6d680d5bcd64d595de677d9b243d)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=eeebd0a1e003918fd7d13dc2613c264b/e6bb52fbb2fb4316e0eefd3b37a446230bf7d3d1.jpg?tbpicau=2025-02-27-05_f180b3e4435668d8137e927698ed1582)
判断属于哪个区域用hashCode方法
判断某个区域对象是否是我们所要找的,用equals方法
package com.sh.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) {
//判断对象是否相等,相等则返回true,不用继续比较属性了
if(this==obj)
return true;
//判断obj是否是Cat类的对象
if(obj.getClass()==Cat.class){
Cat cat=(Cat)obj;
return cat.getName().equals(name)&&(cat.getMonth()==month)&&(cat.getSpecies().equals(species));
}
return false;
}
}
//测试类
package com.sh.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>();
set.add(huahua);
set.add(fanfan);
// 显示宠物猫信息
Iterator<Cat> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// 再添加一个与花花属性一样的猫
Cat huahua01 = new Cat("花花", 12, "英国短毛猫");
set.add(huahua01);
System.out.println("**********************************");
System.out.println("添加重复数据后的宠物猫信息:");
it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("**********************************");
// 重新插入一个新宠物猫
Cat huahua02 = new Cat("花花二代", 2, "英国短毛猫");
set.add(huahua02);
System.out.println("添加花花二代后的宠物猫信息:");
it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("**********************************");
// 在集合中查找花花的信息并输出
if (set.contains(huahua)) {
System.out.println("花花找到了!");
System.out.println(huahua);
} else {
System.out.println("花花没找到!");
}
// 在集合中使用名字查找花花的信息
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("花花没找到");
}
// 删除花花二代的信息并重新输出
for (Cat cat : set) {
if ("花花二代".equals(cat.getName())) {
set.remove(cat);
break;
}
}
System.out.println("**********************************");
System.out.println("删除花花二代后的数据");
for(Cat cat:set){
System.out.println(cat);
}
//删除集合中的所有宠物猫信息
System.out.println("**********************************");
boolean flag1=set.removeAll(set);
if(set.isEmpty()){
System.out.println("猫都不见了。。。");
}else{
System.out.println("猫还在。。。");
}
}
}
运行截图
![](http://tiebapic.baidu.com/forum/w%3D580/sign=c7d03570b68b87d65042ab1737092860/32f2bf99a9014c081acaafe41d7b020879f4f4d1.jpg?tbpicau=2025-02-27-05_94d7bbba77a743ca4b1f4def774c5ffb)