Java进阶九—数组问题(集合框架)

Java进阶九—数组问题(集合框架)

一.原生数组带来的问题

  • 原生数组容易造成超出边界,如果非要使用传统的数组,增删改查,就要用到数据结构,非常复杂
  • CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写
    package com.array;import org.junit.Test;public class ArrayTest {public static final int SIZE = 3;@Testpublic void testArray() {int[] array = new int[SIZE];array[0] = 1;array[1] = 2;array[2] = 3;array[3] = 4;for (int arrays :array) {System.out.println(arrays);}}
    }
    

由此我们抛出Java Conllections FrameWork即Java集合框架,也可称为函数库 

二.Conllections家族 

  • Java集合框架是一个包含一系列实作可重复使用集合的数据结构的类别和界面集合
  • Java集合大致可以分为两大体系,一个是Collection,另一个是Map

 

三. 黑帮的帮规 

集合 (Java Platform SE 8) (oracle.com)

  • lterables集合层次结构中的根接口,可以理解为保护伞
  • 一般黑老大不会自己出手,会让手下三个组织来办事,所以用的时候找类来实现
  • 黑老大定下的规矩(方法),手下三个组织必须遵守。其实就是Collection的方法,实现的三个接口List,Queue,Set必须重写方法。

 四.ArrayList

 ArrayList (Java Platform SE 8 ) (oracle.com)

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

ArrayList 继承了 AbstractList ,并实现了 List 接口可以自动扩容

 1.添加

这个E代表泛型,表示任意变量类型。 

public void arrayListTest() {// 任意类型ArrayList arrayList = new ArrayList();arrayList.add(1);arrayList.add(4.3);arrayList.add("C");arrayList.add("fuck");System.out.println(arrayList);// 规定为String类型,泛型限定ArrayList<String> arrayList1 = new ArrayList<>();arrayList1.add("fu");arrayList1.add("ck");System.out.println(arrayList1);}

 

泛型也可以是对象,创建一个Student类 

package com.array;public class Student {private String name;private int age;public Student() {}public Student(String name,int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}
 public void arrayListTest() {// 泛型为StudentArrayList<Student> arrayList = new ArrayList<>();arrayList.add(new Student("fuck",22));arrayList.add(new Student("LiLi",33));System.out.println(arrayList);}

 

还有一种添加可以指定下标位置。 

  public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(3);// 添加下标时,要注意添加的位置,添加的位置已有的位置前或中间,不能是后面。arrayList.add(0,0);arrayList.add(2,2);System.out.println(arrayList);}

2.合并 

  public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(3);// 添加下标时,要注意添加的位置,添加的位置已有的位置前或中间,不能是后面。arrayList.add(0,0);arrayList.add(2,2);ArrayList<Integer> arrayList1 = new ArrayList<>();arrayList1.add(4);// 将arrayList1合并到arrayListarrayList.addAll(arrayList1);System.out.println(arrayList);}

 它是如何实现的,看源码

集合转换成普通数组,拷贝数组并返回。 

第二种是选择下标插入,非常简单与添加使用的方式一样,我应该不用说了。

3.将集合转换成数组

public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);// 需要Object类型的数组去接收Object[] array = arrayList.toArray();for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}}

4.清空与拷贝 

 public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);System.out.println(arrayList);// 清空arrayList.clear();System.out.println(arrayList);}

 public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);System.out.println(arrayList);ArrayList<Integer> arrayList1 = (ArrayList<Integer>) arrayList.clone();// 拷贝System.out.println(arrayList1);}

5. 查看集合中是否有这个元素

 public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);// 返回boolean类型boolean number1 = arrayList.contains(3);System.out.println(number1);boolean number2 = arrayList.contains(5);System.out.println(number2);}

 

6. 获取集合的容量与需要的下标值,与任何遍历

集合之所以可以直接输出不用遍历,是因为它重新了toString方法。

public void arrayListTest() {// 泛型为整数与浮点数时要使用他们的包装类ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);// 集合容量System.out.println(arrayList.size());// 下标为2的值int indexTwo = arrayList.get(2);System.out.println(indexTwo);// 遍历,并给每一个元素加2,// 遍历的作用:不仅要输出,还有操作// 方法一:for循环数组遍历时使用length,而集合遍历使用sizefor (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i)+2+"\t");}System.out.println();// 方法二:增强for循环for (Integer value : arrayList) {System.out.print(value+2+"\t");}

7. 给值找下标

  public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");arrayList.add("LiLi");arrayList.add("Fuck");arrayList.add("JiJi");// 从前往后,查找最近的System.out.println(arrayList.indexOf("Fuck"));// 从后往前,查找最近的System.out.println(arrayList.lastIndexOf("Fuck"));}

8. 查看集合是否为空

public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");// 集合是否为空System.out.println(arrayList.isEmpty());ArrayList<String> arrayList1 = new ArrayList<>();// 集合是否为空System.out.println(arrayList1.isEmpty());}

9. 删除

 public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");arrayList.add(null);System.out.println(arrayList);// 指定值删除,删除值为空的System.out.println(arrayList.remove(null));System.out.println(arrayList);}

public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");arrayList.add(null);System.out.println(arrayList);// 指定下标删除,删除值为空的System.out.println(arrayList.remove(3));System.out.println(arrayList);}

 

 public void arrayListTest() {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Man");arrayList.add("Tom");arrayList.add("Fuck");arrayList.add(null);System.out.println(arrayList);ArrayList<String> arrayList1 = new ArrayList<>();arrayList1.add("Fuck");arrayList1.add(null);// 根据arrayList1集合元素删除arrayList里的相同元素arrayList.removeAll(arrayList1);System.out.println(arrayList);}

 10.两个集合取交集(相同元素)

 public void arrayListTest() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);System.out.println(arrayList);ArrayList<Integer> arrayList1 = new ArrayList<>();arrayList1.add(3);arrayList1.add(5);System.out.println(arrayList1);// 取交集System.out.println(arrayList.retainAll(arrayList1));// 原理是取完交集后,放在arrayList中System.out.println(arrayList);}

11. 替换

 public void arrayListTest() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);System.out.println(arrayList);// 把3替换成4arrayList.set(2,4);System.out.println(arrayList);}

12.排序与倒序 

 由于此方法要使用拉姆达表达式,使用我们采用另一种方法。 

集合 (Java Platform SE 8 ) (oracle.com)

public void arrayListTest() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(7);arrayList.add(4);arrayList.add(0);arrayList.add(44);System.out.println(arrayList);// 排序,从小到大Collections.sort(arrayList);System.out.println(arrayList);// 倒序Collections.reverse(arrayList);System.out.println(arrayList);}

 13.取指定下标范围的值

public void arrayListTest() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(7);arrayList.add(4);arrayList.add(0);arrayList.add(44);System.out.println(arrayList);// 查找下标1到3的值;System.out.println(arrayList.subList(1,4));// 之所以下标是1-4是因为,这个查找原理是这样的:1 <= 下标范围 < 4}

五.Linked链表

  • ArrayList数组集合,增删慢,查询快
  • LinkedList链表集合,增删快,查询慢

 数组集合之所以增删慢,是因为增删时集合内元素要移动

 链表集合增删快,是因为链表集合增删时内部元素不需要移动

六.LinkedList一带而过 

  • 链表是数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址
  • 链表可分为单向链表和双向链表
  • 由于黑老大定下的规矩,所以它跟ArrayList方法差不多相同。

LinkedList (Java Platform SE 8 ) (oracle.com)

 七.iterator 迭代器初试

  • 迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需目标或结果
  • 每一次对过程的重复被称为一次“迭代”,而每一次迭代的结果会被用来作为下一次迭代的初始值

 迭代器Iterator用于Conllections家族 ,不管用于ArrayList还是LinkedList都可以迭代输出

 public void arrayListTest() {// 数组集合ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Tom");arrayList.add("Fuck");arrayList.add("Lise");// 使用方式Iterator<String> iterator = arrayList.iterator();// hasNext()判断是否有值while (iterator.hasNext()) {String value = iterator.next();System.out.println(value);}}

public void arrayListTest() {// 链表集合LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Tom");linkedList.add("Fuck");linkedList.add("Lise");// 使用方式Iterator<String> iterator = linkedList.iterator();// hasNext()判断是否有值while (iterator.hasNext()) {String value = iterator.next();System.out.println(value);}}

八.fori、增强for、迭代器的区别、谈谈三者性能

  • for循环适合数据的读取与修改
  • 增强for循环适合数据的读取
  • Iterator不要使用for循环嵌套使用,适合数据的读取与修改
      public void arrayListTest() {// 链表集合LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Tom");linkedList.add("Fuck");linkedList.add("Lise");// 使用方式Iterator<String> iterator = linkedList.iterator();// hasNext()判断是否有值while (iterator.hasNext()) {String value = iterator.next();// 删除Tomif (value.equals("Tom")) {// 要使用iterator自带的remove()方法iterator.remove();}}System.out.println(linkedList);}

增强for循环是一个小型的迭代器了,如果一定要在增强for循环中修改集合的话可以使用迭代器,但不建议在增强for循环中直接修改

 谈谈三者性能:比较时间复杂度

如果是 ArrayList ,用三种方式遍历的速度是for循环>Iterator>增强for循环,速度级别基本一致,一般都会用for循环或者增强for循环,因为Iterator写法相对复杂一些


如果是 LinkedList,则三种方式遍历的差距很大了,数据量大时越明显,Iterator>增强for循环>>>for循环,推荐使用增强for循环或者Iterator

List遍历:for,foreach Iterator 速度比较_list迭代器遍历执行慢-CSDN博客

九.Set和HashSet 

 HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合,允许有 null 值,是无序的,即不会记录插入的顺序。

 public void setTest() {// 使用Hash函数实现HashSet,元素无序,且不重复HashSet<String> hashSet = new HashSet<>();hashSet.add("Tom");hashSet.add("Fuck");hashSet.add("LiLi");hashSet.add("LiLi");hashSet.add("Fuck");System.out.println(hashSet);// 之所以输出后没有顺序且是唯一,是由于hashSet的每一个元素都会给应该hash值// hash值相当与身份证,不重复是唯一的}

关于Java的Hash算法的深入理解-CSDN博客

十.LinkedHashSet 

如果要创建有序集合呢?LinkedHashSet便是有序的不重复的

 public void setTest() {LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();linkedHashSet.add("Tom");linkedHashSet.add("Fuck");linkedHashSet.add("LiLi");linkedHashSet.add("LiLi");linkedHashSet.add("Fuck");System.out.println(linkedHashSet);}

十一.Map、HashMap、Entry 

 HashMap (Java Platform SE 8 ) (oracle.com)

 public void mapTest() {// 有两个泛型:第一个为key(钥匙),第二个为value(值)HashMap<Integer,String> hashMap = new HashMap<>();hashMap.put(10000000,"Fuck");hashMap.put(10000001,"Tom");hashMap.put(10000002,"LiLi");hashMap.put(10000003,"Man");System.out.println(hashMap);// 1.输出编号为10000000的人String value = hashMap.get(10000000);System.out.println(value);// 2.删除编号10000001的人hashMap.remove(10000001);System.out.println(hashMap);// 3.是否包含编号为10000002的人与叫Fuck的人System.out.println(hashMap.containsKey(10000002));System.out.println(hashMap.containsValue("Fuck"));// 4.替换编号为10000003的人的名字为DoghashMap.replace(10000003,"Dog");System.out.println(hashMap);// 5.保存编号Set<Integer> keys = hashMap.keySet();System.out.println(keys);// 6.保存编号与名字Set<Map.Entry<Integer, String>> entrySet = hashMap.entrySet();System.out.println(entrySet);}

已经存在的键值对,再次.put()会替换原来的,.get()不存在的值会返回null 

十二. Entry与Map转换Set之后遍历: Iterator<Entry<Integer,Integer>> iterator = entrySet.iterator(); 

  • 之所以使用Entry把Map转换Set是因为之后方便遍历
  • Entry就是用来管理键值对对象的,将对象包裹起来,提供遍历的方式
  • Entry可以使用迭代器,筛选值,但只适合在内存中使用,不适用于JDBC
  public void MapTest() {HashMap<Integer,Integer> hashMap = new HashMap<>();System.out.println("学生准考证号与成绩");hashMap.put(10000000,88);hashMap.put(10000001,49);hashMap.put(10000002,53);hashMap.put(10000003,83);hashMap.put(10000004,71);System.out.println(hashMap);System.out.println("80分以上的分数");// 使用Set保存学生准考证号与成绩方便遍历Set<Map.Entry<Integer,Integer>> entrySet = hashMap.entrySet();// 使用ArrayList保存80分以上的分数ArrayList<Integer> arrayList = new ArrayList<>();// 迭代器的泛型是Map.Entry<Integer,Integer>不要出错Iterator<Map.Entry<Integer,Integer>> iterator = entrySet.iterator();while (iterator.hasNext()) {// 取出学生成绩放入vaLueint value = iterator.next().getValue();// 判断80分以上的分数if (value > 80) {arrayList.add(value);}}System.out.println(arrayList);}

 

 十三.LinkedHashMap

HashMap是无序的,可以自定义泛型,而LinkedHashMap相当于有序的HashMap 

LinkedHashMap (Java Platform SE 8 ) (oracle.com) 

 

十四.集合框架部分结束 

剩下的类需要自己去学习了!了解各类是怎么实现的,以及其之间的区别,JDK的新特性暂时用不到,还没学习到框架 

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

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

相关文章

Mac如何配置Java环境

想必很多小伙伴会遇到配置Java环境的情况&#xff0c;今天就跟大家一起分享下我的安装过程&#xff0c;记录一下也是留给需要的小伙伴学习 一、下载和安装JDK 登录OracleJDK官网&#xff1a;https://www.oracle.com/java/technologies/downloads/&#xff0c;或者OpenJDK官网…

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

反网络爬虫的三个阶段

随着网络爬虫的普及和网络攻击的日益复杂&#xff0c;升级网络安全措施成为保护网站和应用程序免受恶意爬虫侵害的必要举措。本文将深入研究反网络爬虫的三个阶段&#xff0c;并详细探讨IP地址过滤的策略&#xff0c;以提升网络的安全性。 第一部分&#xff1a;反网络爬虫的三…

射频芯片CMT2310-DEMO 通信覆盖测试体验

CMT2310是一款超低功耗,高性能的射频收发器,申请一套原厂CMT2310演示demo来验证下Sub-868设备在国内城市环境通信覆盖效果。 城市道路实测情况 测试小结&#xff1a;设备已基于外置天线&#xff0c;且以最佳方位做验证&#xff0c;但测试结果数据不是很理想。

Vue3 性能优化

代码分析 由于我们使用的是vite vite打包是基于rollup 的我们可以使用 rollup 的插件 npm install rollup-plugin-visualizervite.config.ts 配置 记得设置open 不然无效 import { visualizer } from rollup-plugin-visualizer; plugins: [vue(), vueJsx(),visualizer({open:…

【PS】制作 素描 + 遗照

复制一个图层 图像-调整-黑白 图片变成黑白图片&#xff08;好像遗照啊&#xff09; 新建一个图层&#xff0c;按住ATLDETELED 填充图层颜色为白色 &#xff08;设置一下颜色&#xff09; 设置混合模式为&#xff1a;颜色减淡 设置前景色为黑色。 选择毛笔工具&#xff0c;在…

贝叶斯球快速检验条件独立

贝叶斯球 定义几个术语&#xff0c;描述贝叶斯球在一个结点上的动作&#xff1a; 通过&#xff08;pass through&#xff09;&#xff1a;从当前结点的父结点方向过来的球&#xff0c;可以访问当前结点的任意子结点&#xff08;父->子&#xff09;。从当前节点的子结点方向…

格雷编码(转换与计算)附代码

目录 格雷码对应表 格雷码转换公式 公式1 公式2 代码实现 格雷码对应表 十进制数 4位自然二进制码 4位典型格雷码 0 0000 0000 1 0001 0001 2 0010 0011 3 0011 0010 4 0100 0110 5 0101 0111 6 0110 0101 7 0111 0100 8 1000 1100 9 1001…

十五、W5100S/W5500+RP2040之MicroPython开发<Modbus示例>

文章目录 1. 前言2. 相关网络信息2.1 简介2.2 指令构成2.3 优点2.4 应用 3. WIZnet以太网芯片4. Modbus TCP通信示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代&#xff0c;Micr…

C语言-第十六周做题总结

id:374 A.求最大值及其下标 题目描述 本题要求编写程序&#xff0c;找出给定的n个数中的最大值及其对应的最小下标&#xff08;下标从0开始&#xff09;。 输入 输入在第一行中给出一个正整数n&#xff08;1<n≤10&#xff09;。第二行输入n个整数&#xff0c;用空格分开…

ApsaraMQ Serverless 演进之路,助力企业降本

作者&#xff1a;家泽 ApsaraMQ 与时俱进&#xff0c;砥砺前行 阿里云消息队列从诞生开始&#xff0c;至今已有十余年。今年&#xff0c;阿里云消息产品全面品牌升级为 ApsaraMQ&#xff0c;与时俱进&#xff0c;砥砺前行。 2012 年&#xff0c;RocketMQ 诞生于集团内部&…

【Linux系统基础】(4)在Linux上部署Tomcat、Nginx软件

Tomcat安装部署【简单】 简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个W…

锐捷ssh配置

配置实例 ssh-Server ssh-Server(config)#enable service ssh-server // 启用ssh服务 ssh-Server(config)#username admin privilege 15 password Test123456 // 设置ssh登陆的账户密码 ssh-Server(config)#line vty 0 4 ssh-Server(config-line)#transport input ssh …

线性回归简介

线性回归简介 1、情景描述2、线性回归 1、情景描述 假设&#xff0c;我们现在有这么一张图&#xff1a; 其中&#xff0c;横坐标x表示房子的面积&#xff0c;纵坐标y表示房价。我们猜想x与y之间存在线性关系&#xff1a; y k x b ykxb ykxb 现在&#xff0c;思考一个问题&…

纯HTML代码实现给图片增加水印并下载保存到本地

<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, user-scalableno"/><title>图片水印打码工具-宋佳乐博客</tit…

计算机图形学理论(3):着色器编程

本系列根据国外一个图形小哥的讲解为本&#xff0c;整合互联网的一些资料&#xff0c;结合自己的一些理解。 CPU vs GPU CPU支持&#xff1a; 快速缓存分支适应性高性能 GPU支持&#xff1a; 多个 ALU快速板载内存并行任务的高吞吐量&#xff08;在每个片段、顶点上执行着色…

nn.Embedding()个人记录

维度 import torch.nn as nnembedding nn.Embedding(num_embeddings 10, embedding_dim 256) nn.Embedding()随机产生一个权重矩阵weight&#xff0c;维度为&#xff08;num_embeddings, embedding_dim&#xff09; 输入维度&#xff08;batch_size, Seq_len&#xff09…

基于Java+SpringBoot+MyBatis-plus+Vue前后端分离小区管理系统设计与实现2.0

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

力扣日记12.24-【二叉树篇】236. 二叉树的最近公共祖先

力扣日记&#xff1a;【二叉树篇】236. 二叉树的最近公共祖先 日期&#xff1a;2023.12.24 参考&#xff1a;代码随想录、力扣 ps&#xff1a;提前祝 平安夜快乐&#xff01; 236. 二叉树的最近公共祖先 题目描述 难度&#xff1a;中等 给定一个二叉树, 找到该树中两个指定节点…

Python连接数据库

文章目录 一、安装mysql二、SQLyog可视化操作三、python实现数据库单表类封装1. config 文件——config.py2. 封装类&#xff08;model&#xff09;——model.py3. 测试文件——test.py 一、安装mysql 官网安装&#xff0c;或者Windows64位直接在我的资源里面上传了mysql&…