Java学习路线(13)——Collection集合类:List集合与Set集合

news2024/11/22 15:58:31

一、集合类体系结构
在这里插入图片描述


二、部分Collection类型对象
在这里插入图片描述
Collection集合特点

  • List系列集合是有序、可重复、有索引。

    • ArrayList:有序、可重复、有索引
    • LinkedList:有序、可重复、有索引
  • Set系列集合是无序、不重复、无索引。

    • HashSet:无序、不重复、无索引
    • LinkedHashSet:有序、不重复、无索引
    • TreeSet:按照大小默认升序、不重复、无索引

约束存储数据

  • 泛型约束: 集合是支持任意类型进行存储的。
  • 引用类型约束: 集合不支持基本类型,但支持引用数据类型。

三、Collection常用API

方法说明
boolean add(E e)添加指定数据并返回添加结果
void clear()清空数据
boolean isEmpty()判断数据为空
int size()获取集合大小
boolean contains(Object o)判断集合是否包含某个元素
boolean remove(E e)删除集合中某个元素默认删除第一个
Object[] toArray()集合转对象数组

拓展API

方法说明
Collection addAll(Collection c)合并

四、Collection遍历方式

1、迭代器(Iterator)

获取迭代器

方法说明
Iterator iterator()返回迭代器对象,默认指向0索引

Iterator中常用方法

方法说明
boolean hasNext()询问当前位置是否有元素
E next()获取当前元素,并向下移动,注意越界(NoSuchElementException)

示例

/*1、创建集合对象*/
Collection<String> collection = new ArrayList<>();
collection.add("我");
collection.add("爱");
collection.add("中");
collection.add("国");
collection.add("!");

/*2、获取迭代器*/
Iterator<String> integer = collection.iterator();

/*循环遍历迭代器*/
while(integer.hasNext()){	//判断有没有值
	System.out.print(integer.next());	//获取值并下移
}

/*打印结果*/
我爱中国!

2、foreach
foreach实际上是重写了迭代器进行遍历。

格式:

for(数据类型 element : 数组/集合){
	循环体
}

示例

/*1、创建集合对象*/
Collection<String> collection = new ArrayList<>();
collection.add("我");
collection.add("爱");
collection.add("中");
collection.add("国");
collection.add("!");

/*2、foreach遍历*/
for (String str : collection) {
	System.out.print(str);
}

/*打印结果*/
我爱中国!

3、lambda
Collection类提供了一个叫做 forEach() 的方法进行遍历,该方法采用的是匿名类进行重写。

 /*1、创建集合对象*/
Collection<String> collection = new ArrayList<>();
collection.add("我");
collection.add("爱");
collection.add("中");
collection.add("国");
collection.add("!");

/*2、forEach()遍历*/
//System.out::print 是将当前元素进行引用打印
collection.forEach(System.out::print);

/*打印结果*/
我爱中国!

五、常见数据结构

概念: 数据结构是计算机底层存储、组织数据的方式,合适的数据结构能提高运行效率和存储效率。

常见结构
1、栈
特点: 后进先出,先进后出。

2、队列
特点: 先进先出,后进后出
三种队列: 单进单出队列,双进单出队列,双进双出队列

3、数组
存储特点: 一块内存连续的空间。
操作特点:

  • 查询速度快: 通过地址值和索引定位。
  • 删除速率低: 需要移动大量元素。
  • 添加速率低: 需要移动大量元素。

4、链表
存储特点: 内存中不连续,每个节点包含数据和下一个元素地址。
操作特点:

  • 查询速度慢: 因为内存不连续,所以需要遍历每一个元素。
  • 删除速率高: 通过指针指向更变即可完成删除。
  • 添加相对速率高: 因为查询慢,所以速率较低,高效添加是通过指针指向更变即可完成删除。
    两种链表: 单向链表(数据+下一地址),双向链表(上一地址+数据+下一地址)

5、二叉树
存储特点: 内存不连续,每个节点包含父节点地址,左右节点地址,数据值。
结构特点:

  • 只能有一个根节点,每个节点最多支持2个直接子节点。
  • 节点的度: 节点拥有的子树个数,二叉树的度不大于2。
  • 叶子结点: 度为0的节点,也称为终端节点
  • 高度: 叶子结点高度为1,叶子结点的父节点高度为2,…,根节点高度最高。
  • 层: 根节点在第1层,以此类推。
  • 兄弟节点: 拥有共同父节点的节点互称兄弟节点。

特殊的二叉树: 二叉排序树。

6、平衡二叉树
原则: 任意节点的左右两个子树高度差不超过1,任意节点的左右两个子树都是平衡二叉树。

7、红黑树
概念: 一种自平衡的二叉排序树,1972年被称为平衡二叉B树,1978年更名为**“红黑树”**。
特点: 每一个节点可以是红或者黑,通过 “红黑规则” 进行平衡。
红黑规则

  • 每个节点是红色或黑色,根节点必须是黑色。
  • 如果节点没有子节点或父节点,则节点对应指针属性为Nil,这些Nil视为叶节点,叶节点是黑色。
  • 如果一个节点是红色,则子节点必须是黑色。
  • 每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

六、List集合
特有方法:

方法说明
void add(int index,E element指定位置插入元素
E remove(int index指定位置的元素,并返回删除元素
E set(int index,E element修改指定位置的元素,并返回修改元素
E get(int index获取指定位置的元素

List实现类的底层原理

1、ArrayList底层原理:

  • 底层基于数组实现,根据索引定位元素,增删需要做大量元素的移位操作。
  • 第一次创建集合并添加元素时,默认创建长度为10的数组。
  • 当数组满元素时,自动扩容二分之一。

2、LinkedList底层原理

  • 基于双链表实现,查询速度慢,增删首尾元素快(最适合实现栈与队列结构)。
  • 独有方法
方法说明
void addFirst(E e)首位插入指定元素
void addLast(E e)末位插入指定元素
E getFirst()获取首位元素
E getLast()获取末位元素
E removeFirst()删除首位元素
E removeLast()删除末位元素
E push()压栈/入栈
E pop()弹栈/出栈
E offerLast()入队
E offerFrist()出队

补充知识
1、集合的并发修改异常
问题的出现: 当我们从集合中查找某个元素并删除时,可能会出现并发修改异常。
问题出现的原因: 当我们在循环遍历时,因为索引改变而产生跳跃查询的情况。
解决方案:

  • 使用迭代器遍历,删除方法使用迭代器删除方法 iterator.remove(); 删除当前元素并不下移。(推荐使用)
  • 使用倒着for循环。

2、深入泛型

(1)泛型定义的位置

  • 类的后面。【class ArrayList】
  • 方法声明。【public void get(T t)】
  • 接口声明。【interface Collection】

(2)自定义泛型类

  • 格式: 【修饰符 class 类名<泛型变量> { … }】
public class MyArrayList<T>{ }
  • 泛型变量标识

常见标识:T、E、T、K、V

  • 作用: 编译阶段指定数据类型。

  • 原理: 出现泛型变量的地方全部替换成传输的真实数据类型。

  • 示例

class Main{
    public static void main(String[] args) {
        MyArrayList<String> mal = new MyArrayList<>();
        mal.add("String");
    }
}

public class MyArrayList<E> {
    public void add(E element){

    }
    public void remove(E element){

    }
}

(3)自定义泛型方法

  • 概念: 定义方法时同时定义泛型的方法。
  • 格式:
修饰符 <泛型变量> 返回值 方法名称(参数列表){ ... }
  • 作用: 方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性。
  • 示例:
class Main{
    public static void main(String[] args) {
        String[] names = {"x1","x2","x3"};
        printArray(names);
        System.out.println("——————————");
        Integer[] ages = {10,11,12};
        printArray(ages);
    }

    public static <T> void printArray(T[] arr){
        StringBuilder builder = new StringBuilder("[");
        Iterator<T> iterator = Arrays.stream(arr).iterator();
        while(iterator.hasNext()){
            builder.append(iterator.next());
            builder.append(iterator.hasNext()?", ":"");
        }
        builder.append("]");
        System.out.println(builder.toString());
    }
}


/*输出结果*/
[x1, x2, x3]
——————————
[10, 11, 12]

(4)自定义泛型接口

  • 概念: 使用泛型定义的接口。
  • 格式:
修饰符 interface 接口名称<泛型变量>{ }
  • 作用: 泛型接口让实现类选择当前功能需要操作的数据类型。
  • 示例:
interface Info<E>{
    void add(E element);
    void removeByID(int id);
    E queryByID(int id);
    void update(int id,E element);
}

class Student implements Info<Student>{

    @Override
    public void add(Student element) {

    }

    @Override
    public void removeByID(int id) {

    }

    @Override
    public Student queryByID(int id) {
        return null;
    }

    @Override
    public void update(int id, Student element) {

    }

}

(5)通配符:?

  • 概念: ?可以在“使用泛型”时代表一切类型,而E,T,K,V在定义泛型时使用。
  • 泛型的上下限:
    【? extends Car】?必须是Car或者其子类,表示泛型上限
    【? super Car】?必须是Car或者其父类,表示泛型下限
  • 示例
  /**
	*使用场景:当我们需要传入多类型的引用集合时使用
	*/
  /*? extends Car使用*/
  /*1、创建Car类以及子类*/
  class Car{}
  class BMW extends Car{}
  class BENZ extends Car{}
  
  /*2、运行方法,这里的<? extends Car>表示引用类型是Car或是其子类*/
  public static void go(ArrayList<? extends Car> cars){}

  /*3、使用方法*/
  public static void main(String[] args){
	ArrayList<BMW> bmw = new ArrayList<>();
	bmw.add(new BMW());
	bmw.add(new BMW());
	bmw.add(new BMW());
	
	ArrayList<BENZ> benzs= new ArrayList<>();
	benzs.add(new BENZ());
	benzs.add(new BENZ());
	benzs.add(new BENZ());

	go(bmw);
	go(benzs);
  }

七、Set集合体系

体系特点

  • 无序: 存取顺序不一致
  • 不重复: 可以去重
  • 无索引: 没有带索引的方法

实现类特点

  • HashSet: 无序、不重复、无索引
  • LinkedHashSet: 有序、不重复、无索引
  • TreeSet: 排序、不重复、无索引

实现类详情
1、HashSet

(1)元素无序的底层原理:哈希表

hash表的概念: 是一种对于增删改查数据性能较好的结构。

hash表的组成: JDK8之前使用数组+链表组成;JDK8之后使用数组+链表+红黑树

JDK7版本的HashSet的底层原理解析:数组+链表+Hash算法

  • 1、优先创建一个默认长度为16,默认加载扩容因子为0.75的数组的数组,数组名table
  • 2、根据hash值跟数组长度求余计算存入位置(Hash算法)。
  • 3、当发生冲突时调用equals()比较。若已知则不存;若不一致则存储数组。
    • JDK7新元素占据老元素的位置,再将老元素挂载到新元素节点上。
    • JDK8新元素直接挂载到老元素节点上。
  • 4、当数组存满到16*0.75=12时,就自动扩容,每次扩容原先的两倍。

JDK8版本的HashSet原理解析:数组+链表+红黑树
两者区别在于由于当挂载链表长度超过8时,自动转换成红黑树。

(2)要理解hash表,必须先理解hash值。

hash值的概念: 是JDK根据对象的地址,按照某种自定义或预设规则计算的int类型数值。

获取hash值的方法: Object类API【int hashCode();】-> 返回对象的hash值

对象hash值特点

  • 同一个对象多次调用hashCode()返回相同的hash值。
  • 默认情况下,不同对象的hash值不同。

示例

/*1、创建对象获取hash值*/
String str = "石头人";
System.out.println(str.hashCode());
String integerV = "李雷";
System.out.println(integerV.hashCode());

/*打印结果*/
30237497
858473

(3)HashSet去重底层原理: Hash算法一致节点挂载

注意: 当我们需要去重对象集合时,需要在对象中重写hashCode()以及equals()

重写的hashCode()和equals


@Override
public boolean equals(Object o){
	if(this == o) return true; //判断是否为当前对象
	if(o == null || getClass() != o.getClass()) return true; //判断空值以及对象类型是否相同。
	类型 变量名 = (类型)o;
	return 属性比较 && Objects.equals(xx,o.xx)}

@Override
public int hashCode(){
	return Objects.hash(你比较的参数列表);
}

2、LinkedHashSet
(1)特点:有序不重复无索引
(2)有序特性:保证存储和取出的元素顺序一致。
(3)存储结构:Hash表
(4)有序原理:数据依次进入,每一个数据都会与前一个数据建立双向链表机制记录顺序。

3、TreeSet集合
(1)特点:可排序不重复无索引
(2)可排序特性:按照元素大小默认升序排列。
(3)存储结构:红黑树
(4)默认排序规则:

  • 数值类型: Integer,Double,官方默认按照大小升序排序。
  • 字符串类型: 默认按照首字符的ASCII码升序排序。
  • 自定义类型: 采用自定义排序规则。

(5)示例

/*数值类型排序*/
Set<Integer> integerSet = new TreeSet<>();
integerSet.add(3);
integerSet.add(1);
integerSet.add(6);
integerSet.add(8);
integerSet.add(0);
integerSet.add(2);
System.out.println(integerSet);
        
/*字符串类型排序*/
Set<String> stringSet = new TreeSet<>();
stringSet.add("Java");
stringSet.add("MySQL");
stringSet.add("PHP");
stringSet.add("C++");
stringSet.add("Golang");
stringSet.add("JavaScript");
System.out.println(stringSet);
        
/*打印结果*/
[0, 1, 2, 3, 6, 8]
[C++, Golang, Java, JavaScript, MySQL, PHP]

/*自定义类型排序*/
//方法一:Comparable接口重写compareTo()
public class AppleTemp {
    public static void main(String[] args) {
        Set<Apple> set = new TreeSet<>();
        set.add(new Apple("绿苹果",82.2,50));
        set.add(new Apple("黄苹果",54.1,20));
        set.add(new Apple("金苹果",10.2,11));
        set.add(new Apple("青苹果",100.0,1));
        System.out.println(set);
    }

}

class Apple implements Comparable<Apple>{

    private String name;
    private double weight;
    private int count;

    public Apple() {
    }

    public Apple(String name, double weight, int count) {
        this.name = name;
        this.weight = weight;
        this.count = count;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

	@Override
    public int compareTo(Apple o) {
        return this.getName().compareTo(o.getName());
    }

    @Override
    public String toString() {
        return "Apple{" +
                "name='" + name + '\'' +
                ", weight=" + weight +
                ", count=" + count +
                '}';
    }
}

//方法二:TreeSet集合有参构造器,设置Comparator接口对应的比较器对象。(优先使用)
public class AppleTemp {
    public static void main(String[] args) {
        Set<Apple> set = new TreeSet<>(Comparator.comparing(Apple::getName));
        set.add(new Apple("绿苹果",82.2,50));
        set.add(new Apple("黄苹果",54.1,20));
        set.add(new Apple("金苹果",10.2,11));
        set.add(new Apple("青苹果",100.0,1));
        System.out.println(set);
    }
}

class Apple{

    private String name;
    private double weight;
    private int count;

    public Apple() {
    }

    public Apple(String name, double weight, int count) {
        this.name = name;
        this.weight = weight;
        this.count = count;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "name='" + name + '\'' +
                ", weight=" + weight +
                ", count=" + count +
                '}';
    }
}

/*打印结果*/
[Apple{name='绿苹果', weight=82.2, count=50}, Apple{name='金苹果', weight=10.2, count=11}, Apple{name='青苹果', weight=100.0, count=1}, Apple{name='黄苹果', weight=54.1, count=20}]

补充知识
1、可变参数

概念: 可变参数用在形参中接收多个数据。

格式:

/*数据类型... 参数名称*/
public static void sum(int... num);

作用:

  • 1、传输参数灵活方便。可以不传参,也可以传输1个或者多个,也可以传输一个数组。
  • 2、可变参数在方法内部按照数组进行使用。

注意事项

  • 1、 一个形参列表中可变参数只能有一个。
  • 2、可变参数必须放在形参列表的最后。

2、Collections操作类

概念: java.utils.Collections是集合工具类

常用API

方法说明
static boolean addAll(Collection<? super T> c,T… elements)批量添加元素
static void shuffle(List<?> list)打乱集合顺序
static void sort(List<?> list)集合排序
static void sort(List list,Comparator<? super T> c)按指定规则排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/575475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0202条件过滤-自动装配原理-springboot2.7.x系列

1前言 在springboot的自动装配过程中&#xff0c;执行完候选配置类导入后&#xff0c;会进行条件过滤。那么在讲解条件过滤前&#xff0c;我们先来了解springboot常用的条件注解&#xff0c;以及它们底层执行原理。 在Spring Boot中&#xff0c;条件&#xff08;Condition&am…

使用qemu模拟CXL.mem设备

CXL可以说是自PCIe技术诞生几十年以来最具变革性的新技术了。可以想象有了CXL以后机箱的边界将被彻底打破&#xff0c;服务器互相使用对方的内存&#xff0c;网卡&#xff0c;GPU 。整个机架甚至跨机架的超级资源池化成为可能&#xff0c;云计算也将进入一个新的时代。 当前In…

C++寄存器优化

在C里面有个有趣的现象&#xff0c;先看代码 #include<iostream> using namespace std; int main() {int const tmp 100; //定义常量tmp tmp不能修改int const* p &tmp; //不能通过指针修改指向的值 int* const q const_cast<int*>(p); //去常属性 可以通过…

【C++11】C++11新增语法特性 右值引用/移动语义/完美转发

C11 右值引用 1 右值引用1.1 左值 、 右值1.2 左值引用 VS 右值引用1.3 谈谈C11引入右值引用的意义1.4 左值引用和右值引用的一些细节问题 2 移动语义3 完美转发4 总结 1 右值引用 1.1 左值 、 右值 在C中所有的值不是左值就是右值。左值是指表达式结束后依然存在的持久化对象…

【JavaSE】Java基础语法(二十二):包装类

文章目录 1. 基本类型包装类2. Integer类3. 自动拆箱和自动装箱4. int和String类型的相互转换 1. 基本类型包装类 基本类型包装类的作用 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一&#xff1a;用于基本数据类型与字符串之间的…

Goby 漏洞更新|锐捷网络 NBR路由器 webgl.data 信息泄露漏洞

漏洞名称&#xff1a;锐捷网络 NBR路由器 webgl.data 信息泄露漏洞 English Name&#xff1a;Ruijie NBR Router webgl.data information CVSS core: 7.5 影响资产数&#xff1a;204290 漏洞描述&#xff1a; 锐捷网络NBR700G路由器是锐捷网络股份有限公司的一款无线路由设…

口碑超好的挂耳式耳机盘点,这几款蓝牙耳机值得一看!

运动已成为人们业余生活中不可缺少的组成部分&#xff0c;徒步、夜跑、骑行等运动项目受到越来越多的人的喜欢&#xff0c;运动与耳机的搭配也是当代年轻人喜爱的行为方式&#xff0c;在颠簸的运动项目中耳机的稳固性和舒适性是非常主要的&#xff0c;现在新推出的开放式耳机深…

Ps:移除工具

移除工具 Remove Tool是一款简单易用、功能强大的工具&#xff0c;可快速、轻松地清去除图片中的干扰元素或不需要的区域。 快捷键&#xff1a;J 就如同使用画笔工具一样&#xff0c;只要在不需要的对象上涂抹&#xff08;描边&#xff09;即可将其去除。 移动工具基于人工智能…

几号发工资就能看出公司的好坏?(文末附招聘岗位)

作为一名资深的职场搬砖人&#xff0c;不知道各位最近有没有跟我一样关注到这个话题 ​#发工资时间看公司#小编刚看到这个话题的第一印象&#xff0c;想的是发工资时间无非是公司实力的体现&#xff0c;工资发的越早证明这个公司的现金流越稳定强大。 打开评论区&#xff0c;不…

Linux——进程优先级

1.什么是优先级&#xff1f; 优先级和权限息息相关。权限的含义为能还是不能做这件事。而优先级则表示&#xff1a;你有权限去做&#xff0c;只不过是先去做还是后去做这件事罢了。 2.为什么会存在优先级&#xff1f; 优先级表明了狼多肉少的理念&#xff0c;举个例子&#xff…

Processing通过编程实现艺术设计_实现艺术和现实的交互---数据设计分析002

还记得这个生命的游戏,也是在这上面有 https://processing.org/ 官网是这个 使用Processing可以用编程的方式来创作艺术 Processing是一门开源编程语言,可以直接对用它来做艺术创作, 可以看一些它的作品 https://processing.org/examples/gameoflife.html 官网是这个,完…

作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)

gdb(GNU Debugger) 是一个用于调试 Linux 系统的软件工具。在学习 Linux 的过程中&#xff0c;gdb 的重要性不言而喻。以下是 gdb 在 Linux 学习者中的重要性的详细说明: 帮助理解 Linux 系统的运作方式:gdb 是一个强大的调试工具&#xff0c;可以帮助学习者深入了解 Linux 系统…

代码随想录算法训练营day53 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和 动态规划

代码随想录算法训练营day53 | 1143.最长公共子序列&#xff0c;1035.不相交的线&#xff0c;53. 最大子序和 动态规划 1143.最长公共子序列解法一&#xff1a;动态规划 1035.不相交的线解法一&#xff1a;动态规划 53. 最大子序和 动态规划解法一&#xff1a;动态规划解法二&am…

Python学习38:凯撒密码——解密

类型&#xff1a;字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述‪‬‪…

【Netty】Netty 编码器(十三)

文章目录 前言一、MessageToByteEncoder 抽象类二、MessageToMessageEncoder 抽象类总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff09;Netty 架构设计&#xff08;二&#xff09;Netty Channel 概述&#xff08;三&#xff09;Netty ChannelHan…

notepad++查询指定内容并复制

背景说明 记录一下使用notepad进行文本内容查找以及替换的相关场景,简单记录方便后期查看,场景内容: 1.从指定的给出内容中筛选出所有的人员id集合 2.将每一行后面添加逗号 1.从指定的给出内容中筛选出所有的人员id集合 要求从指定的给出内容中筛选出所有的人员id集…

便携式明渠流量计的使用特点

便携式明渠流量计使用特点&#xff1a; 便携式明渠流量计使用特点&#xff0c;首先了解相关要求&#xff1a; 随着新标准JJG711-1990《明渠堰槽流量计试行检定规程》、HJ/T15-2019《超声波明渠污水流量计技术要求及检测方法》、HJ 354-2019《水污染源在线监测系统(CODCr、NH3-N…

Java开发 - 你不知道的JVM优化详解

前言 代码上的优化达到一定程度&#xff0c;再想提高系统的性能就很难了&#xff0c;这时候&#xff0c;优秀的程序猿往往会从JVM入手来进行系统的优化。但话说回来&#xff0c;JVM方面的优化也是比较危险的&#xff0c;如果单单从测试服务器来优化JVM是没有太大的意义的&…

制作PE工具盘

文章目录 前言一、什么是PE工具箱&#xff1f;二、制作WinPE工具箱例&#xff1a;制作ISO模式的PE工具箱 三、PE工具箱的典型应用1.清除Windows登陆密码2.调整分区大小3.系统备份4.系统恢复例&#xff1a;系统备份与恢复 四、使用U深度制作的PE工具恢复误删除的文件实验步骤注意…

springboot+vue车辆充电桩管理系统(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的车辆充电桩管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;…