Java学习笔记之集合1
0x00 概述
本文涉及Java知识点为集合,包括Collection集合,List集合,数组和队列结构,List集合的实现类
0x01 Collection集合
1.1 集合体系结构
- 集合类的特点
提供一种存储空间可变的存储模型,存储的数据内容可以随时发生改变
- 集合类的体系图
1.2 Collection集合概述和基本使用
- Collection集合概述
是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现
- Collection集合基本使用
package com.CollectionTest1; import java.util.ArrayList; import java.util.Collection; public class CollectionDemo1 { public static void main(String[] args) { // 创建Collection集合的对象 Collection<String> c = new ArrayList<String>(); // 添加元素:boolean add(E e) c.add("hello"); c.add("world"); c.add("java"); // 输出集合对象 System.out.println(c); } }
1.3 Collection集合的常用方法
1.4 Collection集合的遍历
- 迭代器的介绍
迭代器,集合的专用遍历方式
Iterator iterator(): 返回此集合中元素的迭代器,通过集合的iterator()方法得到
迭代器是通过集合的iterator()方法得到的,所以他们说它是依赖于集合而存在的
- Collection集合的遍历
package com.CollectionTest1; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class IteratorDemo { public static void main(String[] args) { // 创建集合对象 Collection<String> c = new ArrayList<>(); // 添加元素 c.add("hello"); c.add("world"); c.add("java"); c.add("javaee"); // Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合的Iterator()方法得到 Iterator<String> it = c.iterator(); // 用while循环改进元素的判断和获取 while (it.hasNext()) { String s = it.next(); System.out.println(s); } } }
1.5 集合使用步骤图解
1.6 集合的案例-Collection集合存储学习
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
示例
package com.CollectionTest2; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.CollectionTest2; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class CollectionDemo2 { public static void main(String[] args) { // 创建Collection集合对象 Collection<Student> c = new ArrayList<Student>(); // 创建学生对象 Student s1 = new Student("Alice", 12); Student s2 = new Student("Bob", 13); Student s3 = new Student("Charlie", 14); // 把学生添加到集合 c.add(s1); c.add(s2); c.add(s3); // 遍历集合(迭代器方式) Iterator<Student> it = c.iterator(); while (it.hasNext()) { Student s = it.next(); System.out.println(s.getName() + ", " + s.getAge()); } } }
0x02 List集合
2.1 List集合概述和特点
- List集合概述
有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
与Set集合不同,列表通常允许重复的元素
- List集合特点
有索引
可以存储重复元素
元素存取有序
2.2 List集合的特有方法
2.3 集合的案例-List集合存储学生对象并遍历
需求:创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
示例
package com.ListTest1; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.ListTest1; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListDemo { public static void main(String[] args) { // 创建List集合对象 List<Student> list = new ArrayList<Student>(); // 创建学生对象 Student s1 = new Student("Alice", 13); Student s2 = new Student("Bob", 14); Student s3 = new Student("Charlie", 13); // 把学生添加到集合 list.add(s1); list.add(s2); list.add(s3); // 迭代器方式 Iterator<Student> it = list.iterator(); while (it.hasNext()) { Student s = it.next(); System.out.println(s.getName() + ", " + s.getAge()); } System.out.println("------------"); for (int i = 0; i < list.size(); i++) { Student s = list.get(i); System.out.println(s.getName() + ", " + s.getAge()); } } }
2.4 并发修改异常
- 出现原因
迭代器遍历的过程中,通过结合对象修改了集合中的元素,造成了迭代器获取元素中判断预期修改值和实际修改值不一致,则会出现ConcurrentModificationException
- 解决方案
用for遍历循环,然后用集合对象做对应的操作即可
示例
package com.ListDemo1; import java.util.ArrayList; import java.util.List; public class ListDemo { public static void main(String[] args) { // 创建对象 List<String> list = new ArrayList<String>(); // 添加元素 list.add("hello"); list.add("world"); list.add("java"); // 遍历集合,得到每一个元素,看有没有"world"这个元素,如果有,就添加一个Javaee,请写代码实现 /* Iterator<String> it = list.iterator(); while(it.hasNext()) { String s = it.next(); if(s.equals("world")) { list.add("javaee"); } } */ for (int i = 0; i < list.size(); i++) { String s = list.get(i); if (s.equals("world")) { list.add("javaee"); } } } }
2.5 列表迭代器
- ListIterator介绍
通过List集合的listIterator方法得到,所以说它是List集合特有的迭代器
用于允许程序员沿任一方向遍历的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置
示例
package com.ListDemo1; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIteratorDemo { public static void main(String[] args) { // 创建对象 List<String> list = new ArrayList<String>(); // 添加元素 list.add("hello"); list.add("world"); list.add("java"); // 获取列表迭代器 ListIterator<String> lit = list.listIterator(); while(lit.hasNext()) { String s = lit.next(); if(s.equals("world")) { lit.add("javaee"); } } System.out.println(list); } }
2.6 增强for循环
定义格式
for(元素数据类型 变量名: 数组/集合对象名) { 循环体; }
示例
package com.ListDemo1; import java.util.ArrayList; import java.util.List; public class ForDemo { public static void main(String[] args) { int[] arr = {1, 2, 3, 4}; for (int i : arr) { System.out.print(i); } System.out.println("---------"); String[] strArray = {"hello", "world", "javaee"}; for (String s : strArray) { System.out.println(s); } System.out.println("---------"); List<String> list = new ArrayList<String>(); list.add("hellp"); list.add("world"); list.add("javaee"); for (String s : list) { System.out.println(s); } System.out.println("---------"); } }
2.7 集合的案例-List集合存储学生对抗三种方式遍历
需求:创建一个存储学生对象的合集,存储3个学生对象,使用程序实现在控制台遍历该集合
示例
package com.ListDemo2; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.ListDemo2; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListDemo { public static void main(String[] args) { // 创建List集合对象 List<Student> list = new ArrayList<Student>(); // 创建学生对象 Student s1 = new Student("Alice", 13); Student s2 = new Student("Bob", 14); Student s3 = new Student("Charlie", 14); // 把学生添加到集合 list.add(s1); list.add(s2); list.add(s3); // 迭代器:集合特有的遍历方式 Iterator<Student> it = list.iterator(); while (it.hasNext()) { Student s = it.next(); System.out.println(s.getName() + ", " + s.getAge()); } System.out.println("---------"); // 普通for:带有索引的遍历方式 for (int i = 0; i < list.size(); i++) { Student s = list.get(i); System.out.println(s.getName() + ", " + s.getAge()); } // 增强for:最方便的遍历方式 for (Student s : list) { System.out.println(s.getName() + ", " + s.getAge()); } } }
0x03 数据结构
3.1 数据结构之栈和队列
- 栈结构
先进后出
- 队列结构
先进先出
3.2 数据结构之数组和链表
- 数组结构
查询快,增删满
- 队列结构
查询慢,增删快
0x04 List集合的实现类
4.1 List集合子类的特点
- ArrayList集合
底层是数据结构实现,查询快,增删慢
- LinkedList集合
底层是链表结构实现,查询慢,增删快
4.2 集合的案例-ArrayList集合存储学生对象三种方式遍历
package com.ArrayList01; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.ArrayList01; import java.util.ArrayList; import java.util.Iterator; public class ArrayListDemo { public static void main(String[] args) { // 创建ArrayList集合对象 ArrayList<Student> array = new ArrayList<Student>(); // 创建学生对象 Student s1 = new Student("Alice", 12); Student s2 = new Student("Bob", 13); Student s3 = new Student("Charlie", 14); // 把学生添加到集合 array.add(s1); array.add(s2); array.add(s3); // 迭代器:集合特有的遍历方式 Iterator<Student> it = array.iterator(); while (it.hasNext()) { Student s = it.next(); System.out.println(s.getName() + ", " + s.getAge()); } System.out.println("----------"); // 普通for:带有索引的遍历方式 for (int i = 0; i < array.size(); i++) { Student s = array.get(i); System.out.println(s.getName() + ", " + s.getAge()); } System.out.println("----------"); // 增强for:最方便的遍历方式 for (Student s : array) { System.out.println(s.getName() + ", " + s.getAge()); } } }
4.3 LinkedList集合的特有功能
特有方法: