编程知识 cdmana.com

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

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<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

在这里插入图片描述

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<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

在这里插入图片描述

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

在这里插入图片描述

哈希表分三个(多个)区域来存放数据,什么数据放到哪个区域 有一的规则(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<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("猫还在。。。");

}

}

}

运行截图

在这里插入图片描述

版权声明
本文为[HUIYL1]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000038142063

Scroll to Top