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

Java 复习笔记 - 方法篇

文章目录

  • 一,方法的定义
  • 二,最简单的方法定义和调用
  • 三,带参数的方法定义和调用
  • 四,带返回值方法的定义和调用
  • 五,小结
  • 六,方法的重载
  • 七,方法简单练习
    • 1,数组遍历
    • 2,数组最大值
    • 3,判断是否存在
    • 4,复制数组
  • 八,方法的基本内存原理
  • 九,什么是基本数据类型和引用数据类型
  • 十,方法的值传递
  • 十一,综合练习
    • 1,买飞机票
    • 2,找质数
    • 3,开发验证码
    • 4,数组元素的复制
    • 5,评委打分
    • 6,数字加密和解密
    • 7,抢红包
    • 8,双色球彩票系统
    • 9,二维数组
      • (1)二维数组静态初始化
      • (2)二维数组动态初始化
      • (3)二维数组内存图
      • (4)计算每个季度的销售额


在这里插入图片描述

一,方法的定义

在Java中,方法是一段独立的代码块,用于执行特定的任务或操作。方法可以接受输入参数并返回一个值,也可以不接受参数或不返回值。

方法由以下几个组成部分:

  1. 方法签名:方法的名称和参数列表的组合,用于唯一标识一个方法。方法签名包括方法名和参数类型,例如:methodName(parameterType1 parameter1, parameterType2 parameter2, ...)

  2. 方法体:方法体是方法中包含的代码块,实现了特定的功能或逻辑。方法体中的代码会按照顺序执行。

  3. 参数列表:方法可以接受零个或多个参数,参数是方法执行时传递给方法的值。每个参数包括参数类型和参数名称,用逗号分隔。

  4. 返回类型:方法可以返回一个值,也可以不返回值。返回类型指定了方法返回的数据类型。如果方法不返回任何值,则返回类型为 void

方法的定义格式如下:

修饰符 返回类型 方法名(参数列表) {// 方法体
}

其中:

  • 修饰符(可选):用于指定方法的可见性和访问权限,例如 publicprivate 等。
  • 返回类型:指定方法返回的数据类型,如果方法不返回任何值,则返回类型为 void
  • 方法名:方法的名称,用于在代码中调用方法。
  • 参数列表(可选):指定方法接受的参数类型和参数名称。
  • 方法体:方法中包含的代码块,实现具体的功能。

通过定义方法,可以将代码分解为更小的可维护和可重用的模块,提高代码的可读性和可维护性。

二,最简单的方法定义和调用

最简单的方法定义和调用可以按照以下步骤进行:

  1. 方法定义:首先,在类中定义一个方法。可以在类的任何位置定义方法,但通常放在类的最外层。
public class MyClass {// 方法定义public void myMethod() {// 方法体System.out.println("Hello, World!");}
}

上面的代码定义了一个名为 myMethod 的方法,它没有参数,返回类型为 void,在方法体中打印出 “Hello, World!”。

  1. 方法调用:在需要调用方法的地方,使用方法的名称后跟一对圆括号来调用方法。
public class MyClass {// 方法定义public void myMethod() {// 方法体System.out.println("Hello, World!");}public static void main(String[] args) {// 方法调用MyClass obj = new MyClass();obj.myMethod(); // 调用 myMethod 方法}
}

在上面的代码中,我们在 main 方法中创建了一个 MyClass 对象 obj,然后通过 obj.myMethod() 调用了 myMethod 方法。

运行上面的代码,输出结果为 “Hello, World!”。

三,带参数的方法定义和调用

带参数的方法定义和调用可以按照以下步骤进行:

  1. 方法定义:在方法的括号中定义参数。参数可以是任何合法的Java数据类型,可以有多个参数,参数之间用逗号分隔。
public class MyClass {// 带参数的方法定义public void myMethod(String name, int age) {// 方法体System.out.println("Hello, " + name + "! You are " + age + " years old.");}
}

上面的代码定义了一个名为 myMethod 的方法,它接受一个 String 类型的参数 name 和一个 int 类型的参数 age,在方法体中打印出带有参数信息的字符串。

  1. 方法调用:在调用方法时,传入相应的参数值。实际参数的数量、顺序和类型必须与方法定义中的形式参数相匹配。
public class MyClass {// 带参数的方法定义public void myMethod(String name, int age) {// 方法体System.out.println("Hello, " + name + "! You are " + age + " years old.");}public static void main(String[] args) {// 方法调用MyClass obj = new MyClass();obj.myMethod("Alice", 25); // 调用 myMethod 方法并传入参数值}
}

在上面的代码中,我们在 main 方法中创建了一个 MyClass 对象 obj,然后通过 obj.myMethod("Alice", 25) 调用了 myMethod 方法,并传入了一个 String 类型的参数 "Alice" 和一个 int 类型的参数 25

运行上面的代码,输出结果为 “Hello, Alice! You are 25 years old.”。

四,带返回值方法的定义和调用

带返回值的方法定义和调用可以按照以下步骤进行:

  1. 方法定义:在方法的返回类型前面加上返回类型。返回类型可以是任何合法的Java数据类型,包括基本数据类型和引用数据类型。
public class MyClass {// 带返回值的方法定义public int add(int a, int b) {// 方法体int sum = a + b;return sum;}
}

上面的代码定义了一个名为 add 的方法,它接受两个 int 类型的参数 ab,在方法体中计算它们的和,并将结果作为返回值。

  1. 方法调用:在调用方法时,可以使用一个变量来接收方法的返回值。
public class MyClass {// 带返回值的方法定义public int add(int a, int b) {// 方法体int sum = a + b;return sum;}public static void main(String[] args) {// 方法调用MyClass obj = new MyClass();int result = obj.add(5, 3); // 调用 add 方法并接收返回值System.out.println("The sum is: " + result);}
}

在上面的代码中,我们在 main 方法中创建了一个 MyClass 对象 obj,然后通过 obj.add(5, 3) 调用了 add 方法,并将返回值赋给了一个名为 resultint 类型变量。最后,我们使用 System.out.println 打印出结果。

运行上面的代码,输出结果为 “The sum is: 8”。

五,小结

总结一下Java方法的要点:

  1. 方法是一段可重复使用的代码块,用于完成特定的任务。
  2. 方法可以接受输入参数,并且可以有返回值。
  3. 方法定义包括方法的访问修饰符、返回类型、方法名称、参数列表和方法体。
  4. 方法的访问修饰符可以是 public、protected、private 或默认(不写修饰符)。
  5. 返回类型指定了方法执行后的返回值类型,可以是基本数据类型或引用数据类型。
  6. 方法名称应该具有描述性,符合命名规范,以便代码的可读性。
  7. 参数列表指定了方法接受的输入参数的类型和名称。
  8. 方法体是方法的具体实现,包含了执行的代码逻辑。
  9. 方法可以有返回语句来返回一个值,并且返回值的类型必须与方法的返回类型匹配。
  10. 方法可以被其他方法调用,通过方法名和参数列表来调用方法。
  11. 方法的调用可以在同一个类中进行,也可以在不同的类中进行,使用对象名或类名来调用方法。
  12. 方法可以被重载,即在同一个类中可以有多个同名但参数列表不同的方法。
  13. 方法可以被覆盖,即子类可以重写父类中的方法,以实现不同的功能。

以上是关于Java方法的一些要点,掌握了这些内容,就能够熟练地定义和使用方法来完成各种任务。

六,方法的重载

Java方法的重载是指在同一个类中,可以定义多个同名但参数列表不同的方法。方法的重载可以通过参数的个数、类型或顺序进行区分。

重载的方法具有以下特点:

  1. 方法名相同:重载的方法必须有相同的方法名。

  2. 参数列表不同:重载的方法的参数列表必须不同,可以是参数个数不同、参数类型不同或参数顺序不同。

  3. 返回类型可以相同也可以不同:重载的方法可以有相同的返回类型,也可以有不同的返回类型。

  4. 访问修饰符可以相同也可以不同:重载的方法可以有相同的访问修饰符,也可以有不同的访问修饰符。

  5. 重载的方法可以抛出相同或不同的异常:重载的方法可以声明相同的异常,也可以声明不同的异常。

重载的方法用于实现相似功能但参数不同的情况,提高代码的复用性和可读性。在调用重载的方法时,编译器会根据实际传入的参数类型来确定调用哪个方法。如果找不到匹配的方法,则会编译错误。

例如,下面是一个计算两个数相加的示例:

public class Adder {public int add(int a, int b) {return a + b;}public double add(double a, double b) {return a + b;}
}

在上面的示例中,Adder 类中定义了两个名为 add 的方法,一个接受两个 int 类型的参数,另一个接受两个 double 类型的参数。通过参数列表的类型不同,重载了 add 方法,实现了对整数和小数的相加操作。

七,方法简单练习

1,数组遍历

需求:设计一个方法用于遍历数组,要求遍历的结果在一行上的。例如:[11, 12, 13, 14, 15]。

可以通过以下方式设计一个方法来遍历数组,并将结果打印在一行上:

public class ArrayTraversal {public static void main(String[] args) {int[] array = {11, 12, 13, 14, 15};traverseArray(array);}public static void traverseArray(int[] array) {System.out.print("[");for (int i = 0; i < array.length; i++) {System.out.print(array[i]);if (i != array.length - 1) {System.out.print(", ");}}System.out.println("]");}
}

在上面的示例中,定义了一个名为 traverseArray 的方法,接受一个 int 类型的数组作为参数。在方法内部,使用 for 循环遍历数组元素,并在每个元素之后打印逗号和空格(除非是最后一个元素)。最后,打印右括号,完成整个数组的遍历结果。

运行上述代码,输出结果为:[11, 12, 13, 14, 15]

2,数组最大值

需求:设计一个方法求数组的最大值,并将最大值返回。

你可以使用以下方法来设计一个方法,以获取数组中的最大值并返回:

public class ArrayMaxValue {public static void main(String[] args) {int[] array = {11, 12, 13, 14, 15};int maxValue = findMaxValue(array);System.out.println("The maximum value in the array is: " + maxValue);}public static int findMaxValue(int[] array) {int maxValue = array[0];for (int i = 1; i < array.length; i++) {if (array[i] > maxValue) {maxValue = array[i];}}return maxValue;}
}

在上述示例中,我们定义了一个名为 findMaxValue 的方法,它接受一个 int 类型的数组作为参数,并返回数组中的最大值。

在方法内部,我们初始化一个变量 maxValue 并将其设置为数组的第一个元素。然后,我们使用 for 循环遍历数组的剩余元素,并检查每个元素是否大于 maxValue。如果是,则更新 maxValue 的值为当前元素的值。最终,我们返回 maxValue 的值。

运行上述代码,输出结果为:The maximum value in the array is: 15

3,判断是否存在

需求:定义一个方法判断一个数组中的某一个数是否存在,将结果返回给调用处。

你可以使用以下方法来设计一个方法,以判断一个数组中是否存在某个数,并将结果返回给调用处:

public class ArrayContainsNumber {public static void main(String[] args) {int[] array = {11, 12, 13, 14, 15};int number = 14;boolean containsNumber = checkNumber(array, number);System.out.println("The array contains the number " + number + ": " + containsNumber);}public static boolean checkNumber(int[] array, int number) {for (int i = 0; i < array.length; i++) {if (array[i] == number) {return true;}}return false;}
}

在上述示例中,我们定义了一个名为 checkNumber 的方法,它接受一个 int 类型的数组和一个要判断的数作为参数,并返回一个 boolean 类型的值。

在方法内部,我们使用 for 循环遍历数组的每个元素,并检查当前元素是否等于要判断的数。如果相等,则返回 true 表示数组中存在该数。如果遍历完数组后仍未找到相等的数,则返回 false 表示数组中不存在该数。

运行上述代码,输出结果为:The array contains the number 14: true

4,复制数组

需求:定义一个方法copyOfRange(int[] arr, int from, int to)
功能:将数组arr中从索引from(包含from)开始。
到索引to结束(不包含to)的元素复制到新数组中,将数组返回。

你可以使用以下方法来实现将一个数组中指定范围的元素复制到一个新数组中:

public class ArrayCopyOfRange {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6};int from = 2;int to = 5;int[] newArr = copyOfRange(arr, from, to);System.out.print("Original Array: ");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();System.out.print("New Array: ");for (int i = 0; i < newArr.length; i++) {System.out.print(newArr[i] + " ");}}public static int[] copyOfRange(int[] arr, int from, int to) {int[] newArr = new int[to - from];int index = 0;for (int i = from; i < to; i++) {newArr[index] = arr[i];index++;}return newArr;}
}

在上述示例中,我们定义了一个名为 copyOfRange 的方法,它接受一个 int 类型的数组、一个起始索引 from 和一个结束索引 to 作为参数,并返回一个新的 int 类型的数组。

在方法内部,我们首先创建一个新数组 newArr,其长度为 to - from,即要复制的元素的数量。然后,使用一个循环从原始数组的索引 from 开始遍历到索引 to - 1,并将每个元素复制到新数组中。

最后,将新数组返回给调用处。在 main 方法中,我们使用一个示例数组和起始索引 2 和结束索引 5 来测试 copyOfRange 方法。运行上述代码,将输出:

Original Array: 1 2 3 4 5 6
New Array: 3 4 5

八,方法的基本内存原理

在Java中,方法在内存中的执行和存储主要涉及两个概念:栈内存和堆内存。

  1. 栈内存(Stack Memory):

    • 方法调用时,会在栈内存中创建一个新的栈帧(Stack Frame),栈帧中存储了方法的局部变量、参数、方法返回值等信息。
    • 栈内存具有后进先出的特性,每次方法调用时,会将栈帧压入栈顶,方法执行完后,栈帧会被弹出。
    • 栈内存的大小是有限的,当方法的调用层次过深或方法中的局部变量占用空间过大时,可能会导致栈溢出错误(Stack Overflow Error)。
  2. 堆内存(Heap Memory):

    • 对象、数组等动态分配的内存空间都存储在堆内存中。
    • 堆内存的大小一般比较大,不容易被耗尽。
    • 堆内存的分配和释放由Java虚拟机(JVM)的垃圾回收机制负责。

方法的执行过程如下:

  1. 当一个方法被调用时,会在栈内存中创建一个新的栈帧,并将该栈帧压入栈顶。
  2. 栈帧中会包含方法的局部变量、参数以及方法返回值的存储空间。
  3. 方法执行时,会在栈帧中分配内存空间来存储局部变量。
  4. 方法执行完后,栈帧会被弹出,释放相应的内存空间。
  5. 方法的返回值会被保存在栈帧中,并传递给调用方法。

需要注意的是,方法的参数传递是按值传递的,即传递的是变量的副本而不是变量本身。对于引用类型的参数,传递的是引用的副本,而不是引用指向的对象本身。因此,在方法中对参数进行修改,不会影响原始变量或对象的值。

九,什么是基本数据类型和引用数据类型

在Java中,数据类型分为基本数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。

  1. 基本数据类型:
    基本数据类型是Java语言中最基本的数据类型,它们是预定义的,由Java的虚拟机直接支持。基本数据类型包括:

    • 整型(int、short、long、byte)
    • 浮点型(float、double)
    • 字符型(char)
    • 布尔型(boolean)

    基本数据类型的特点:

    • 占用的内存空间固定,不会随着数据的大小而改变。
    • 赋值时直接存储的是数据的值本身,而不是引用。
    • 存储在栈内存中。
  2. 引用数据类型:
    引用数据类型指的是通过类、接口或数组创建的类型。引用数据类型的变量存储的是对象的引用(内存地址),而不是对象本身。

    • 类型(Class)
    • 接口(Interface)
    • 数组(Array)

    引用数据类型的特点:

    • 占用的内存空间大小不固定,由对象的大小决定。
    • 赋值时存储的是对象的引用,通过引用可以访问对象的属性和方法。
    • 存储在堆内存中。
    • 需要通过关键字"new"来创建对象。

需要注意的是,基本数据类型和引用数据类型在传递参数时有所不同。基本数据类型的参数传递是按值传递的,而引用数据类型的参数传递是按引用传递的。即基本数据类型的参数传递是传递值的副本,而引用数据类型的参数传递是传递引用的副本。

十,方法的值传递

在Java中,方法的参数传递采用的是值传递(Pass by Value)。

值传递的意思是在调用方法时,实际参数的值会被复制给形式参数,而方法中对形式参数的修改不会影响到实际参数的值。

具体来说,Java中方法的值传递有以下几点特点:

  1. 基本数据类型的值传递:当将一个基本数据类型作为参数传递给方法时,传递的是该数据的值的副本。在方法内部对形式参数的修改不会影响到实际参数的值。
  2. 引用数据类型的值传递:当将一个对象作为参数传递给方法时,传递的是该对象的引用的副本。在方法内部对形式参数的修改会影响到实际参数指向的对象,但是如果在方法内部将形式参数重新指向一个新的对象,不会影响到实际参数的引用。

下面通过示例代码来说明方法的值传递:

public class Main {public static void main(String[] args) {int a = 10;changeValue(a);System.out.println(a); // 输出:10StringBuilder sb = new StringBuilder("Hello");changeReference(sb);System.out.println(sb.toString()); // 输出:Hello WorldchangeValueReference(sb);System.out.println(sb.toString()); // 输出:Hello Java}public static void changeValue(int num) {num = 20;}public static void changeReference(StringBuilder str) {str.append(" World");}public static void changeValueReference(StringBuilder str) {str = new StringBuilder("Hello Java");}
}

在上述示例中,changeValue方法尝试修改基本数据类型的值,但是对传入的实际参数a没有产生影响。
changeReference方法通过引用类型参数对传入的StringBuilder对象进行修改,影响了实际参数sb的值。
changeValueReference方法尝试将形式参数str指向一个新的StringBuilder对象,但是对实际参数sb没有产生影响。

十一,综合练习

1,买飞机票

需求:机票的价格按照淡季旺季、头等舱和经济舱、输入机票原价、月份和头等舱或经济舱。
按照如下规则计算机票价格:旺季(5-10月)头等舱9折。经济舱8.5折,淡季(11月到来年4月)头等舱7折,经济舱6.5折。

下面是一个示例代码,根据输入的机票原价、月份和头等舱或经济舱,按照规则计算机票价格:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入机票原价:");double originalPrice = scanner.nextDouble();System.out.print("请输入月份(1-12):");int month = scanner.nextInt();System.out.print("请输入舱位(1-头等舱,2-经济舱):");int cabinType = scanner.nextInt();double discount = getCabinDiscount(month, cabinType);double finalPrice = originalPrice * discount;System.out.println("机票折扣后的价格为:" + finalPrice);}public static double getCabinDiscount(int month, int cabinType) {if (month >= 5 && month <= 10) { // 旺季if (cabinType == 1) { // 头等舱return 0.9;} else if (cabinType == 2) { // 经济舱return 0.85;}} else if (month >= 11 || month <= 4) { // 淡季if (cabinType == 1) { // 头等舱return 0.7;} else if (cabinType == 2) { // 经济舱return 0.65;}}return 1.0; // 默认折扣为1,即原价}
}

在上述代码中,我们使用Scanner类获取用户的输入,包括机票原价、月份和舱位类型。
然后,通过调用getCabinDiscount方法计算机票的折扣,该方法根据输入的月份和舱位类型返回相应的折扣率。
最后,把机票原价乘以折扣率得到机票的最终价格,并输出给用户。

例如,如果用户输入机票原价为1000,月份为8,舱位类型为1(头等舱),则输出的机票折扣后的价格为900。

2,找质数

需求:判断101-200之间有多少个素数,并输出索引素数。

下面是一个示例代码,用于判断101-200之间有多少个素数,并输出素数的索引:

public class Main {public static void main(String[] args) {int count = 0;for (int i = 101; i <= 200; i++) {if (isPrime(i)) {count++;System.out.println("第 " + count + " 个素数是:" + i);}}System.out.println("101-200之间共有 " + count + " 个素数");}public static boolean isPrime(int n) {if (n <= 1) {return false;}for (int i = 2; i <= Math.sqrt(n); i++) {if (n % i == 0) {return false;}}return true;}
}

在上述代码中,我们使用一个循环遍历101-200之间的数。对于每个数,调用isPrime方法来判断它是否为素数。如果是素数,则输出该素数的索引(即素数的个数)和值。

isPrime方法实现了判断一个数是否为素数的逻辑。它首先判断如果数小于等于1,则不是素数,直接返回false。然后,使用一个循环从2开始到该数的平方根,依次检查是否能被整除。如果找到能整除的数,则不是素数,返回false。如果循环结束后仍然没有找到能整除的数,则是素数,返回true。

执行以上代码,将输出101-200之间共有多少个素数,并输出每个素数的索引和值。

3,开发验证码

需求:定义方法实现随机产生一个5位的验证码。
验证码格式:长度为5,前面四位是大写的字母或者小写字母,最后一位是数字。

下面是一个实现随机生成一个5位验证码的示例代码:

import java.util.Random;public class Main {public static void main(String[] args) {String code = generateCode();System.out.println("生成的验证码是:" + code);}public static String generateCode() {StringBuilder sb = new StringBuilder();Random random = new Random();// 生成前4位字母for (int i = 0; i < 4; i++) {// 随机生成字母的ASCII码int ascii = random.nextInt(26);// 判断是大写字母还是小写字母char letter = (random.nextBoolean() ? 'A' : 'a');// 拼接字母到验证码sb.append((char)(letter + ascii));}// 生成最后1位数字int number = random.nextInt(10);sb.append(number);return sb.toString();}
}

在上述代码中,我们定义了一个generateCode方法来生成验证码。使用一个StringBuilder对象来拼接生成的字符。

首先,我们使用Random类来生成随机数。在一个循环中,我们生成4个随机字母。通过生成随机的ASCII码(0-25),并根据随机布尔值来决定是生成大写字母还是小写字母。然后,我们将生成的字母拼接到验证码中。

最后,我们使用nextInt(10)生成一个0-9的随机数字,并将其拼接到验证码的最后一位。

执行以上代码,将输出随机生成的5位验证码。

4,数组元素的复制

需求:把一个数组的元素复制到另一个新数组中去。

下面是一个实现数组元素复制的示例代码:

public class Main {public static void main(String[] args) {int[] arr1 = {1, 2, 3, 4, 5};int[] arr2 = copyArray(arr1);System.out.println("原始数组:");for (int num : arr1) {System.out.print(num + " ");}System.out.println("\n复制后的数组:");for (int num : arr2) {System.out.print(num + " ");}}public static int[] copyArray(int[] arr) {int[] newArr = new int[arr.length];// 遍历原始数组,将每个元素复制到新数组中for (int i = 0; i < arr.length; i++) {newArr[i] = arr[i];}return newArr;}
}

在上述代码中,我们定义了一个copyArray方法来实现数组元素的复制。我们传入一个原始数组,创建一个新数组newArr,长度与原数组相同。

然后,我们使用一个循环遍历原始数组,将每个元素复制到新数组中的对应位置。

最后,我们返回新数组。

执行以上代码,将输出原始数组和复制后的数组。

5,评委打分

需求:在唱歌比赛中,有6名评委给选手打分,分数范围是【0-100】之间的整数。选手的最后得分为:去掉最高分、最低分后的4个评委的平均分,请完成上述过程并计算出选手的得分。

下面是一个实现评委打分的示例代码:

import java.util.Arrays;public class Main {public static void main(String[] args) {int[] scores = {90, 95, 88, 92, 96, 85};double averageScore = calculateAverageScore(scores);System.out.println("评委打分:" + Arrays.toString(scores));System.out.println("选手得分:" + averageScore);}public static double calculateAverageScore(int[] scores) {// 对打分数组进行排序Arrays.sort(scores);// 去掉最高分和最低分的总分int totalScore = 0;for (int i = 1; i < scores.length - 1; i++) {totalScore += scores[i];}// 计算平均分double averageScore = (double) totalScore / (scores.length - 2);return averageScore;}
}

在上述代码中,我们定义了一个calculateAverageScore方法来计算选手的得分。我们传入一个评委打分的数组。

首先,我们使用Arrays.sort方法对打分数组进行排序,这样最高分和最低分就会分别位于数组的首尾。

然后,我们使用一个循环遍历排序后的打分数组,从第二个元素开始累加总分,直到倒数第二个元素。

最后,我们计算去掉最高分和最低分的总分的平均值,并将其作为选手的得分返回。

执行以上代码,将输出评委的打分和选手的得分。

6,数字加密和解密

加密

需求:某系统的数字密码(大于0),比如1983,采用加密方式进行传输。
规则:先得到每位数,然后每位数都加上5,在对10求余,最后将所有数字反转,得到一串新数。

下面是一个实现数字加密的示例代码:

public class Main {public static void main(String[] args) {int password = 1983;int encryptedPassword = encryptPassword(password);System.out.println("原始密码:" + password);System.out.println("加密后的密码:" + encryptedPassword);}public static int encryptPassword(int password) {// 将密码转换为字符串String passwordStr = String.valueOf(password);// 将每位数加上5并对10求余StringBuilder encryptedPasswordStr = new StringBuilder();for (int i = 0; i < passwordStr.length(); i++) {int digit = Character.getNumericValue(passwordStr.charAt(i));int encryptedDigit = (digit + 5) % 10;encryptedPasswordStr.append(encryptedDigit);}// 反转字符串得到加密后的密码String reversedPasswordStr = encryptedPasswordStr.reverse().toString();int encryptedPassword = Integer.parseInt(reversedPasswordStr);return encryptedPassword;}
}

在上述代码中,我们定义了一个encryptPassword方法来对密码进行加密。我们传入一个大于0的数字密码。

首先,我们将密码转换为字符串,方便处理每位数。

然后,我们使用一个循环遍历密码的每位数,将每位数加上5并对10求余,得到加密后的每位数。我们使用StringBuilder来构建加密后的密码字符串。

接下来,我们将加密后的密码字符串反转,得到加密后的密码字符串。

最后,我们将加密后的密码字符串转换为整数形式,并将其作为加密后的密码返回。

执行以上代码,将输出原始密码和加密后的密码。

解密

下面是一个实现数字解密的示例代码:

public class Main {public static void main(String[] args) {int encryptedPassword = 8321;int decryptedPassword = decryptPassword(encryptedPassword);System.out.println("加密后的密码:" + encryptedPassword);System.out.println("解密后的密码:" + decryptedPassword);}public static int decryptPassword(int encryptedPassword) {// 将加密后的密码转换为字符串String encryptedPasswordStr = String.valueOf(encryptedPassword);// 反转字符串得到加密前的密码StringBuilder decryptedPasswordStr = new StringBuilder(encryptedPasswordStr).reverse();// 将每位数减去5并对10求余StringBuilder passwordStr = new StringBuilder();for (int i = 0; i < decryptedPasswordStr.length(); i++) {int digit = Character.getNumericValue(decryptedPasswordStr.charAt(i));int passwordDigit = (digit + 5) % 10;passwordStr.append(passwordDigit);}// 将加密前的密码字符串转换为整数形式,并将其作为解密后的密码返回int decryptedPassword = Integer.parseInt(passwordStr.toString());return decryptedPassword;}
}

在上述代码中,我们定义了一个decryptPassword方法来对加密后的密码进行解密。我们传入一个加密后的密码。

首先,我们将加密后的密码转换为字符串。

然后,我们将加密后的密码字符串反转,得到加密前的密码字符串。

接下来,我们使用一个循环遍历加密前的密码字符串的每位数,将每位数减去5并对10求余,得到解密后的每位数。我们使用StringBuilder来构建解密后的密码字符串。

最后,我们将解密后的密码字符串转换为整数形式,并将其作为解密后的密码返回。

执行以上代码,将输出加密后的密码和解密后的密码。

7,抢红包

需求:一个主播直播抽奖,奖品是现金红包,分别有{2,588,888,1000, 10000}五个奖金。请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。打印效果如下:(随机顺序,不一定是下面的顺序)
2元的奖金被抽出
588元的奖金被抽出
888元的奖金被抽出
1000元的奖金被抽出
10000元的奖金被抽出

以下是实现抢红包的示例代码:

import java.util.Random;public class Main {public static void main(String[] args) {int[] prizes = {2, 588, 888, 1000, 10000};shufflePrizes(prizes);for (int prize : prizes) {System.out.println(prize + "元的奖金被抽出");}}public static void shufflePrizes(int[] prizes) {Random random = new Random();for (int i = prizes.length - 1; i > 0; i--) {int j = random.nextInt(i + 1);int temp = prizes[i];prizes[i] = prizes[j];prizes[j] = temp;}}
}

在上述代码中,我们使用数组prizes存储奖金金额。然后我们调用shufflePrizes方法来打乱奖金顺序。

shufflePrizes方法中,我们使用Fisher-Yates算法对奖金数组进行随机打乱。通过迭代数组,我们在每次迭代中使用nextInt方法生成一个随机索引j(范围是0到i),然后交换当前迭代索引i和随机索引j处的奖金金额。

最后,我们在main方法中遍历打乱后的奖金数组,并打印每个奖项。

执行以上代码,将输出每个奖项,奖项的出现顺序是随机的且不重复。

8,双色球彩票系统

需求:投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1-33中选择;蓝色号码从1-16中选择。

中奖条件和奖金表

奖等中奖条件中奖说明奖金
一等奖红球6个,篮球1个中6+11000万
二等奖红球6个,篮球0个中6+0500万
三等奖红球5个,篮球1个中5+13000元
四等奖红球5个,篮球0个
红球4个,篮球1个
中5+0
中4+1
200元
五等奖红球4个,篮球1个
红球3个,篮球1个
中4+0
中3+1
10元
六等奖红球2个,篮球1个
红球1个,篮球1个
红球0个,篮球1个
中2+1
中1+1
中0+1
5元

以下是一个简单的双色球彩票系统的Java代码实现:

import java.util.Arrays;
import java.util.Random;public class DoubleColorBallLottery {private static final int RED_BALL_COUNT = 6;private static final int MAX_RED_BALL_NUMBER = 33;private static final int MAX_BLUE_BALL_NUMBER = 16;private static final int FIRST_PRIZE = 10000000; // 一等奖奖金private static final int SECOND_PRIZE = 5000000; // 二等奖奖金private static final int THIRD_PRIZE = 3000; // 三等奖奖金private static final int FOURTH_PRIZE = 200; // 四等奖奖金private static final int FIFTH_PRIZE = 10; // 五等奖奖金private static final int SIXTH_PRIZE = 5; // 六等奖奖金private static final int[] FIRST_PRIZE_CONDITION = {6, 1}; // 一等奖中奖条件private static final int[] SECOND_PRIZE_CONDITION = {6, 0}; // 二等奖中奖条件private static final int[] THIRD_PRIZE_CONDITION = {5, 1}; // 三等奖中奖条件private static final int[] FOURTH_PRIZE_CONDITION = {5, 0, 4, 1}; // 四等奖中奖条件private static final int[] FIFTH_PRIZE_CONDITION = {4, 1, 3, 1}; // 五等奖中奖条件private static final int[] SIXTH_PRIZE_CONDITION = {2, 1, 1, 1, 0, 1}; // 六等奖中奖条件public static void main(String[] args) {int[] winningNumbers = generateWinningNumbers();int[] userNumbers = generateUserNumbers();int blueBall = generateBlueBall();System.out.println("中奖号码:" + Arrays.toString(winningNumbers) + " 蓝球:" + blueBall);System.out.println("用户号码:" + Arrays.toString(userNumbers) + " 蓝球:" + blueBall);int prizeLevel = checkPrizeLevel(winningNumbers, userNumbers, blueBall);switch (prizeLevel) {case 1:System.out.println("恭喜您中一等奖!奖金:" + FIRST_PRIZE + "元");break;case 2:System.out.println("恭喜您中二等奖!奖金:" + SECOND_PRIZE + "元");break;case 3:System.out.println("恭喜您中三等奖!奖金:" + THIRD_PRIZE + "元");break;case 4:System.out.println("恭喜您中四等奖!奖金:" + FOURTH_PRIZE + "元");break;case 5:System.out.println("恭喜您中五等奖!奖金:" + FIFTH_PRIZE + "元");break;case 6:System.out.println("恭喜您中六等奖!奖金:" + SIXTH_PRIZE + "元");break;default:System.out.println("很遗憾,未中奖");break;}}// 生成中奖号码private static int[] generateWinningNumbers() {int[] winningNumbers = new int[RED_BALL_COUNT];Random random = new Random();for (int i = 0; i < RED_BALL_COUNT; i++) {int number = random.nextInt(MAX_RED_BALL_NUMBER) + 1;while (containsNumber(winningNumbers, number)) {number = random.nextInt(MAX_RED_BALL_NUMBER) + 1;}winningNumbers[i] = number;}Arrays.sort(winningNumbers);return winningNumbers;}// 生成用户号码private static int[] generateUserNumbers() {int[] userNumbers = new int[RED_BALL_COUNT];Random random = new Random();for (int i = 0; i < RED_BALL_COUNT; i++) {int number = random.nextInt(MAX_RED_BALL_NUMBER) + 1;while (containsNumber(userNumbers, number)) {number = random.nextInt(MAX_RED_BALL_NUMBER) + 1;}userNumbers[i] = number;}Arrays.sort(userNumbers);return userNumbers;}// 生成蓝球号码private static int generateBlueBall() {Random random = new Random();return random.nextInt(MAX_BLUE_BALL_NUMBER) + 1;}// 检查中奖等级private static int checkPrizeLevel(int[] winningNumbers, int[] userNumbers, int blueBall) {int redBallCount = countRedBalls(winningNumbers, userNumbers);boolean hasBlueBall = blueBall == userNumbers[RED_BALL_COUNT - 1];if (Arrays.equals(userNumbers, winningNumbers)) {return 1;} else if (redBallCount == FIRST_PRIZE_CONDITION[0] && hasBlueBall) {return 2;} else if (redBallCount == THIRD_PRIZE_CONDITION[0] && hasBlueBall) {return 3;} else if (redBallCount == FOURTH_PRIZE_CONDITION[0] && hasBlueBall) {return 4;} else if (redBallCount == FOURTH_PRIZE_CONDITION[2] && hasBlueBall) {return 4;} else if (redBallCount == FIFTH_PRIZE_CONDITION[0] && hasBlueBall) {return 5;} else if (redBallCount == FIFTH_PRIZE_CONDITION[2] && hasBlueBall) {return 5;} else if (redBallCount == SIXTH_PRIZE_CONDITION[0] && hasBlueBall) {return 6;} else if (redBallCount == SIXTH_PRIZE_CONDITION[2] && hasBlueBall) {return 6;} else if (redBallCount == SIXTH_PRIZE_CONDITION[4] && hasBlueBall) {return 6;} else if (!hasBlueBall) {return 0;} else {return -1;}}// 统计红球个数private static int countRedBalls(int[] winningNumbers, int[] userNumbers) {int count = 0;for (int userNumber : userNumbers) {if (containsNumber(winningNumbers, userNumber)) {count++;}}return count;}// 检查数组中是否包含指定的数字private static boolean containsNumber(int[] numbers, int number) {for (int i : numbers) {if (i == number) {return true;}}return false;}
}

在上述代码中,我们使用generateWinningNumbers方法和generateUserNumbers方法分别生成中奖号码和用户号码,生成的号码均为6个红球号码和1个蓝球号码。

然后使用generateBlueBall方法生成一个蓝球号码。

接下来,我们使用checkPrizeLevel方法检查用户号码是否中奖,并返回中奖等级。该方法根据奖金表中的中奖条件来判断中奖等级。

最后,根据返回的中奖等级,我们打印中奖信息和奖金金额。

执行以上代码,将输出中奖号码、用户号码以及中奖信息。

9,二维数组

Java中的二维数组是由多个一维数组组成的数据结构,它可以看作是一个表格或者是一个矩阵。二维数组在Java中被定义为一个数组的数组,即数组的元素也是数组。

(1)二维数组静态初始化

在Java中,可以使用静态初始化的方式创建和初始化二维数组。静态初始化是指在声明数组的同时为数组元素赋值。以下是静态初始化二维数组的示例:

dataType[][] arrayName = {{value1, value2, value3},{value4, value5, value6},{value7, value8, value9}
};

在上面的示例中,dataType表示二维数组中元素的数据类型,arrayName是数组的名称,{value1, value2, value3}表示第一行的元素,{value4, value5, value6}表示第二行的元素,{value7, value8, value9}表示第三行的元素。

可以根据需要添加或删除行和列,使二维数组具有不同的大小。每一行中的元素个数可以不同,从而创建不规则的二维数组。

以下是一个静态初始化二维数组的完整示例:

int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};// 访问二维数组的元素
int element = matrix[1][2]; // 访问第二行第三列的元素,即6// 遍历二维数组的所有元素
for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {System.out.print(matrix[i][j] + " ");}System.out.println();
}

上述示例中,创建了一个3x3的二维数组,然后通过索引访问其中的元素,并使用嵌套循环遍历二维数组中的所有元素。输出结果为:

1 2 3 
4 5 6 
7 8 9

(2)二维数组动态初始化

在Java中,可以使用动态初始化的方式创建和初始化二维数组。动态初始化是指在声明数组的同时指定数组的大小,然后使用循环或其他方式为数组元素赋值。以下是动态初始化二维数组的示例:

dataType[][] arrayName = new dataType[rowSize][columnSize];

在上面的示例中,dataType表示二维数组中元素的数据类型,arrayName是数组的名称,rowSize表示数组的行数,columnSize表示数组的列数。

以下是一个动态初始化二维数组的完整示例:

int rowSize = 3;
int columnSize = 3;
int[][] matrix = new int[rowSize][columnSize];// 为二维数组赋值
for (int i = 0; i < rowSize; i++) {for (int j = 0; j < columnSize; j++) {matrix[i][j] = i + j;}
}// 访问二维数组的元素
int element = matrix[1][2]; // 访问第二行第三列的元素,即3// 遍历二维数组的所有元素
for (int i = 0; i < rowSize; i++) {for (int j = 0; j < columnSize; j++) {System.out.print(matrix[i][j] + " ");}System.out.println();
}

上述示例中,首先通过new关键字动态创建了一个3x3的二维数组,然后使用嵌套循环为数组元素赋值。接着,通过索引访问其中的元素,并使用嵌套循环遍历二维数组中的所有元素。输出结果为:

0 1 2 
1 2 3 
2 3 4

(3)二维数组内存图

下面是一个Java二维数组的内存图示例:

+---------+
|   row0  | -> +-------+
|         |    |   1   |
+---------+    +-------+
|   row1  | -> +-------+
|         |    |   2   |
+---------+    +-------+
|   row2  | -> +-------+
|         |    |   3   |
+---------+    +-------+

在内存中,二维数组被存储为一组连续的内存块。每个内存块表示数组的一行,内存块的大小取决于数组元素的类型。在上面的示例中,二维数组的行数为3,列数为1,因此内存中有3个连续的内存块。

每个内存块中存储了数组元素的值。在上面的示例中,第一行的元素值为1,第二行的元素值为2,第三行的元素值为3。

要访问二维数组中的特定元素,可以使用索引。例如,要访问第二行第一个元素的值,可以使用arrayName[1][0]。在上面的示例中,arrayName[1][0]的值为2。

需要注意的是,Java中的二维数组是一维数组的数组。也就是说,二维数组实际上是一个包含了其他一维数组的数组。每个一维数组代表二维数组的一行。在内存中,二维数组的每个元素实际上是一个指向一维数组的引用。

(4)计算每个季度的销售额

下面是一个使用二维数组计算每个季度的销售额的Java案例:

public class Sales {public static void main(String[] args) {// 定义二维数组sales,表示每个季度的销售额double[][] sales = {{1500.0, 2000.0, 1800.0},   // 第一季度的销售额{2200.0, 2500.0, 2300.0},   // 第二季度的销售额{1800.0, 2100.0, 1900.0},   // 第三季度的销售额{2500.0, 2800.0, 2600.0}    // 第四季度的销售额};// 计算每个季度的总销售额double[] totalSales = new double[4];for (int i = 0; i < sales.length; i++) {double total = 0.0;for (int j = 0; j < sales[i].length; j++) {total += sales[i][j];}totalSales[i] = total;}// 输出每个季度的总销售额for (int i = 0; i < totalSales.length; i++) {System.out.println("第" + (i+1) + "季度的总销售额为:" + totalSales[i]);}}
}

在上面的案例中,我们使用一个二维数组sales表示每个季度的销售额。数组的每一行代表一个季度,每一列代表一个月份。我们首先定义了这个二维数组,并将每个季度的销售额初始化。

接下来,我们创建一个一维数组totalSales,用于存储每个季度的总销售额。然后,通过嵌套的循环遍历二维数组,计算每个季度的总销售额,并将结果存储到totalSales数组中。

最后,我们遍历totalSales数组,输出每个季度的总销售额。

运行以上代码,将会输出每个季度的总销售额。

相关文章:

Java 复习笔记 - 方法篇

文章目录 一&#xff0c;方法的定义二&#xff0c;最简单的方法定义和调用三&#xff0c;带参数的方法定义和调用四&#xff0c;带返回值方法的定义和调用五&#xff0c;小结六&#xff0c;方法的重载七&#xff0c;方法简单练习1&#xff0c;数组遍历2&#xff0c;数组最大值3…...

大数据到底是好是坏?_光点科技

近年来&#xff0c;随着科技的不断发展和互联网的普及&#xff0c;大数据已经成为一个备受关注的话题。它带来了许多机遇和挑战&#xff0c;引发了人们对于其是好是坏的争议。大数据究竟是一把双刃剑&#xff0c;需要我们从多个角度来审视。 大数据的好处无疑是显而易见的。首先…...

C++ while 循环

只要给定的条件为真&#xff0c;while 循环语句会重复执行一个目标语句。 语法 C 中 while 循环的语法&#xff1a; while(condition) {statement(s); }在这里&#xff0c;statement(s) 可以是一个单独的语句&#xff0c;也可以是几个语句组成的代码块。condition 可以是任意…...

orm_sqlalchemy总结

sqlalchemy使用总结 1 sqlalchemy ORM基础操作 官方文档&#xff1a;https://docs.sqlalchemy.org/en/13/orm/tutorial.html 创建连接 - 创建基类 - 创建实体类 - 创建表 - 创建session import logging import pymysql from pymysql.cursors import DictCursor import sqla…...

CTFhub-文件上传-MIME绕过

用哥斯拉生成 php 木马文件 1.php 抓包---> 修改 conten-type 类型 为 imge/jpeg 用蚁剑连接 ctfhub{8e6af8109ca15932bad4747a}...

【校招VIP】前端校招考点之UDP

考点介绍&#xff1a; UDP是非面向连接协议&#xff0c;使用udp协议通讯并不需要建立连接&#xff0c;它只负责把数据尽可能发送出去&#xff0c;并不可靠&#xff0c;在接收端&#xff0c;UDP把每个消息断放入队列中&#xff0c;接收端程序从队列中读取数据。 『前端校招考点…...

C++设计模式_02_面向对象设计原则

文章目录 1. 面向对象设计&#xff0c;为什么&#xff1f;2. 重新认识面向对象3. 面向对象设计原则3.1 依赖倒置原则(DIP)3.2 开放封闭原则(OCP )3.3 单一职责原则( SRP )3.4 Liskov 替换原则 ( LSP )3.5 接口隔离原则 ( ISP )3.6 优先使用对象组合&#xff0c;而不是类继承3.7…...

springcloud-gateway简述

Spring Cloud Gateway 是一个用于构建 API 网关的项目&#xff0c;它是 Spring Cloud 生态系统中的一部分&#xff0c;旨在为微服务架构提供动态路由、负载均衡、安全性和监控等功能。 网关工程对应pom文件 <?xml version"1.0" encoding"UTF-8"?>…...

【大虾送书第七期】深入浅出SSD:固态存储核心技术、原理与实战

目录 ✨写在前面 ✨内容简介 ✨作者简介 ✨名人推荐 ✨文末福利 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 近年来国家大力支持半导体行业&#xff0c;鼓励自主创新&#xff0c;中国SSD技术和产业…...

常见矿石材质鉴定VR实训模拟操作平台提高学员的学习效果和实践能力

随着“元宇宙”概念的不断发展&#xff0c;在矿山领域中&#xff0c;长期存在传统培训内容不够丰富、教学方式单一、资源消耗大等缺点&#xff0c;无法适应当前矿山企业发展需求的长期难题。元宇宙企业借助VR虚拟现实、web3d开发和计算机技术构建的一个虚拟世界&#xff0c;为用…...

Verilog 学习路线

参考知乎 首先得学习数电和 Verilog 基础。 常问的 Verilog 基础 二分频是怎么写的 阻塞和非阻塞及其应用 写一个100MHz的时钟 Reg 和 wire 的区别 Logic 和 wire 的区别&#xff0c;两者可以转换吗 用你最擅长的语言找出1-100的质数 一个最简单的八位加法器应该怎么验…...

前端三剑客中简单的两个:HTMLCSS

HTML&CSS 1&#xff0c;HTML1.1 介绍1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签 1.4 图片、音频、视频标签1.5 超链接标签1.6 列表标签1.7 表格标签1.8 布局标签1.9 表单标签1.9.1 表单标签概述1.9.2 form标签属性1.9.3 代码演示 1.10 表单项标签 …...

Java实现根据关键词搜索当当商品列表数据方法,当当API接口申请指南

要通过当当网的API获取商品列表数据&#xff0c;您可以使用当当开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过当当开放平台API获取商品列表&#xff1a; 首先&#xff0c;确保您已注册成为当当开放平台的开发者&#xff0c;并创建…...

【HBZ分享】TCP可靠性传输如何保证的?

ACK机制 ACK机制是发送方与接收方的一个相互确认客户端向服务端发送连接请求&#xff0c;此时服务端要回馈给客户端ACK&#xff0c;以表示服务端接到了客户端请求&#xff0c;这是第一和的第二次握手客户端接收到服务端响应后&#xff0c;同样也要回馈服务端的响应&#xff0c…...

AI聊天机器人平台Poe发布更新;自然语言理解课程概要

&#x1f989; AI新闻 &#x1f680; AI聊天机器人平台Poe发布更新 突破功能限制 增加企业级服务 摘要&#xff1a;知名问答网站Quora旗下的AI聊天机器人平台Poe发布了一系列更新&#xff0c;包括推出Mac应用、支持同时进行多个对话、接入Meta的Llama 2模型等功能。用户只需支…...

电脑视频编辑软件前十名 电脑视频编辑器怎么剪辑视频

对于大多数创作者而言&#xff0c;视频后期工作基本都是在剪辑软件上进行的。一款适合自己的视频剪辑软件&#xff0c;能够节省出大量的时间和金钱成本&#xff0c;让剪辑师省钱又省心。那么有关电脑视频编辑软件前十名&#xff0c;电脑视频编辑器怎么剪辑视频的相关问题&#…...

Springboot整合AOP和注解实现日志记录——Java入职第十二天

前言 作为java开发工程师,日常curd工作少不了,特别是后台系统的操作,对于每一项操作我们都要记录,所以就得有操作日志,操作日志能够排除是开发的锅,是运营或者产品自己操作的。那么就有个问题,每次在业务处理最后,调用操作日志服务保存响应的日志,但是这段代码是很冗余…...

shell脚本监控ip和端口的运行状态并触发邮件告警

ping端口shell代码 ping不通发邮件通知 直到ping通再次发送成功邮件 #!/bin/bash Datedate -d "today" "%Y-%m-%dT%H-%M-%S" #echo "根据当前时间创建日志文件" mkdir -p /log/Ping/ping_server touch /log/Ping/${Date}_ping_server.log ip_li…...

二三维电子沙盘数字沙盘虚拟现实开发教程第14课

二三维电子沙盘数字沙盘开发教程第14课 很久没有写了&#xff0c;主要前段时间在针对怎么显示高精度的 倾斜数据而努力&#xff0c;现在终于实现了效果不错。以前的版本显示倾斜数据控制不太好。 对了。目前系统暂只支持smart3d生成的kml格式的数据&#xff0c;由专有的录入程…...

如何五分钟设计制作自己的蛋糕店小程序

在现如今的互联网时代&#xff0c;小程序已成为企业推广和销售的重要利器。对于蛋糕店来说&#xff0c;搭建一个小程序可以为其带来更多的品牌曝光和销售渠道。下面&#xff0c;我们将以乔拓云平台为例&#xff0c;来教你如何从零开始搭建自己的蛋糕店小程序。 首先&#xff0c…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...