Java(二)——方法与数组

文章目录

  • 方法与数组
    • 方法
      • 方法的定义
      • 方法的执行
      • 实参与形参
      • 方法重载
      • 方法签名
    • 数组
      • 创建与初始化
      • 数组的类型
      • 数组应用
        • 转字符串
        • 排序
        • 查找(二分)
        • 填充
        • 拷贝
        • 判等
      • 二维数组
        • 创建及初始化
        • 遍历
        • 本质和内存分布
        • 不规则二维数组

方法与数组

方法

什么是方法?

方法就是一个代码片段,Java的方法类似于C语言的函数,方法的意义在于:

  • 能够模块化地组织代码
  • 能偶做到代码被重复使用,而不需要重新写一份,一份代码可以在多个位置使用
  • 便于理解代码,增加代码可读性

方法的定义

方法的语法格式

修饰符 返回值类型 方法名称(参数类型 形参……){方法具体代码;[return 返回值];
}

与C语言对比,Java的方法定义多了修饰符,且代码风格规定花括号不换行。

我们实现一个简单的两个整数的加法方法:

public static int add(int x, int y){return x + y;
}

注意:

  • Java学习初期,修饰符固定写public static即可,这部分知识从类和对象部分开始
  • 返回值类型必须与返回的实体类型一致,如果没有返回值,返回类型处写成void
  • 方法命名建议采用小驼峰命名方式,即从第二个单词开始,首字母大写,例如sumOfScore
  • 在Java中方法必须写在类中
  • Java中方法不能嵌套定义
  • Java中没有方法声明一说,如果将方法的定义写在了调用前,也是没问题的

方法的执行

方法的调用过程:

调用方法——>传递参数——>找到方法地址——>执行被调方法的方法体——>被调方法结束返回——>回到主调方法继续往下执行


实参与形参

与C语言一样,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值。

在Java中,实参永远都是拷贝到形参中,形参和实参本质是两个实体

以交换两数为例:

    public static void swap(int x, int y){int tmp = x;x = y;y = tmp;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int a = scanner.nextInt();int b = scanner.nextInt();System.out.println("交换前" + "a:" + a + " " + "b:" + b);swap(a, b);System.out.println("交换后" + "a:" + a + " " + "b:" + b);}

在这里插入图片描述

【分析】

实参a和b是main方法中的两个变量,其空间在main方法的栈中,而形参x和y是swap方法中的两个变量,x和y的空间在swap方法运行时的栈中,因此:a和b与x和y是没有任何关联的。

在swap方法调用时,只是将实参a和b中的值拷贝了一份传递给了形参x和y,所以对形参x和y的操作对实参a和b没有影响。

对于基础类型来说,形参相当于实参的拷贝,即传值调用。那么我们怎么使用方法来交换两个变量的值呢?

引用类型参数(例如数组):

    public static void swap(int[] array){int tmp = array[0];array[0] = array[1];array[1] = tmp;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int[] array = new int[2];array[0] = scanner.nextInt();array[1] = scanner.nextInt();System.out.println("交换前:" + array[0] + " " + array[1]);swap(array);System.out.println("交换前:" + array[0] + " " + array[1]);}

在这里插入图片描述


方法重载

用一种情景引入:

public static int add(int x, int y) {return x + y;
}

如上,我们实现了一个整数加法方法。如果我们这时候想求两个double类型数据的和,上面的方法不适用了,我们该怎么办?

首先想到的是再实现一个方法,针对double类型,这确实可以解决问题,麻烦的一点是,我们需要提供许多不同的方法名,调用时还需要考虑调用哪个,而这些方法的逻辑都是相加。针对这个问题,Java提供了方法重载,允许将上述方法名都写成同一个,例如add

方法重载的概念

在Java中,如果多个方法的名字相同,参数列表不同,则称该几种方法被重载了。

【代码示例】

    public static int add(int x, int y) {return x + y;}public static double add(double x, double y){return x + y;}public static int add(int x, int y, int z){return x + y + z;}public static void main(String[] args) {System.out.println(add(10, 20));System.out.println(add(1.5, 2.5));System.out.println(add(10, 20, 30));}

在这里插入图片描述

没有报错,结果也没有问题。

在这里插入图片描述

在IDEA上也会有相应的提示。

什么情况下叫方法的重载?

  • 方法名一样
  • 参数列表不一样,参数的【个数、类型、顺序】
  • 与返回值无关(也就是说,只有返回值不一样,两个方法不能称为构成重载)
  • 这样的若干个方法互为方法的重载

编译器在编译代码时,会对实参类型进行推演,根据推演的结果来确定调用哪个方法。


方法签名

在同一个作用域中不能定义两个相同的标识符。那么为什么类中就可以定义方法名相同的方法呢?

因为有方法签名,重载方法的函数名虽然相同,但是它们的方法签名不同。

方法签名即,经过编译器编译修改后的最终的名字。完整名字包含:

方法全路径名 + 参数列表 + 返回值类型

我们可以使用JDK自带的javap反汇编工具查看,具体操作:

  1. 在源代码目录打开cmd
  2. 使用javac编译生成.class文件,如果源代码有汉字,那么要统一编码
  3. 输入:javap -v 字节码文件名

在这里插入图片描述

完成后寻找签名:

在这里插入图片描述

  • work是类名

  • add是方法名

  • 括号里的内容代表方法的参数列表信息

  • 括号后面代表返回值信息

  • 如图,I表示int类型,D表示double类型,更多的信息如下:

    在这里插入图片描述


数组

学过C语言的小伙伴应该对数组了解不少也使用了很多吧,接下来我们介绍一下Java中的数组。

创建与初始化

数组的创建

C语言中,创建一个数组通常这么写:

int array[10];

C语言形式有以下特点:

  • 数组名在方括号的左边
  • 如果不初始化,方括号中必须给定数组大小,且必须是整型常量

array是数组名,类型认为是int[10],这与我们创建变量的规则类型 + 变量名不符。所以,Java不倾向于这样写。

Java创建一个数组有以下常见写法:(注意事项均在注释中给出)

int array1[];//与C语言的风格类似,不过Java中的[]中不能写数字,要是空的,否则报错
int[] array2;//第三种的简写版,符合 类型+变量名 的习惯,[]中仍然不能写数字,否则报错
int[] array3 = new int[10];//看起来最难懂的,是第二种的完整版,前面的[]必须为空,后面的[]中不能为空,且这种写法不能直接花括号初始化,具体怎么初始化见数组的初始化的内容。

数组的初始化

常见的初始化方式有三种:

int array1[] = {1, 2, 3};  
int[] array2 = {1, 2, 3};   
int[] array3 = new int[]{1, 2, 3};
  • 前两种初始化都是基于创建的前两种进行初始化的
  • 第三种初始化与上面第三种创建方式相似,需要注意的是:
    1. 第二个[]必须为空
    2. 第二个方括号后不需要加=,直接花括号初始化即可

了解到这,我们看一下第三种的错误写法,这里很易混

int array[] = new int[3] = {1, 2, 3};//ERROR,错误的,第二个方括号必须是空
int array[] = new int[];//ERROR,错误的,没有初始化,第二个方括号不能为空

如果我们没有对数组进行初始化,数组中的元素有其默认值:

  • 如果数组中存储的是基本类型,默认值如下表:

    在这里插入图片描述

  • 如果数组中元素存储的是引用类型,默认值是null

不过,在Java中也允许使用C语言的书写方式,这并不会报错

数组的使用

【数组元素的访问】

与C语言一样,Java中的数组是一块连续的空间,空间的编号都是从0开始,该编号称为数组的下标,通过下标就可以访问数组元素了,所以对于有5个元素的数组,它的元素下标从0 ~ 4。

public static void main(String[] args) {int[] array = new int[]{1, 2, 3, 4, 5};System.out.println(array[0]);System.out.println(array[1]);System.out.println(array[2]);System.out.println(array[3]);System.out.println(array[4]);
}

在这里插入图片描述

【数组的遍历】

我们介绍三种数组遍历的方式,它们均能打印出所有的数组元素。

int[] array = new int[]{1, 2, 3, 4, 5};//1.for循环遍历   
for (int i = 0; i < array.length; i++) {  System.out.print(array[i] + " ");
}//2.foreach循环遍历,增强型for循环
for (int x:array) {   System.out.print(x + " ");
}//3.导入包,使用 Arrays.toString
import java.util.Arrays;
System.out.println(Arrays.toString(array));

在这里插入图片描述

我们看到三种方式都将数组元素打印出来了。

  • 我们使用for循环打印时,要考虑循环次数,就是数组容量大小,Java中不存在C语言的sizeof,Java中通过数组对象.length获取数组长度,如上面的代码所示。

  • foreach更方便,不过功能没有for循环强大。for后面的括号中有一个,它的右边是集合的名称,左边是集合元素类型+变量名(自定义的)。不过,在需要使用到下标(索引)的情景下,foreach循环就无能为力了。

  • 第三种方式是将数组元素转换成字符串类型,然后进行打印,打印的格式是固定如此的。

数组的类型

数组是引用类型,引用类型不直接存储数据值,而是存储对数据的引用的类型。

说到引用类型,不得不先了解JVM的内存划分:

在这里插入图片描述

我们发现这与C语言的内存划分不同。

我们这里仅理解 运行时数据区虚拟机栈 即可。

  • 虚拟机栈就是我们C语言学习过程中常说的栈:

    存储与方法调用相关的信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含:局部变量表、操作数栈、动态链接、返回地址等其他信息。比如局部变量。当方法运行结束后,即栈帧中保存的数据也会被销毁

  • 与C语言的堆不同,C语言动态开辟的内存都是在堆上,而Java的堆:

    JVM所管理的最大内存区域,使用new创建的对象都是在堆上保存,堆是随着程序开始运行而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁

引用数据类型创建的变量,一般称作对象的引用,其空间中存储的是对象所在空间的地址。

我们观察一个代码:

    public static void main(String[] args) {int[] array = new int[]{1, 2, 3, 4, 5};System.out.println(array);}

打印结果如下:

在这里插入图片描述

对于这个打印结果:

  • [表示 引用变量array指向的是一个数组对象
  • I表示其指向的数组对象的每个元素都是int类型
  • @是分割符
  • 1b6d3586可以理解为 “地址”

看下面段代码:

    public static void Test(){int a = 10;int b = 20;int[] array = new int[]{1, 2, 3, 4, 5}}

在这里插入图片描述

调用Test函数时,会为Test方法在栈上创建一个栈帧,Test栈帧内创建了局部变量abarray,由于ab都是基本类型,所以在栈区存储的就是其数据,array是引用类型,所以它存储的是指向数组对象的"地址",引用变量array创建时,同时会在堆区开辟一块空间,这块空间存储数组对象的数据。array变量存储的"地址"指向堆上指定位置的数组对象,我们常说:“引用指向了对象”。

再看一段代码:

    public static void main(String[] args) {int[] array1 = new int[]{1, 2, 3, 4, 5};int[] array2 = new int[]{6, 7, 8, 9, 0};array1 = array2;}

这段代码中array1 = array2的效果是什么?这是引用变量的相互赋值。

效果是:array1引用指向了array2引用指向的对象。

在这里插入图片描述

我们通过代码验证一下:

    public static void main(String[] args) {int[] array1 = new int[]{1, 2, 3, 4, 5};int[] array2 = new int[]{6, 7, 8, 9, 0};array1 = array2;//赋值后打印验证System.out.println(Arrays.toString(array1));System.out.println(Arrays.toString(array2));System.out.println(array1);System.out.println(array2);}

在这里插入图片描述

引用指向对象,我们可以将一个引用的值赋给另一个引用,就是 “一个引用指向了另一个引用指向的对象”,这时候,其中一个对象没有引用指向它了,Java会自动检测没有引用指向的对象,它在堆上的内存会被自动回收。

空引用

null就是空引用,我们可以给引用变量初始化为空引用。

null就是不指向任何对象的引用,与C语言的NULL类似,都是指一块无效的内存地址。

数组应用

我们这里介绍的是Java内部实现好的功能(类的成员方法),对于数组的这些功能,我们导入包中的Arrays类,便可以直接使用了。

转字符串

介绍遍历数组时我们已经介绍了这一应用:

Arrays.toString()

传入数组即可。

    public static void main(String[] args) {int[] array = new int[]{1, 2, 3, 4, 5};System.out.println(Arrays.toString(array));}

在这里插入图片描述

验证转换后的结果是String类型,我们用一个String类型的变量接收,不会报错。

排序

Arrays.sort()

    public static void main(String[] args) {int[] array = new int[]{9, 8, 7, 6, 5, 4, 3, 2, 1, 0};System.out.println("排序前:");System.out.println(Arrays.toString(array));System.out.println("排序后:");Arrays.sort(array);System.out.println(Arrays.toString(array));}

在这里插入图片描述

  • 此方法默认排升序
查找(二分)

Arrays.binarySearch()

    public static void main(String[] args) {int[] array = new int[]{1, 2, 3, 4, 5};int ret = Arrays.binarySearch(array, 2);System.out.println("查找后的下标为: " + ret);}

在这里插入图片描述

当然,Java中还重载了很多的有关二分查找的类方法,例如:不同类型数据的查找、指定范围内查找

我们再介绍一下指定范围内查找的方法:

    public static void main(String[] args) {int[] array = new int[]{1, 2, 3, 4, 5};int ret = Arrays.binarySearch(array, 0, 2, 3);System.out.println("在下标0~1之间查找:" + ret);}

在这里插入图片描述

这里我们介绍两点:

  • 指定范围内查找,参数有4个,分别是数组、开始点、结束点、待查找值
    值得注意的是,按指定区间查找都是 [) 的, 如果我们想在下标为1~3的区间查找,我们传入的起始值分别要是:1、4

  • 为什么返回值是-3?

    首先-3肯定代表查找失败,此方法内部实现的查找失败的返回值是:return -(low + 1)low就是我们自己实现二分的left

填充

Arrays.fill()

    public static void main(String[] args) {int[] array = new int[10];System.out.println("填充前: " + Arrays.toString(array));Arrays.fill(array, 5);System.out.println("填充后: " + Arrays.toString(array));}

在这里插入图片描述

当然,我们也可以在指定范围内填充,传入的起始点也是遵循[)

    public static void main(String[] args) {int[] array = new int[10];System.out.println("填充前: " + Arrays.toString(array));Arrays.fill(array, 1, 5, 5);System.out.println("填充后: " + Arrays.toString(array));}

在这里插入图片描述

拷贝

Arrays.copyOf()

这个类的方法有两个作用:1. 拷贝 2. 扩容

另外,指定范围内拷贝: Arrays.copyOfRange()

【拷贝功能】

    public static void main(String[] args) {int[] array1 = new int[]{1, 2, 3, 4, 5};int[] array2 = new int[5];System.out.println("拷贝前:" + Arrays.toString(array2));array2 = Arrays.copyOf(array1, 5);System.out.println("拷贝后:" + Arrays.toString(array2));}

在这里插入图片描述

【扩容功能】

    public static void main(String[] args) {int[] array1 = new int[]{1, 2, 3, 4, 5};int[] array2 = new int[5];System.out.println("扩容前:" + Arrays.toString(array2));array2 = Arrays.copyOf(array1, 10);System.out.println("扩容后:" + Arrays.toString(array2));}

在这里插入图片描述

【指定范围内拷贝】

    public static void main(String[] args) {int[] array1 = new int[]{1, 2, 3, 4, 5};int[] array2 = new int[5];System.out.println("拷贝前:" + Arrays.toString(array2));array2 = Arrays.copyOfRange(array1, 1, 3);System.out.println("拷贝下标1~2的元素后:" + Arrays.toString(array2));}

在这里插入图片描述

此外,还有一种数组拷贝的方法:

System.arraycopy()

    public static void main(String[] args) {int[] array1 = new int[]{1, 2, 3, 4, 5};int[] array2 = new int[5];System.out.println("拷贝前:" + Arrays.toString(array2));System.arraycopy(array1, 0, array2, 0, 3);System.out.println("拷贝后:" + Arrays.toString(array2));}

在这里插入图片描述

System.arraycopy(array1, 0, array2, 0, 3);语句的含义是:从array1数组的 0 下标位置开始拷贝 3 个元素到 array2数组,从 0 位置开始。

  • 四个参数待拷贝数组、拷贝起始位置、待存放数组、存放的起始位置、拷贝的元素个数
判等

Arrays.equal()

    public static void main(String[] args) {int[] array1 = new int[]{1, 2, 3, 4, 5};int[] array2 = new int[]{1, 2, 3, 4, 5};System.out.println(Arrays.equals(array1, array2));}

在这里插入图片描述

我们判断两个数组相等不能简单的使用==实现,因为数组名存放的是"地址"。

我们可以调用这样一个方法实现判等操作。

二维数组

二维数组本质上就是一维数组的数组,其每一个元素都是一维数组

创建及初始化
//创建方法一 :规则与一维数组一样,后两个[]内必须有内容,不能为空
数据类型[][] 数据类型 = new 数据类型[行数][列数];//默认都是0//创建方法一并初始化 :此时所有的[]都必须为空
数据类型[][] 数组名称 = new 数据类型[][]{初始化};//创建方法二 :第一种的简写
数据类型[][] 数组名称;//创建方法二并创建 :
数据类型[][] 数组名称 = {初始化};

我们继续将Java与C语言对比:

  • 语句开始的两个[]中不能添加内容

  • C语言中定义二维数组时可以省略行数,而Java中可以省略列数。

    这里针对的是第一种创建方式并初始化的情况,后两个[],这里有一个知识点,就是不规则数组

  • 由于C语言不可省略列数,所以初始化时可以在{}中直接罗列数据,C语言会帮我们区分行列;而Java中不允许,必须在{}内部再加{}来手动区分行数和列数

遍历

双循环遍历即可打印

    public static void main(String[] args) {int[][] array = new int[][]{{1, 2}, {3, 4}, {5, 6}};for (int i = 0; i < 3; i++) {for (int j = 0; j < 2; j++) {System.out.print(array[i][j] + " ");}System.out.println();}}

利用Arrays.deepToString()

    public static void main(String[] args) {int[][] array = new int[][]{{1, 2}, {3, 4}, {5, 6}};System.out.println(Arrays.deepToString(array));}

在这里插入图片描述

foreach循环

    public static void main(String[] args) {int[][] array = new int[][]{{1, 2}, {3, 4}, {5, 6}};for (int[] arraytmp : array) {for (int data : arraytmp) {System.out.print(data + " ");}System.out.println();}}

现在有两个问题:

  1. foreach遍历虽然不需要行数和列数,但是它是有局限性的。如果我们采用第一种方式遍历,我们怎么拿到二维数组的行数和列数呢?每次都要自己数吗?

    当然不用,有办法,就像遍历一维数组时的array.length

2.deepToString能遍历我了解了,前面一维数组介绍的toString不行吗?

    public static void main(String[] args) {int[][] array = new int[][]{{1, 2}, {3, 4}, {5, 6}};System.out.println(Arrays.toString(array));}

在这里插入图片描述

想要真正理解上面的问题,我们得了解二维数组的本质和内存分布

本质和内存分布

二维数组就是一个特殊的一维数组,存储的元素是一维数组的"地址",前面toString打印结果我们都已经见过了。

每一个"地址"都能找到特定的一维数组。

    public static void main(String[] args) {int[][] array = new int[][]{{1, 2}, {3, 4}, {5, 6}};System.out.println(array);System.out.println(Arrays.toString(array));}

在这里插入图片描述

对于第一行打印:

  • [[指二维数组
  • I指每个元素是int类型
  • @是分隔符
  • 后面的是"地址"
  • 所以,二维数组也是一个引用变量,指向了一个数组对象,数组中存放的是引用变量,数组元素数量是行数,每个引用变量指向了一个数组对象,数组中存放的是int类型

根据上述,我们可以画出内存分布图:

图中的地址都是随便给出的,这不重要。

在这里插入图片描述

了解到这,我们可以写出第一种遍历方式的通写形式了:

    public static void main(String[] args) {int[][] array = new int[][]{{1, 2}, {3, 4}, {5, 6}};for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {System.out.print(array[i][j] + " ");}System.out.println();}}

外层循环使用array.length就是行数,内层循环使用array[i].length是列数

不规则二维数组

我们知道,Java中的二维数组的列数可以省略,行数不可以省略,例如:

int[][] array = new int[2][];//不清楚列数

这时候,我们尝试遍历:

    public static void main(String[] args) {int[][] array = new int[2][];for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {System.out.println(array[i][j] + " ");}System.out.println();}}

在这里插入图片描述

抛出了"空指针异常"(Java中没有指针,习惯这么讲),此时没有初始化列:

在这里插入图片描述

我们如果想要使用,必须对列初始化,这就能体现出不规则了。

根据上图,二维数组的每个元素(引用类型)为null,说明不指向任何对象。

    public static void main(String[] args) {int[][] array = new int[2][];array[0] = new int[3];array[1] = new int[5];System.out.println(Arrays.deepToString(array));}

每一行的列数不必相等,这就体现了不规则

进行到这,我们二维数组的两个元素指向了各自的数组对象,此时可以打印了:

在这里插入图片描述

其实,我们也可以通过初始化数组体现不规则:

    public static void main(String[] args) {int[][] array = new int[][]{{1, 3}, {5, 6, 7}};System.out.println(Arrays.deepToString(array));}

在这里插入图片描述


以上就是我们要介绍的内容了,小裤也是边学边总结,如果有问题,希望大家帮忙指正。

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

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

相关文章

Linux-vi、vim

使用Xshell远程登录到Linux主机进行操作 命令行不用全部掌握&#xff0c; 一般编辑大文件&#xff0c;比较复杂的情况下&#xff0c; 我们还是使用Xftp工具&#xff0c; down下来再恢复回去。

AI绘画入门指南:完备的AI绘画学习路线,十分钟把你领进门

2024新风口大揭秘&#xff01;不是直播&#xff0c;也不是短视频&#xff0c;而是AI绘本&#xff01; 有一句话说得好&#xff1a;站在风口上&#xff0c;猪都能飞起来&#xff01;想要用AI拿到大结果&#xff0c;一定要选对大的垂类赛道。 那么&#xff0c;为什么是AI绘本呢…

第二证券股市策略:股票st连续跌停卖不出怎么办啊?

对于接连跌停的st股票买不出&#xff0c;投资者只能早早地挂出跌停托付单等着成交&#xff0c;在当天没有成交&#xff0c;其托付单会被撤销&#xff0c;投资者能够挑选进行隔夜托付卖出时&#xff0c;最好在证券公司清算之后&#xff0c;再进行托付卖出&#xff0c;否则&#…

低空经济之无人机

朋友们&#xff0c;今天来聊聊个超酷的话题——低空经济之无人机&#xff01; 无人机不仅让天空变得触手可及&#xff0c;还带来了无尽的商业可能&#xff0c;简直就是新时代的“空中小助手”啊&#xff01; 说到无人机&#xff0c;你们是不是也和我一样&#xff0c;脑海里立马…

详解JS的URL()和URLSearchParams() API接口

两个 API 接口定义 URL() 构造函数返回一个新创建的 URL 对象&#xff0c;表示由一组参数定义的 URL。 URLSearchParams 接口定义了一些实用的方法来处理 URL 的查询字符串。 快速了解两个 API 在哪里用 以前我们要对地址栏中的 URL 地址进行分析处理&#xff0c;需要自己进…

【Mac】如何解决打开PD虚拟机后Mac无法上网的问题?

问题描述 部分用户在运行Parallels Desktop并打开Windows 11后&#xff0c;发现Windows上网没有问题&#xff0c;但是Mac主机不能访问带域名的网站&#xff0c;而访问带IP的网站没问题&#xff0c;退出Parallels虚拟机以后&#xff0c;Mac网络又恢复正常。 解决办法 退出 Pa…

在哪些地方能用到PMP认证?参加PMP培训怎么选择靠谱?

PMP认证在实际运用中比我们想象的作用要大得多&#xff0c;甚至涉及到了工作、生活各个方面&#xff0c;这其中主要是在工作方面发挥作用&#xff0c;帮助我们在项目管理相关岗位发挥更大的作用。 因为PMP认证是项目管理协会发起&#xff0c;考试也是针对专业项目管理人员的测…

Linux服务器中了病毒后的清理方法

病毒的基础排查 1. 检查计划任务 黑客入侵服务器后&#xff0c;为了让病毒脚本持续执行&#xff0c;通常会在计划任务配置文件里面写入定时执行的脚本任务。 检查命令说明ls -l /var/spool/cron/*查看用户级计划任务配置。有的人喜欢用 crontab -l 命令来排查&#xff0c;这…

探索设计模式的魅力:机器学习赋能,引领“去中心化”模式新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;机器学习赋能&#xff0c;引领“去中心化”模式新纪元 ✨欢迎加入…

商业银行总分支数据分发的核心问题是什么?如何解决?

银行业对一个国家至关重要&#xff0c;关乎国计民生。银行为我国经济建设分配资金&#xff0c;是社会再生产顺 利进行的纽带&#xff0c;它能掌握和反应社会经济活动的信息&#xff0c;为企业和政府作出正确的经济决策提供 必要的依据。通过银行&#xff0c;可以对国民经济各部…

三、安装node_exporter

目录 一、简介 二、下载安装 一、简介 Exporter是Prometheus的指标数据收集组件。它负责从目标Jobs收集数据&#xff0c;并把收集到的数据转换为Prometheus支持的时序数据格式。 和传统的指标数据收集组件不同的是&#xff0c;他只负责收集&#xff0c;并不向Server端发送数据…

Redis:常用数据结构

文章目录 常用数据结构Redis的编码方式查看方式 常用数据结构 Redis当中常用的数据结构如下所示&#xff1a; Redis在底层实现上述数据结构的过程中&#xff0c;会在源码的角度上对于上述的内容进行特定的优化&#xff0c;这样的优化的主要目的是为了实现出节省时间和节省空间…

【挑战30天首通《谷粒商城》】-【第一天】10、环境-docker安装mysql

文章目录 课程介绍一、docker 安装 mysql Stage 1&#xff1a;下载镜像文件 Stage 1-1&#xff1a;打开官网查看镜像 Stage 1-2&#xff1a;拉取镜像 Stage 1-3&#xff1a;查看拉取的镜像 Stage 2&#xff1a;创建实例并启动 A&#xff1a;mysql&#xff08;5.7版&#xff09;…

yolov8添加FPPI评价指标

这里写自定义目录标题 yolov8 中FPPI实现测试中调用 效果结语 续yolov7添加FPPI评价指标 。之前在yolov7中增加了fppi指标&#xff0c;有不少网友问有没有yolov8中增加&#xff0c;最近没有做算法训练&#xff0c;也一直没时间弄。这几天晚上抽了点时间&#xff0c;弄了一下。不…

学习中...【京东价格/评论数据】数据获取方式——采用Selenium★

近期闲来无事学学selenium爬虫技术&#xff0c;参考崔庆才《Python3网络爬虫开发实战》的淘宝商品信息爬取&#xff0c;我也照猫画虎的学了京东的价格和商品评论数据。废话不多说&#xff0c;直接开始吧&#xff01; 1. 浏览器初始化 from selenium import webdriver from se…

红黑树的平衡

1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c…

合合信息:TextIn文档解析技术与高精度文本向量化模型再加速

文章目录 前言现有大模型文档解析问题表格无法解析无法按照阅读顺序解析文档编码错误 诉求文档解析技术技术难点技术架构关键技术回根溯源 文本向量化模型结语 前言 随着人工智能技术的持续演进&#xff0c;大语言模型在我们日常生活中正逐渐占据举足轻重的地位。大模型语言通…

Scala基础

目录 1.安装与运行Scala 任务描述 了解Scala语言 了解Scala特性 安装Scala 运行Scala 2.定义函数识别号码类型 了解数据类型 定义与使用常量、变量 使用运算符 定义与使用数组 任务实现 3.基本语法 1 变量 2 字符串 3 数据类型&操作符 4 条件表达式 5 循环…

idea使用gitee基本操作流程

1.首先&#xff0c;每次要写代码前&#xff0c;先切换到自己负责的分支 点击签出。 然后拉取一次远程master分支&#xff0c;保证得到的是最新的代码。 写完代码后&#xff0c;在左侧栏有提交按钮。 点击后&#xff0c;选择更新的文件&#xff0c;输入描述内容&#xff08;必填…

五分钟“手撕”时间复杂度与空间复杂度

目录 一、算法效率 什么是算法 如何衡量一个算法的好坏 算法效率 二、时间复杂度 时间复杂度的概念 大O的渐进表示法 推导大O阶方法 常见时间复杂度计算举例 三、空间复杂度 常见时间复杂度计算举例 一、算法效率 什么是算法 算法(Algorithm)&#xff1a;就是定…