当前位置: 首页 > news >正文

JavaDS预备知识

集合框架

Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes 。
其主要表现为将多个元素 element 置于一个单元中,对数据进行创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)的操作。即平时我们俗称的增删查改 CRUD 。

在这里插入图片描述

数据结构与算法的概念

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的
集合。

算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

时间复杂度和空间复杂度

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,

由于计算机的飞速发展,计算机的存储容量得到大幅度提高,因此我们现在主要考虑时间复杂度。

时间复杂度

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个数学函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

因此我们使用计算机执行语句的次数来表示时间复杂度,但是在实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。

大O渐进法使用规则:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

一个算法面对不同的问题时,执行语句的次数也会由此不一样,例如我们在一个数组里查找一个数据,如果这个数据就是第一个,那执行次数就是1次,如果是最后一个,那执行次数就是整个数组的长度,也就是算法的执行情况,有三种,最好的情况,平均情况,最坏情况。时间复杂度取算法的最坏情况,因为最坏情况下都能接受,那这个算法就是一个好的算法。


例题:

//求func2的时间复杂度void func2(int N){int count = 0;for (int i = 0; i < 2 * N; i++) {count++;}int m = 10;while(m-- > 0){count++;}}

首先for循环语句一共执行2N次,while语句执行10次,一共执行2N+10 次,使用大O渐进法表示,保留最高阶,剩下2*N,去除2,剩下N,所以时间复杂度为O(N)


    void func3(int N,int M){int count = 0;for (int i = 0; i < N; i++) {count++;}for (int i = 0; i < M; i++) {count++;}}

一共执行次数为N+M,即时间复杂度为O(N+M)


    void func4(){int count = 0;for (int i = 0; i < 100; i++) {count++;}}

语句执行次数为100,是常数化为1,则时间复杂度为O(1)


    void bubbleSort(int[] array){boolean flag = true;for (int i = 0; flag && i < array.length - 1; i++) {flag = false;for (int j = i; j < array.length - i - 1; j++) {if(array[j] > array[j+1]){int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flag = true;}}}}

上面这个是冒泡排序算法,时间复杂度取最坏的情况,假设数组的长度为N,第一轮冒泡排序的执行次数为N-1,第二困轮冒泡排序的执行次数为N-2,以此类推,这个是一个等差数列,使用等差数列的求和公式为N(N-1)/2,使用大O渐进法表示O(N^2)


    int binarySearch(int[] array, int value) {int begin = 0;int end = array.length - 1;while(begin < end){int mid = (begin + end) / 2;if(array[mid] > value){end = mid - 1;}else if(array[mid] < value){begin = mid + 1;}else{return mid;}}return -1;}

二分查找,每次查找,待查询数据都会减少一半,直到数据只剩下一个,假设查找的次数为x,数据总数为N,
(1/2)^ x * N = 1 ; x = logN (以2为底数的对数)


    long factorial(int N) {return N < 2 ? N : factorial(N-1) * N;}

上面是一个求阶乘的递归算法,递归算法的执行次数等于 递归调用次数*每次递归执行的语句次数,所以这个算法的执行总次数 N-2(N>2时)或者 1 (N == 1 || N == 2),时间复杂度为O(N)


    int fibonacci(int N) {return N < 2? N : fibonacci(N - 1)+fibonacci(N-2);}

我们画个图:假设求第八个斐波那契数
在这里插入图片描述
一般情况下,每求一个数都会进行两次递归才能求出,以此类推,时间复杂度为O(N^2)

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法

例题:

    void bubbleSort(int[] array){boolean flag = true;for (int i = 0; flag && i < array.length - 1; i++) {flag = false;for (int j = i; j < array.length - i - 1; j++) {if(array[j] > array[j+1]){int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flag = true;}}}}

冒泡排序使用了一个数组的空间和几个变量的空间,这是常数,所以空间复杂度为O(1)


// 计算fibonacci的空间复杂度?
int[]bonacci(int n) {long[] fibArray = new long[n + 1];fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n ; i++) {fibArray[i] = fibArray[i - 1] + fibArray [i - 2];}return fibArray;
}

新建了一个数组,大小为N+1,则空间复杂度为O(N)


// 计算阶乘递归Factorial的空间复杂度?
long factorial(int N) {return N < 2 ? N : factorial(N-1)*N;
}

空间复杂度为O(N)


    int fibonacci(int N) {return N < 2? N : fibonacci(N - 1)+fibonacci(N-2);}

要注意递归开辟的空间是可以重复利用的,所以如果一个递归要用到之前递归就开辟好的空间,是可以直接拿过来使用的,不用额外开辟新的空间,所以时间复杂度为O(N)

包装类

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharater
booleanBoolean

这里要注意两个包装类,Integer 和 Charater ,除了它们两个之外,其他的包装类都是大写开头即可。

自动装箱(显示装箱)和自动拆箱(显示拆箱)

装箱是指把基本数据类型变为包装类类型的过程。

    public static void main(String[] args) {int a = 10;Integer b = Integer.valueOf(a);//显示装箱Integer c = 10;//自动装箱}

显示装箱是我们自己调用了 valueOf 的方法,自动装箱是底层帮我们自动调用 valueOf 方法


拆箱是指把包装类类型变为基本数据类型的过程

    public static void main(String[] args) {Integer a = 10;int b = a;//自动拆箱int c = a.intValue();//显示拆箱double d = a.doubleValue();//显示拆箱System.out.println(b);System.out.println(c);System.out.println(d);}

在这里插入图片描述
自动拆箱是底层帮我们自动调用Value,显示拆箱就是我们自己调用这个方法,我们可以使用不同的拆箱方法来将数据转化成你想要的基本数据类型,所以Integer这个包装类可以转化成不同的基本数据类型


面试题

说出下面代码的输出结果:

    public static void main(String[] args) {Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a == b);System.out.println(c == d);}

在这里插入图片描述


思路:要想知道结果为什么,我们就要知道装箱的源码:

在这里插入图片描述

当 i 大于等于IntegerCache.low && i 小于等于 IntegerCache.high 时,就会返回数组的某一个数值,否则就会创建一个新对象,如果是返回数组的某一个数值时,那么拆箱比较之后的结果就是相等的,如果创建的是新对象,那进行 == 的比较就是对引用数据类型进行比较时,两个对象不同时那结果自然不用。

在这里插入图片描述

我们翻开IntederCache 数组时,我们可以发现low = -128,high = 127,所以装箱127的时候,就是直接取数组的值,如果装箱128的时候,就会创建新对象,所以结果就是true false


泛型

一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。
泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多类型从代码上讲,就是对类型实现了参数化。


实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?

class MyArray {public Object[] array = new Object[10];public void setArray(int pos, Object value) {array[pos] = value;}public Object getArray(int pos) {return array[pos];}
}public class Test2 {public static void main(String[] args) {MyArray arr = new MyArray();arr.setArray(0,10);arr.setArray(1,"String");arr.setArray(2,3.14);int a = (int)arr.getArray(0);String str = (String)arr.getArray(1);double b = (double)arr.getArray(2);System.out.println(a);System.out.println(str);System.out.println(b);}
}

我们会创建一个Object[]的数组,因为Object是所有类的父类,所以这种数组可以接受不同的数据类型,当我们拿取数组的数组的时候,由于是Object类,就需要强制类型转化。

虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有一种数据类型。而不是同时持有这么多类型。


语法

泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查。此时,就需要把类型作为参数传递。需要什么类型,就传入什么类型

创建

class 泛型类名称<类型形参列表> {// 这里可以使用类型参数
}

类型形参一般使用一个大写字母表示,常用的名称有:
E 表示 Element
K 表示 Key
V 表示 Value
N 表示 Number
T 表示 Type
S, U, V 等等,第二、第三、第四个类型

使用

泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象

实例:

MyArray<Integer> list = new MyArray<Integer>();

要注意:类型形参我们在使用的时候,我们需要使用的是引用数据类型,不能使用基本数据类,所以我们要使用整型的时候,我们应该使用包装类Integer,但是不能使用int。

类型推导(Type Inference)

当编译器可以根据上下文推导出类型实参时,可以省略类型实参的填写

MyArray<Integer> list = new MyArray<>(); // 可以推导出实例化需要的类型实参为 Integer

我们把上面的包含Object数组的类改写成泛型类:

class MyArray<E>{public Object[] array = new Object[10];public void setArray(int pos, E value){array[pos] = value;}public E getAaary(int pos){return (E)array[pos];}
}

由于是泛型,这里使用E,但是我们还是使用Object数组接收不同类型的数据,数据的类型是Object,返回值是E,所以在返回数据的时候我们需要强制类型转化

裸类型(Raw Type)

裸类型是一个泛型类但没有带着类型实参

MyArray arr = new MyArray();

注意: 我们不要自己去使用裸类型,裸类型是为了兼容老版本的 API 保留的机制

我们将上面的代码来实践一下使用:

    public static void main(String[] args) {MyArray<String> arr1 = new MyArray<String>();MyArray<Integer> arr2 = new MyArray<>();//类型推导,省略后面的类型MyArray arr3 = new MyArray();//裸类型不推荐使用,没有编译器检查,是为了兼容老版本}

小结:
1.泛型是将数据类型参数化,进行传递
2.例如:使用 < T > 表示当前类是一个泛型类。
3.泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换

擦除机制

泛型的引入是JDK5开始引入的,在JDK5之前是没有泛型的,所以裸类型是为了兼容JDK5之前的版本,从JDK5版本后泛型使用的是擦除机制。

在编译的过程当中,将所有的T替换为Object这种机制,我们称为:擦除机制。

由于Java会进行静态类型检查,所以如果你使用Integer的泛型,就不能使用String,double等数据进行赋值。

泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

class 泛型类名称<类型形参 extends 类型边界> {//...
}

举个例子:

public class MyArray<E extends Number> {//...
}

这时候我们传入的类型形参就必须是Number或者是Number的子类

    public static void main(String[] args) {Array<Integer> arr1 = new Array<>();Array<Double> arr2 = new Array<>();Array<String> arr3 = new Array<String>();//编译错误 err}

Integer和Double 都是Number 的子类,String 不是Number 的子类,所以使用String 会发生编译报错。


public class MyArray<E extends Comparable<E>> {...
}

这时候E就必须实现Comparable接口

泛型方法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }

举个例子:

    public<E extends Comparable<E>> E find(E[] arr){//...}public static <E extends Comparable<E>> void find(){//...}

方法的泛型类型形参写在 public 等访问权限修饰符 和 static 后面,并且类型形参要保持一致,就是如果使用E就必须统一使用E,不能混用别的类型形参(T等等)


使用:
调用泛型方法时,我们可以在方法前面加上类型参数或者不使用类型参数,和上面一样也有类型推导的机制。

    public static void main(String[] args) {Integer[] a = {1,2,3,4,5,6};MyArray.find(a);MyArray.<Integer>find(a);}

相关文章:

JavaDS预备知识

集合框架 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器 container &#xff0c;是定义在 java.util 包下的一组接口 interfaces和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中&#xff0c;对数据进行创建(Create)、读取(Retrieve…...

日常学习--20240705

1、IO流 按照IO操作的数据类型分为字节流和字符流&#xff1a; 字节流&#xff1a;又分为输入流&#xff08;其他程序传递过来的数据&#xff0c;读取流中的数据&#xff09;和输出流&#xff08;往流中写数据&#xff0c;传递给其他程序&#xff09;;可以操作二进制文件&…...

Java中初始化一个List的多种方式

1.最原始的方式&#xff1a;先创建&#xff0c;然后再添加元素 List<String> list new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry");2.使用Arrays.asList 这是一种快速方便的方式&#xff0c;直接…...

BeikeShop多国语言多货币商城系统源码基于Laravel框架

BeikeShop是基于 Laravel 开发的一款开源商城系统&#xff0c;支持多语言商城 多货币商城 100%全开源 ChatGPT OpenAI B2C商城系统 H5商城 PHP商城系统 商城源码 PC商城 跨境电商系统 跨境商城系统 电商商城系统 Laravel 10 框架开发系统&#xff0c;支持插件市场。 Event 机制…...

gradle构建工具

setting.gradle // settings.gradle rootProject.name my-project // 指定根项目名称include subproject1, subproject2 // 指定子项目名称&#xff0c;可选jar包名称 方式一 jar {archiveBaseName my-application // 设置 JAR 文件的基本名称archiveVersion 1.0 // 设置…...

Java需要英语基础吗?

Java编程语言本身并不要求必须有很强的英语基础&#xff0c;因为Java的语法和逻辑是独立于任何特定语言的。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&am…...

14-36 剑和诗人10 - 用LLM构建 AI 代理平台

介绍 在当今快速发展的技术环境中&#xff0c;大型语言模型 (LLM) 和 AI 代理正在改变我们与信息交互、实现流程自动化以及应对不同行业复杂挑战的方式。随着这些强大的模型不断发展&#xff0c;对能够无缝集成和协调它们的强大平台的需求变得越来越重要。 让我们深入研究设计…...

如何在Java中实现批量数据处理

如何在Java中实现批量数据处理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 在大数据时代&#xff0c;处理大量数据是许多应用程序中必不可少的需…...

项目部署_持续集成_Jenkins

1 今日内容介绍 1.1 什么是持续集成 持续集成&#xff08; Continuous integration &#xff0c; 简称 CI &#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干 持续集成的组成要素 一个自动构建过程&#xff0c; 从检出代码、 编译构建…...

如何选择TikTok菲律宾直播网络?

为了满足用户对于实时互动的需求&#xff0c;TikTok推出了直播功能&#xff0c;让用户能够与粉丝即时交流。本文将探讨如何选择适合的TikTok菲律宾直播网络&#xff0c;并分析OgLive是否是值得信赖的选择。 TikTok菲律宾直播网络面临的挑战 作为全球领先的短视频平台&#xff…...

Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method--论文笔记

论文笔记 资料 1.代码地址 https://github.com/iBelieveCJM/pseudo_label-pytorch 2.论文地址 3.数据集地址 论文摘要的翻译 本文提出了一种简单有效的深度神经网络半监督学习方法。基本上&#xff0c;所提出的网络是以有监督的方式同时使用标记数据和未标记数据来训练的…...

信息收集-arping

信息收集-arping 简介 arping 是一个用于发送 ARP 请求和接收 ARP 回复的工具。它通常用于检查网络中的 IP 地址是否被使用&#xff0c;或发现网络中的重复 IP 地址。arping 工具类似于 ping 命令&#xff0c;但它使用的是 ARP 协议而不是 ICMP 协议。在 Kali Linux 中&#…...

一文了解常见DNS问题

当企业的DNS出现故障时&#xff0c;为不影响企业的正常运行&#xff0c;团队需要能够快速确定问题的性质和范围。那么有哪些常见的DNS问题呢&#xff1f; 域名解析失败&#xff1a; 当您输入一个域名&#xff0c;但无法获取到与之对应的IP地址&#xff0c;导致无法访问相应的网…...

TCP/IP 网络协议族分层

TCP/IP协议族 TCP/IP不单是TCP和IP两个协议&#xff0c;TCP/IP实际上是一组协议&#xff0c;它包括上百个各种功能的协议&#xff0c;如&#xff1a;远程登录、文件传输和电子邮件等&#xff0c;当然&#xff0c;也包括TCP、IP协议 它将软件通信过程抽象化为四个抽象层&#…...

Qt:5.QWidget属性介绍(Enabled属性-控件可用性设置、geometry属性-控件位置/大小设置)

目录 一、 QWidget属性的介绍&#xff1a; 二、Enabled属性-控件可用性设置&#xff1a; 2.1Enabled属性的介绍&#xff1a; 2.2获取控件当前可用状态的api——isEnabled()&#xff1a; 2.3设置控件当前的可用状态的api—— setEnabled() &#xff1a; 2.4 实例&#xff…...

NoSQL 非关系型数据库 Redis 的使用:

redis是基于内存型的NoSQL 非关系型数据库&#xff0c;本内容只针对有基础的小伙伴&#xff0c; 因为楼主不会做更多的解释&#xff0c;而是记录更多的技术接口使用&#xff0c;毕竟楼主不是做教学的&#xff0c;没有教学经验。 关于redis的介绍请自行搜索查阅。 使用redis数据…...

python库(5):Psutil库实现系统和硬件监控工具

1 psutil简介 psutil&#xff08;process and system utilities&#xff09;是一个跨平台库&#xff0c;用于检索运行中进程和系统利用率&#xff08;包括 CPU、内存、磁盘、网络等&#xff09;的信息&#xff0c;可以提供丰富的系统监控功能。 2 psutil安装 pip install -i …...

实验四 图像增强—灰度变换之直方图变换

一&#xff0e;实验目的 1&#xff0e;掌握灰度直方图的概念及其计算方法&#xff1b; 2&#xff0e;熟练掌握直方图均衡化计算过程&#xff1b;了解直方图规定化的计算过程&#xff1b; 3&#xff0e;了解色彩直方图的概念和计算方法 二&#xff0e;实验内容&#xff1a; …...

使用el-col和el-row布局,有版心,一页有两栏布局 三栏布局 四栏布局 使用vue动态渲染元素

使用Vue结合Element UI的el-row和el-col组件来实现版心布局&#xff0c;并动态渲染不同栏数的布局&#xff0c;可以通过以下步骤实现&#xff1a; 定义版心容器&#xff1a;使用el-container来定义整个页面的容器&#xff0c;其中el-header、el-main、el-footer分别定义头部、主…...

中软国际加入龙蜥社区,促进“技术+生态”双向赋能

近日&#xff0c;中软国际有限公司&#xff08;简称“中软国际”&#xff09;签署了 CLA&#xff08;Contributor License Agreement&#xff0c;贡献者许可协议&#xff09;&#xff0c;正式加入龙蜥社区&#xff08;OpenAnolis&#xff09;。 中软国际创立于 2000 年&#x…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...

HTML中各种标签的作用

一、HTML文件主要标签结构及说明 1. <&#xff01;DOCTYPE html> 作用&#xff1a;声明文档类型&#xff0c;告知浏览器这是 HTML5 文档。 必须&#xff1a;是。 2. <html lang“zh”>. </html> 作用&#xff1a;包裹整个网页内容&#xff0c;lang"z…...