java复习 08
泛型和集合还有点没懂,赶紧学一下!!
1 集合概述
集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
集合类有很多,目前我们先学习一个:ArrayList
ArrayList<E>:
- 可调整大小的数组实现。
- <E>:是一种特殊的数据类型,泛型。
怎么用呢?
在出现 E 的地方我们使用引用数据类型替换即可!
举例:ArrayList<String>,ArrayList<Student>
ArrayList 构造方法和添加方法
方法名 | 说明 |
---|---|
public ArrayList() | 创建一个空的集合对象 |
public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
public void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
package PTA_training.ArrayListTest;import java.util.ArrayList;
public class Main {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("name");arrayList.add("age");// System.out.println(arrayList.add("name"));System.out.println("arrayList" + arrayList);}
}
ArrayList 集合常用方法
方法名 | 说明 |
---|---|
public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中的元素的个数 |
package PTA_training.ArrayListTest;import java.util.ArrayList;
public class Main {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("name");arrayList.add("age");System.out.println(arrayList.set(0,"name"));System.out.println(arrayList.size());
// System.out.println(arrayList.add("name"));System.out.println("arrayList" + arrayList);}
}
集合的遍历
案例:存储字符串并遍历
需求:创建一个存储字符串的集合,存储 3 个字符串元素,使用程序实现在控制台遍历该集合
思路:
① 创建集合对象
② 往集合中添加字符串对象
③ 遍历集合,首先要能够获取到集合中的每一个元素,这个通过 get (int index) 方法实现
④ 遍历集合,其次要能够获取到集合的长度,这个通过 size () 方法实现
⑤ 遍历集合的通用格式
for (int i=0; i < 集合对象.size (); i++){
集合对象.get (i) 就是指定索引处的元素
}
package PTA_training.ArrayListTest;import java.util.ArrayList;
public class Main {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("name");arrayList.add("age");for (int i = 0; i < arrayList.size(); i++) {String s = arrayList.get(i);System.out.println(s);}}
}
// System.out.println("arrayList" + arrayList);
// System.out.println(arrayList.set(0,"name"));
// System.out.println(arrayList.size());
// System.out.println(arrayList.add("name"));
案例:存储学生对象并遍历
需求:创建一个存储学生对象的集合,存储 3 个学生对象,使用程序实现在控制台遍历该集合
学生的姓名和年龄来自于键盘录入~~
思路:
① 定义学生类,为了键盘录入数据方便,把学生类中的成员变量都定义为 String 类型
② 创建集合对象
③ 键盘录入学生对象所需要的数据
④ 创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
⑤ 往集合中添加学生对象
⑥ 遍历集合,采用通用遍历格式实现
public class Student {private String name;private String age;public Student(String name, String age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "Student{name='" + name + "', age='" + age + "'}";}
}
import java.util.ArrayList;
import java.util.Scanner;public class StudentDemo {public static void main(String[] args) {// 创建一次Scanner对象,在整个程序中复用Scanner scanner = new Scanner(System.in);// 创建ArrayList集合ArrayList<Student> studentList = new ArrayList<>();// 创建学生管理对象StudentManager manager = new StudentManager(studentList);// 键盘录入3个学生信息for (int i = 0; i < 3; i++) {System.out.println("请输入第" + (i + 1) + "个学生的姓名:");String name = scanner.nextLine();System.out.println("请输入第" + (i + 1) + "个学生的年龄:");String age = scanner.nextLine();// 创建学生对象并添加到管理类manager.addStudent(new Student(name, age));}// 关闭Scannerscanner.close();// 使用不同方式显示学生信息manager.displayStudentsUsingForLoop();System.out.println();manager.displayStudentsUsingEnhancedFor();}
}
import java.util.ArrayList;public class StudentManager {private ArrayList<Student> students;public StudentManager(ArrayList<Student> students) {this.students = students;}public void addStudent(Student student) {students.add(student);}// 方法一:使用传统for循环public void displayStudentsUsingForLoop() {System.out.println("==== 使用传统for循环遍历 ====");for (int i = 0; i < students.size(); i++) {System.out.println(students.get(i));}}// 方法二:使用增强for循环(更优雅)public void displayStudentsUsingEnhancedFor() {System.out.println("==== 使用增强for循环遍历 ====");for (Student student : students) {System.out.println(student);}}
}
2 Collection
Java Collection 框架简介
Java Collection 框架是 Java 编程语言中用于存储和操作对象集合的统一架构。它提供了一套接口和实现类,使得处理数据集合变得更加高效和一致。
Collection 框架的核心接口
Java Collection 框架的核心接口包括:
- Collection - 所有集合的根接口,定义了基本操作
- List - 有序集合,允许重复元素
- Set - 不允许重复元素的集合
- Queue - 遵循 FIFO (先进先出) 原则的集合
- Deque - 双端队列,支持两端操作
- Map - 键值对映射集合,不直接继承 Collection 接口
常用实现类
根据不同的需求,Java 提供了多种实现类:
- ArrayList - 基于动态数组实现的 List
- LinkedList - 基于双向链表实现的 List 和 Deque
- HashSet - 基于哈希表实现的 Set
- TreeSet - 基于红黑树实现的有序 Set
- HashMap - 基于哈希表实现的 Map
- TreeMap - 基于红黑树实现的有序 Map
- PriorityQueue - 基于堆实现的优先队列
Collection 框架的特点
- 统一的 API - 所有集合类都遵循相同的设计模式
- 高性能 - 提供了高效的数据结构实现
- 泛型支持 - 类型安全的集合操作
- 多线程支持 - 提供了线程安全的实现
- 可扩展性 - 允许自定义实现
简单示例
下面是一个简单的 Java Collection 使用示例:
java
import java.util.*;public class CollectionExample {public static void main(String[] args) {// 创建一个ArrayListList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Cherry");// 遍历ListSystem.out.println("List elements:");for (String fruit : list) {System.out.println(fruit);}// 创建一个HashMapMap<Integer, String> map = new HashMap<>();map.put(1, "One");map.put(2, "Two");map.put(3, "Three");// 遍历MapSystem.out.println("\nMap elements:");for (Map.Entry<Integer, String> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}// 创建一个HashSetSet<String> set = new HashSet<>();set.add("Java");set.add("Python");set.add("Java"); // 重复元素,不会被添加// 遍历SetSystem.out.println("\nSet elements:");for (String language : set) {System.out.println(language);}}
}
这个示例展示了如何使用 Java Collection 框架中的 List、Map 和 Set 接口及其实现类。Collection 框架是 Java 编程中不可或缺的一部分,理解和掌握它对于编写高效的 Java 程序至关重要。
3 迭代器
迭代器(Iterator)简介
迭代器是一种设计模式,用于提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。在 Java 中,迭代器是java.util
包中的一个接口,它是 Java 集合框架的重要组成部分。
Java 迭代器的核心接口
Java 提供了两种主要的迭代器接口:
- Iterator - 基本迭代器接口,支持单向遍历
- ListIterator - 扩展自 Iterator,支持双向遍历,仅用于 List 实现类
Iterator 接口的主要方法
boolean hasNext()
- 如果迭代器还有下一个元素,返回 trueE next()
- 返回迭代器的下一个元素void remove()
- 从底层集合中移除迭代器最后返回的元素
迭代器的优势
- 统一访问方式 - 提供了统一的方式遍历不同类型的集合
- 不暴露内部结构 - 无需了解集合的内部实现即可访问元素
- 安全遍历 - 在遍历过程中修改集合结构时提供 fail-fast 机制
- 简化代码 - 使代码更简洁、更易读
迭代器的使用示例
下面是一个简单的 Java 迭代器使用示例:
java
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class IteratorExample {public static void main(String[] args) {// 创建一个ArrayListList<String> fruits = new ArrayList<>();fruits.add("Apple");fruits.add("Banana");fruits.add("Cherry");fruits.add("Date");// 获取迭代器Iterator<String> iterator = fruits.iterator();// 使用迭代器遍历集合System.out.println("遍历集合:");while (iterator.hasNext()) {String fruit = iterator.next();System.out.println(fruit);// 可以在遍历过程中安全地移除元素if (fruit.equals("Banana")) {iterator.remove();}}// 移除元素后再次遍历System.out.println("\n移除Banana后再次遍历:");for (String fruit : fruits) {System.out.println(fruit);}}
}
ListIterator 的使用
ListIterator 是 Iterator 的子接口,提供了额外的功能:
java
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;public class ListIteratorExample {public static void main(String[] args) {List<String> colors = new ArrayList<>();colors.add("Red");colors.add("Green");colors.add("Blue");// 获取ListIteratorListIterator<String> listIterator = colors.listIterator();// 正向遍历System.out.println("正向遍历:");while (listIterator.hasNext()) {System.out.println(listIterator.next() + " - 位置: " + listIterator.previousIndex());}// 反向遍历System.out.println("\n反向遍历:");while (listIterator.hasPrevious()) {System.out.println(listIterator.previous() + " - 位置: " + listIterator.nextIndex());}// 在遍历过程中添加元素listIterator.add("Yellow");// 再次正向遍历System.out.println("\n添加Yellow后再次遍历:");while (listIterator.hasNext()) {System.out.println(listIterator.next());}}
}
迭代器的注意事项
- fail-fast 机制 - 大多数迭代器实现了 fail-fast 机制,当在迭代过程中检测到集合结构被修改时,会抛出
ConcurrentModificationException
- 仅单向移动 - 基本 Iterator 只能单向移动,而 ListIterator 可以双向移动
- 性能考虑 - 不同的迭代器实现可能有不同的性能特性
- 多线程环境 - 在多线程环境中使用迭代器需要特别注意同步问题
迭代器是 Java 集合框架中一个非常重要的概念,它提供了一种统一且安全的方式来遍历集合元素,使代码更加简洁和健壮。
4 集合的使用步骤
public static void main(String[] args) {
Collection<String> c = new ArrayList<String>(); //步骤 1: 创建集合对象
String s = "itcast"; //步骤 2: 添加元素
c.add(s); //步骤 2.2: 添加元素到集合
c.add("itcast");
Iterator<String> it = c.iterator();//步骤 3: 遍历集合
while(it.hasNext()){ 步骤 3.1: 通过集合对象获取迭代器对象
String s = it.next(); 步骤 3.2: 通过迭代器对象的 hasNext () 方法判断是否还有元素
System.out.println(s); 步骤 3.3: 通过迭代器对象的 next () 方法获取下一个元素
}
}