当前位置: 首页 > ds >正文

Javase 基础加强 —— 03 集合

本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员Java+AI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。

集合是一种容器,类似于数组,用来存储数据。

在这里插入图片描述

Collection单列集合:每个元素包含一个值

Map双列集合:每个元素包含一对键值对

在这里插入图片描述

01 Collection 集合特点

List系列集合:添加的元素是有序、可重复、有索引的。

  • ArrayList、LinkedList:有序、可重复、有索引

Set系列集合:添加的元素是无序、不重复、无索引的。

  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:默认升序、不重复、无索引

02 Collection 常用功能

在这里插入图片描述

03 Collection 三种遍历方式

① 迭代器遍历

迭代器是用来遍历集合的专用方式,代表为Iterator

在这里插入图片描述

在这里插入图片描述

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class TraversalDemo {public static void main(String[] args) {//迭代器遍历 IteratorCollection<String> names = new ArrayList<>();names.add("张三");names.add("李四");names.add("王五");System.out.println(names);Iterator<String> it = names.iterator();while(it.hasNext()){String ele = it.next(); //先取数,再移位System.out.println(ele);}}
}

在这里插入图片描述

② 增强for循环

在这里插入图片描述

for(String name : names){System.out.println(name);
}

Lambda表达式

names.forEach(s -> System.out.println(s));

04 三种遍历方式的区别

遍历集合的同时又存在增删集合元素的行为时可能出现业务异常,这种现象被称之为并发修改异常问题

需求:

假如购物车中存储了Java入门,宁夏枸杞,黑枸杞,人字拖,特级枸杞,枸杞子,现在用户不买枸杞,选择批量删除。

分析:

ArrayList集合表示购物车,存储商品名称

② 遍历集合,删除包含“枸杞”的数据

③ 输出集合

package CollectionDemo;import java.util.ArrayList;public class Test {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Java入门");list.add("宁夏枸杞");list.add("黑枸杞");list.add("人字拖");list.add("特级枸杞");list.add("枸杞子");System.out.println(list);//正着遍历for(int i=0; i<list.size(); i++){String name = list.get(i);if(name.contains("枸杞")){list.remove(name);i--; //退一步,防止漏掉元素}}System.out.println(list);//反着遍历for(int i=list.size()-1; i>=0; i--){String name = list.get(i);if(name.contains("枸杞")){list.remove(name);}}System.out.println(list);//迭代器遍历Iterator<String> it = names.iterator();while(it.hasNext()){String name = it.next();if(name.contains("枸杞")){it.remove(); //iterator自己方法删除}}System.out.println(list);//注:for循环和lambda都无法解决并发修改异常问题}
}

05 List 集合

在这里插入图片描述

在这里插入图片描述

package CollectionDemo;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("赵六");list.add("钱七");System.out.println(list);list.add(2, "赵敏"); //根据下标插入System.out.println(list);System.out.println(list.remove(1)); //根据下标删除,返回删除数据System.out.println(list);System.out.println(list.set(2, "金毛")); //根据下标修改,返回修改数据System.out.println(list);System.out.println(list.get(0)); //根据下标获取System.out.println("———————————————————四种遍历方法————————————————————");//1.for循环for(int i=0; i<list.size(); i++){System.out.println(list.get(i));}//2.迭代器Iterator<String> it = list.iterator();while(it.hasNext()){System.out.println(it.next());}//3.增强for循环for(String name : list){System.out.println(name);}//4.Lambda表达式list.forEach(name -> System.out.println(name));}
}

06 List 集合底层原理

在这里插入图片描述

ArrayList底层是基于数组存储数据的

LinkedList底层是基于链表存储数据的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

LinkedList新增方法

在这里插入图片描述

LinkedList应用场景之一:设计队列

在这里插入图片描述

LinkedList应用场景之二:设计栈

在这里插入图片描述

package CollectionDemo;import java.util.LinkedList;
import java.util.List;public class LinkedListDemo {public static void main(String[] args) {LinkedList<String> queue = new LinkedList<>();//入队queue.addLast("张三");queue.addLast("李四");queue.addLast("王五");queue.addLast("赵六");System.out.println(queue);//出队queue.removeFirst();queue.removeFirst();System.out.println(queue);System.out.println("*******************************");LinkedList<String> stack = new LinkedList<>();//压栈stack.push("张三");stack.push("李四");stack.push("王五");stack.push("赵六");System.out.println(stack);//弹栈stack.pop();stack.pop();System.out.println(stack);}
}

07 案例:电影信息管理模块

需求:开发一个电影信息管理模块,用户可以上架电影,查询电影下架某部电影,以及下架某个主演参演的全部电影

分析:① 设计电影类,创建电影对象

② 设计电影操作类,创建集合存储所有电影对象

在这里插入图片描述

http://www.xdnf.cn/news/4030.html

相关文章:

  • Room + WorkManager的Android学习总结
  • 2025年DA数智大会大模型与大数据应用实践峰会(脱敏)PPT合集(36份)
  • **面试水货程序员马小帅**
  • 技术部测试规范
  • PyTorch_张量拼接
  • ES6入门---第三单元 模块四:Set和WeakSet
  • SQL手工注入(DVWA)
  • 「Mac畅玩AIGC与多模态17」开发篇13 - 条件判断与分支跳转工作流示例
  • 交互式智能体面临长周期决策和随机环境反馈交互等挑战 以及解决办法
  • 记录一次手动更新英特尔Management Engine固件的经历
  • Python绘制误差棒:深入解析数据的不确定性
  • 文章记单词 | 第62篇(六级)
  • W-TinyLFU缓存驱逐算法解析
  • Maven框架详解:构建与依赖管理的利器
  • 《奇迹世界起源》:宝箱工坊介绍!
  • MyBatis 核心类详解与架构解析:从入门到源码级理解
  • 《前端秘籍:SCSS阴影效果全兼容指南》
  • Linux的系统周期化任务
  • ES类的索引轮换
  • JVM——JVM是怎么实现invokedynamic的?
  • HttpPrinter 是一款功能强大的跨平台 Web 打印解决方案
  • C与指针——结构与联合
  • Feign的原理
  • cesium基础设置
  • xx外卖知识补充
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段(1):语法单词
  • Jetpack Compose 边距终极指南:Margin 和 Padding 的正确处理方式
  • 详细案例,集成算法
  • 高等数学第三章---微分中值定理与导数的应用(3.3泰勒(Taylor)公式)
  • JAVA组织/岗位拉取多段时间属性到一张表上时,时间段分隔问题