我在上海乐字节学习Java的第二十天(持续更新中)

84 篇文章 0 订阅
66 篇文章 0 订阅

Java集合(上)

Java中的集合是工具类,可以存储任意数量的具有共同属性的对象

为什么使用集合,而不用数组呢?
– 存储20名学生信息(数组)
– 存储商品信息(集合)

应用场景

无法预测存储数据的数量

同时存储具有一对一关系的数据

需要进行数据的增删

数据重复问题

Java集合框架体系结构
在这里插入图片描述
List(列表)
List 是元素有序并且可以重复的集合,称为序列

List 可以精确的控制每个元素的插入位置,或删除某个位置的元素

List 的两个主要实现类是 ArrayList 和 LinkedList

ArrayList
ArrayList 底层是由数组实现的

动态增长,以满足应用程序的需求

在列表尾部插入或删除非常有效

更适合查找和更新元素

ArrayList 中的元素可以为 null

集合是属于 java.util 包的(想要具体了解可以查找API文档,下面我全部列举)
Collection

在这里插入图片描述
List

在这里插入图片描述
ArrayList

在这里插入图片描述

在这里插入图片描述
案例一
用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)+",");

}

}

}

在内存中的存储方法

在这里插入图片描述
运行结果

在这里插入图片描述
案例二(公告管理)
需求
– 公告的添加和显示
– 在指定位置处插入公告
– 删除公告
– 修改公告

公告类属性
– 编号 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 两个接口

构造方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
案例一:使用 LinkedList 对字符串进行管理
package com.sh.set;

import java.util.LinkedList;

public class LinkedListDemo1 {

public static void main(String[] args) {

LinkedList list = new LinkedList();

//向链表添加数据

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 stuList = new LinkedList();

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

在这里插入图片描述

HashSet

在这里插入图片描述
Iterator(迭代器)
Iterator 接口可以以统一的方式对各种集合元素进行遍历

hasNext() 方法检测集合中是否还有下一个元素

next() 方法返回集合中的下一个元素

在这里插入图片描述
迭代器遍历流程
–实现方法 for 循环和while 循环

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
案例一
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 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
在这里插入图片描述

哈希表和普通存储序列 (哈希表可以提高数据查找速度)

在这里插入图片描述
哈希表分三个(多个)区域来存放数据,什么数据放到哪个区域 有一的规则(hashCode)

在这里插入图片描述

在这里插入图片描述
判断属于哪个区域用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 set = new HashSet();

set.add(huahua);

set.add(fanfan);

// 显示宠物猫信息

Iterator 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©;

} 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(“猫还在。。。”);

}

}

}

运行截图

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值