Java基础之集合框架
认识集合
数组存在一些缺陷,所以提出集合的概念
Java 集合框架 位于 java.util 包中
下表总结了Java中Vector
类的一些常用方法:
方法 | 描述 |
---|---|
add(E element) | 将指定元素添加到Vector 的末尾 |
add(int index, E element) | 在指定的索引位置插入指定元素到Vector 中 |
remove(int index) | 删除指定索引位置的元素 |
remove(Object obj) | 删除第一次出现的指定元素 |
clear() | 清空Vector 中的所有元素 |
get(int index) | 返回指定索引位置的元素 |
set(int index, E element) | 将指定索引位置的元素设置为指定的元素 |
size() | 返回Vector 中的元素数量 |
isEmpty() | 检查Vector 是否为空 |
contains(Object obj) | 检查Vector 是否包含指定元素 |
indexOf(Object obj) | 返回第一次出现的指定元素的索引位置 |
lastIndexOf(Object obj) | 返回最后一次出现的指定元素的索引位置 |
toArray() | 将Vector 转换为数组 |
addAll(Collection<? extends E> collection) | 将指定集合中的所有元素添加到Vector 的末尾 |
containsAll(Collection<?> collection) | 检查Vector 是否包含指定集合中的所有元素 |
removeAll(Collection<?> collection) | 删除Vector 中与指定集合中元素相同的所有元素 |
retainAll(Collection<?> collection) | 保留Vector 中与指定集合中元素相同的元素,删除其他元素 |
iterator() | 返回在Vector 上进行迭代的迭代器 |
这些方法提供了对Vector
对象进行添加、删除、获取、查询等常见操作的功能。Vector
类是线程安全的,支持同步操作,适用于多线程环境下的使用。需要注意的是,由于同步开销较大,Vector
在单线程环境下性能可能不如ArrayList
。如果在单线程环境下使用,推荐使用ArrayList
类。
例:
package com.kfm.JavaBase.Collection;
import java.util.Comparator;
import java.util.Vector;
public class Exer {
/**
* 创建一个集合, 存储 5 个 Student 对象(name, age, toString, equals, hashCode, getter/setter).
* 1. 设计方法对集合元素,按照年龄进行排序
* 2. 输出排序后的集合元素
* 3. 将下标为 3 的学生的姓名改成 "三娃"
* 4. 在下标为 4 处添加学生 五娃 20岁
* 6. 删除最后一个学生
* 7. 遍历输出每个学生的姓名
*/
public static void main(String[] args) {
//创建新对象
Student stu1 = new Student("南北",20);
Student stu2 = new Student("纬钧",18);
Student stu3 = new Student("弘石",22);
Student stu4 = new Student("九明",21);
Student stu5 = new Student("启程",19);
//创建集合
Vector vector = new Vector();
//将 对象 装入集合
vector.add(stu1);
vector.add(stu2);
vector.add(stu3);
vector.add(stu4);
vector.add(stu5);
//设计方法对集合元素,按照年龄进行排序
sort(new Comparator() {
@Override
public int compare(Object o1, Object o2) {//创建比较器 将相邻元素进行排序
//将 Object 类型 强转为 student 类型
//这里也可为 o1 o2 属于 student 类型
Student stu1 = (Student) o1;
Student stu2 = (Student) o2;
//根据年龄进行排序 所以 先从 对象数组中 获取 年龄
return stu1.getAge() > stu2.getAge()? 1: -1;
}
}, vector);//集合名称
//输出排序后的集合元素
for (Object stu : vector){
System.out.println(stu);
}
// vector.set(3,new Student("三娃",22));
//在修改 字段内容时 一定要记得此时获取到的 要修改的元素 一定是属于当前对象数组的
if (vector.get(3) instanceof Student student){
student.setName("三娃");
}
vector.add(4,new Student("五娃",20));
vector.remove(vector.size()-1);//删除最后一个元素 是以下标来论
for (Object stu : vector){
System.out.println(stu);
}
//遍历输出每个学生的姓名
for (Object stu : vector){
if ( stu instanceof Student student){
System.out.println(student.getName());
}
}
}
//自己写 sort 方法 运用 比较器
private static void sort(Comparator comparator,Vector stu) {//比较器 和 要被比较的元素的集合
for (int i = 0 ; i < stu.size()-1;i++){
for (int j = 0 ; j < stu.size() - 1 - i;j++){
if (comparator.compare(stu.get(j),stu.get(j+1))>0){
Object temp = stu.get(j);
stu.set(j,stu.get(j+1));
stu.set(j+1,temp);
}
}
}
}
}
List.of()的使用
List.of()是Java 9中引入的一个新方法,它用于创建一个包含给定元素的不可变列表。不可变列表是一种特殊类型的列表,它不允许对其实例进行修改。以下是对List.of()应用的一些总结:
创建不可变列表:List.of()方法允许你创建一个包含给定元素的不可变列表。这意味着你不能向该列表添加或删除元素。
java
List list = List.of(“apple”, “banana”, “orange”);
元素数量限制:List.of()最多可以包含9个元素。如果你尝试使用超过9个元素,将会抛出TooManyElementsException异常。
元素类型:你可以使用任何类型的元素创建不可变列表,例如基本类型、对象引用类型等。
可与其他不可变集合操作:由于不可变列表是集合框架的一部分,因此你可以将其与其他不可变集合(如Set、Map)进行操作。例如,你可以使用stream()方法对不可变列表进行流操作。
性能:由于不可变列表在创建后不能被修改,因此它们在内存使用和性能方面具有一定的优势。由于不需要进行额外的对象创建和复制操作,对于大量只读操作,使用不可变列表可能会比其他类型的列表更快。
可被用作方法的参数:由于不可变列表是线程安全的,因此它们可以作为方法的参数类型,特别是那些在多线程环境中被调用的方法。
扩展性:虽然List.of()最多只能包含9个元素,但你可以使用List.copyOf()方法从已有的集合创建不可变列表。这使得你可以创建任意大小的不可变列表。
总之,List.of()提供了一种方便且安全的方式来创建不可变列表,适用于需要确保列表不可修改的场景。
package com.kfm.JavaBase.Collection;
import java.util.List;
import java.util.Scanner;
public class GoodsList {
/**
创建一个List集合,添加多个商品名称。实现根据输入查询某个商品是否存在,如果存在则输
出信息
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入商品:");
String o = sc.next();
List goods = List.of("草莓","辣条","薯片","巧克力","糖果");
if (goods.contains(o)){
System.out.println("找到商品啦!商品是:" + o);
}else {
System.out.println("商品不存在");
}
}
}
使用vector动态存储数据
特点:动态数组 线程安全 支持随机访问 可以包含重复元素 可以插入null元素
Vector vector = new Vector;
//创建初始容量为10的对象
默认扩容方式: 按倍增长``
两个元素之间的比较形式
if (comparator.compare(stu.get(j),stu.get(j+1))>0){
Object temp = stu.get(j);
stu.set(j,stu.get(j+1));
stu.set(j+1,temp);
}
package com.kfm.JavaBase.Collection;
import java.util.Comparator;
import java.util.Vector;
public class StudentList {
/**
* 创建一个List集合表示学生列表。添加10个学生并设计方法实现根据学生成绩排序和计算
* 平均成绩功能
*/
public static void main(String[] args) {
Vector vector = new Vector();
Student stu1 = new Student("南",20,87);
Student stu2 = new Student("北",20,97);
Student stu3 = new Student("纬",20,82);
Student stu4 = new Student("钧",20,91);
Student stu5 = new Student("九",20,78);
Student stu6 = new Student("明",20,80);
Student stu7 = new Student("凯",20,56);
Student stu8 = new Student("启",20,81);
Student stu9 = new Student("程",20,77);
Student stu0 = new Student("弘",20,82);
vector.add(stu1);
vector.add(stu2);
vector.add(stu3);
vector.add(stu4);
vector.add(stu5);
vector.add(stu6);
vector.add(stu7);
vector.add(stu8);
vector.add(stu9);
vector.add(stu0);
vector.sort(new Comparator() {//设计方法实现根据学生成绩排序
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Student stu1 && o2 instanceof Student stu2){
return stu1.getGrade() - stu2.getGrade();
}
return 0;
}
});
for (Object obj : vector){
System.out.println(obj);
}
double i = avg(vector);
System.out.printf("平均成绩为:"+"%.2f",i);//保留两位小数 点几f 说明保留几位小数
}
//设计方法求平均值
private static double avg(Vector vector) {//
double sum = 0.0;
for (Object obj : vector){
if (obj instanceof Student stu){
sum += stu.getGrade();
}
}
return sum/vector.size();
}
}