Day22初识集合
一、集合
1、概念: 集合是指将多个元素组合在一起的数据结构。在编程中,集合用于存储和操作一组相关的数据对象。与数组相比,集合具有更灵活、动态和高级的功能。
2、常见的集合类:
- List(列表):
ArrayList
:基于数组实现的动态数组。LinkedList
:基于链表实现的双向队列。Vector
:线程安全的动态数组。
- Set(集):
HashSet
:基于哈希表实现的无序集合。LinkedHashSet
:具有可预测迭代顺序的集合。TreeSet
:基于红黑树实现的有序集合。
- Queue(队列):
LinkedList
:基于链表实现的队列。PriorityQueue
:基于堆实现的优先级队列。
- Map(映射):
HashMap
:基于哈希表实现的键值对映射。LinkedHashMap
:具有可预测迭代顺序的键值对映射。TreeMap
:基于红黑树实现的有序键值对映射。
- Stack(栈):
Stack
:基于向量实现的后进先出(LIFO)
二、ArrayList的使用
1、概念: ArrayList
是Java集合框架中的一个动态数组实现类,它提供了便捷的方法来操作和管理元素 。
2、用法:
- 导入ArrayList类:
import java.util.ArrayList;
- 创建ArrayList对象:
ArrayList<String> list = new ArrayList<>();
- 添加元素:
list.add("Apple"); list.add("Banana"); list.add("Orange");
- 获取元素:
String fruit = list.get(1); // 获取索引为1的元素("Banana")
- 修改元素:
list.set(0, "Mango"); // 将索引为0的元素修改为"Mango"
- 删除元素:
list.remove(2); // 删除索引为2的元素("Orange")
- 判断是否包含元素:
boolean contains = list.contains("Apple"); // 判断是否包含元素"Apple"
- 获取列表大小:
int size = list.size(); // 获取列表中元素的个数
- 遍历列表:
使用增强型for循环:
for (String fruit : list) {System.out.println(fruit); }
使用迭代器:
Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) {String fruit = iterator.next();System.out.println(fruit); }
注意:
集合一旦定义了泛型,就规定了集合存储元素的类型
所以说泛型是一种数据安全的做法
三、枚举
1、概念: 枚举(Enumeration)是一种特殊的数据类型,用于定义一组具名的常量。在Java中,枚举类型是通过enum
关键字来定义的。
2、用法:
- 定义枚举类型:
enum Season {SPRING, SUMMER, AUTUMN, WINTER }
- 使用枚举常量:
Season currentSeason = Season.SUMMER;
- 访问枚举常量:
System.out.println(currentSeason); // 输出:SUMMER
- 比较枚举常量:
if (currentSeason == Season.SUMMER) {System.out.println("It's summer!"); }
- 遍历枚举常量:
for (Season season : Season.values()) {System.out.println(season); }
- 自定义枚举属性和方法:
1. enum DayOfWeek {MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"),THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六"),SUNDAY("星期日"); private String chineseName; DayOfWeek(String chineseName) { this.chineseName = chineseName; } public String getChineseName() { return chineseName; }}DayOfWeek today = DayOfWeek.MONDAY;System.out.println(today.getChineseName()); // 输出:星期一
3、举例:枚举案例 之 策略枚举
需求:模拟千锋计算工资的功能
分析:
员工类别:行政、讲师
部门:Java(讲师)、Python(讲师)、HTML(讲师)、总经办(行政)、人力(行政)、财务(行政)
行政工资构成:基本工资 + 绩效
讲师工资构成:基本工资 + 绩效 + 课时费*课时
public class Test01 {public static void main(String[] args) {double salary1 = QianFeng.Java.getSalary(1800, 200, 88, 9);System.out.println(salary1);double salary2 = QianFeng.GeneralManagerOffice.getSalary(50000, 30000, 0, 0);System.out.println(salary2);}
}
import java.math.BigDecimal;//public final class QianFeng extends Enum
public enum QianFeng {Java(StaffType.teacher),Python(StaffType.teacher),HTML(StaffType.teacher),GeneralManagerOffice(StaffType.admin),HR(StaffType.admin),finance(StaffType.admin);private StaffType staffType;private QianFeng(StaffType staffType) {this.staffType = staffType;}public double getSalary(double basicSalary, double performance, double classFees, double classHours){return staffType.calculateSalary(basicSalary, performance, classFees, classHours);}//员工类型admin {//行政类别@Overridepublic double calculateSalary(double basicSalary, double performance, double classFees, double classHours) {BigDecimal big1 = new BigDecimal(String.valueOf(basicSalary));BigDecimal big2 = new BigDecimal(String.valueOf(performance));double salary = big1.add(big2).doubleValue();return salary;}},teacher {@Overridepublic double calculateSalary(double basicSalary, double performance, double classFees, double classHours) {BigDecimal big1 = new BigDecimal(String.valueOf(basicSalary));BigDecimal big2 = new BigDecimal(String.valueOf(performance));BigDecimal big3 = new BigDecimal(String.valueOf(classFees));BigDecimal big4 = new BigDecimal(String.valueOf(classHours));double salary = big3.multiply(big4).add(big1).add(big2).doubleValue();return salary;}};public abstract double calculateSalary(double basicSalary, double performance, double classFees, double classHours);}
}