本系列为笔者学习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 案例:电影信息管理模块
需求:开发一个电影信息管理模块,用户可以上架电影,查询电影下架某部电影,以及下架某个主演参演的全部电影
分析:① 设计电影类,创建电影对象
② 设计电影操作类,创建集合存储所有电影对象