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

Java从入门到精通 - 数组

数组

此笔记参考黑马教程,仅学习使用,如有侵权,联系必删

文章目录

  • 数组
    • 1. 认识数组
    • 2. 数组的定义和访问
      • 2.1 静态初始化数组
        • 2.1.1 数组的访问
          • 2.1.1 定义
          • 代码实现
          • 总结
        • 2.1.2 数组的遍历
          • 2.1.2.1 定义
          • 代码演示
          • 总结
        • 案例
          • 代码实现
      • 2.2 动态初始化数组
        • 2.2.1 定义
        • 2.2.2 动态初始化数组元素默认值规则
        • 代码实现
        • 总结
        • 案例
          • 代码实现
    • 3. 数组在计算机中的执行原理
      • 3.1 数组的执行原理,Java 程序的执行原理
        • 3.1.1 Java 内存分配介绍
        • 3.1.2 方法区
        • 3.1.3 栈
        • 3.1.4 堆
        • 3.1.5 数组在计算机中的执行原理
        • 总结
      • 3.2 多个变量指向同一个数组的问题
        • 3.2.1 使用数组时常见的一个问题
        • 代码实现
        • 总结
    • 专项训练:数组常见案例
      • 数组求最值
        • 分析
        • 代码实现
        • 总结
      • 数组反转
        • 需求 - 分析
        • 代码实现
        • 总结
      • 随机排名
        • 代码实现
        • 总结
    • 补充知识:Debug 工具的使用
    • 总结

1. 认识数组

  • 数组就是一个容器,用来存储一批同种类型的数据

  • 例子:

// 20, 10, 80, 60, 90
int[] arr = {20, 10, 80, 60, 90};// 张三, 李四, 王五
String[] names = {"张三", "李四", "王五"};

Java 中有变量,为什么还要用数组?

  • eg:在一组名单中随机点名的话,根据以往方法可能要定义几十上百个变量,会使得代码繁琐、实现需求复杂。而用数组的话代码简洁、逻辑清晰

  • 结论:遇到批量数据的存储和操作时,数组比变量更合适


2. 数组的定义和访问

2.1 静态初始化数组

  • 定义数组的时候直接给数组赋值

静态初始化数组的格式:

// 完整格式
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3, ...};
int[] ages = new int[]{12, 24, 36};
double[] scores = new double[]{89.9, 99.5, 59.5, 88.0};
// 简化格式
数据类型[] 数组名 = {元素1, 元素2, 元素3, ...};
int[] ages = {12, 24, 36};

注意:

  • 数据类型[] 数组名“ 也可以写成 ”数据类型 数组名[]

  • 什么类型的数组只能存放什么类型的数据

  • 数组在计算机中的基本原理

    • 在计算机遇到代码之后,现在内存中开辟一块变量空间,暂时先不装东西。元素部分又开辟一个区域,每个元素各分为一块来存储数据,而这块区域是有自己的一个地址的,每个元素都有自己的编号(索引),然后将这个地址交给数组变量来存储

注意:数组变量名中存储的是数组在内存中的地址,数组是一种引用数据类型

  • 代码演示
package e_ArrayApp;public class a_ArrayDemo1 {public static void main(String[] args) {// 目标:掌握数组的定义方式一:静态初始化数组// 1. 数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, 元素3, ...};int[] ages = new int[]{12, 24, 36};double[] scores = new double[]{89.9, 99.5, 59.5, 88};System.out.println(ages);System.out.println(scores);// 2. 简化写法// 数据类型[] 数组名 = {元素1, 元素2, 元素3, ...};int[] ages2 = {12, 24, 36};double[] scores2 = {89.9, 99.5, 59.5, 88};// 3. 数据类型[] 数组名 也可以写成 数据类型 数组名[]int ages3[] = {12, 24, 36};double scores3[] = {89.9, 99.5, 59.5, 88};}
}
  • 总结
  1. 数组的静态初始化的写法和特点是什么样的?

  1. 定义数组我们说了哪几个注意点?
  • 什么类型的数组必须存放什么类型的数据
  • 数据类型[] 数组名 也可以写成 数据类型 数组名[]
  1. 数组是属于什么类型,数组变量名中存储的是什么?
  • 引用数据类型,存储的数组在内存中的地址信息

2.1.1 数组的访问
2.1.1 定义
数组名[索引]

  • 数组的长度属性:length
// 获取数组的长度(就是数组元素的个数)
System.out.println(arr.length);
  • 数组的最大索引怎么表示?
数组名.length - 1 // 前提:元素个数大于0
代码实现
package e_ArrayApp;public class b_ArrayDemo {public static void main(String[] args) {// 目标:掌握数组的访问int[] arr = {12, 24, 36};// 1. 访问数组的全部数据System.out.println(arr[0]); // 12System.out.println(arr[1]); // 24System.out.println(arr[2]); // 36// 2. 修改数组中的数据arr[0] = 66;arr[2] = 100;System.out.println(arr[0]); // 66System.out.println(arr[1]); // 24System.out.println(arr[2]); // 100// 3. 访问数组的元素个数:数组名.lengthSystem.out.println(arr.length); // 3// 技巧:获取数组的最大索引:arr.length - 1(前提是数组中存在数据)System.out.println(arr.length - 1); // 2}
}
总结
  1. 如何访问数组的元素?
数组名[索引]
  1. 如何访问数组的长度?
  • 数组名称.length
  1. 数组的最大索引是多少?
数组名.length - 1 // 前提:元素个数大于0
  1. 如果访问数组时,使用的索引超过了数组的最大索引会出什么问题?
  • 执行程序时会出 bug,出现一个索引越界的异常提示

2.1.2 数组的遍历
2.1.2.1 定义
  • 遍历:就是一个一个数据的访问
  • 数组遍历:就是把数组的每个数据都取一遍出来

快速方法:

  • 数组名.fori + Tab
代码演示
package e_arrayapp;public class c_ArrayDemo3 {public static void main(String[] args) {// 目标:掌握数组的遍历int[] ages = {12, 24, 36};// System.out.println(ages[0]); // 12// System.out.println(ages[1]); // 24// System.out.println(ages[2]); // 36for (int i = 0; i < ages.length; i++) {// i = 0 1 2System.out.println(ages[i]); // 12 24 36}}
}
总结
  1. 什么是遍历?
  • 一个一个的访问一遍容器中的数据
  1. 如何遍历数组?
int[] ages = {20, 30, 40, 50};
for (int i = 0; i < ages.length; i++) {// i = 0 1 2System.out.println(ages[i]); // 12 24 36
}

案例

需求:

  • 某部门5名员工的销售额分别是:16、26、36、6、100,请计算出他们部门的总销售额
  • 分析:
  1. 把这5个数据拿到程序中去 —> 使用数组
int[] money = {16, 26, 36, 6, 100};
  1. 遍历数组中的每一个数据,然后在外面定义求和变量把他们累加起来
代码实现
package e_arrayapp;public class d_ArrayTest4 {public static void main(String[] args) {// 目标:完成对数据的元素求和// 1. 定义一个数组存储5名员工的销售额int[] money = { 16, 26, 36, 6, 100 };// 3. 定义一个变量用于累加求和int count = 0;// 2. 遍历这个数组中的每个数据for (int i = 0; i < money.length; i++) {// i = 0 1 2 3 4count += money[i];}System.out.println("员工的销售额:" + count); // 184}
}

2.2 动态初始化数组

2.2.1 定义

数组的动态初始化:

  • 定义数组时先不存入具体的元素值,只确定数组存储的数据类型和数组的长度

数组的动态初始化格式:

数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[3];
// 后赋值
arr[0] = 10;
System.out.println(arr[0]); // 10

  • 在内存中分配一个变量空间,在这个变量里面存储的还是数组对象的地址,这个数组对象里面,一开始会存一些所谓的默认值,后期再往这个里面进行赋值

注意:

  • 静态初始化和动态初始化数组的写法是独立的,不可以混用
2.2.2 动态初始化数组元素默认值规则
数据类型明细默认值
基本类型byte、short、char、int、long0
float、double0.0
booleanfalse
引用类型类、接口、数组、Stringnull
代码实现
package e_arrayapp;public class e_ArrayDemo5 {public static void main(String[] args) {// 目标:掌握定义数组的方式二:动态初始化数组// 1. 数据类型[] 数组名 = new 数据类型[长度];int[] ages = new int[3]; // ages = [0, 0, 0]System.out.println(ages[0]); // 0System.out.println(ages[1]); // 0System.out.println(ages[2]); // 0ages[0] = 12;ages[1] = 18;ages[2] = 32;System.out.println(ages[0]); // 12System.out.println(ages[1]); // 18System.out.println(ages[2]); // 32System.out.println("------------------------");char[] chars = new char[3]; // [0, 0, 0]System.out.println((int) chars[0]); // 0System.out.println((int) chars[2]); // 0double[] scores = new double[80];System.out.println(scores[0]); // 0.0System.out.println(scores[79]); // 0.0boolean[] flags = new boolean[100];System.out.println(flags[0]); // falseSystem.out.println(flags[99]); // falseString[] names = new String[80];System.out.println(names[0]); // nullSystem.out.println(names[79]); // null}
}
总结
  1. 动态数组的写法是什么样的?有什么特点?
数据类型[] 数组名 = new 数据类型[长度];
int[] ages = new int[4];
  1. 动态初始化数组后元素的默认值是什么样的?
  • byte、short、int、char、long 类型数组的元素默认值都是0
  • float、double 类型数组元素的默认值都是0.0
  • boolean 类型数组的元素默认值是 false,String 类型数组的元素的默认值是 null
  1. 两种数组定义的方法各自适合什么业务场景?
  • 动态初始化:适合开始不确定具体元素值,只知道元素个数的业务场景
  • 静态初始化:适合一开始就知道要存入哪些元素值的业务场景

案例

需求:

  • 某歌唱比赛,需要开发一个系统:可以录入6名评委的打分,录入完毕后立即输出平均分做为选手得分
  • 分析:
  1. 6名评委的打分是后期录入的,一开始不知道具体的分数,因此定义一个动态初始化的数组存分数
double[] scores = new double[6];
  1. 遍历数组中的每个位置,每次提示用户录入一个评委的分数,并存入数组对应的位置
  2. 遍历数组中的每一个元素进行求和最终算出平均分打印出来即可
代码实现
package e_arrayapp;import java.util.Scanner;public class f_ArrayTest6 {public static void main(String[] args) {// 目标:完成评委打分的案例// 1. 定义一个动态初始化的数组,负责存储6个评委的打分double[] scores = new double[6];Scanner sc = new Scanner(System.in);// 2. 遍历数组中的每个位置,录入评委的分数,存入数组中去for (int i = 0; i < scores.length; i++) {// i = 0 1 2 3 4 5 6System.out.println("请您输入当前第" + (i + 1) + "评委的分数");double score = sc.nextDouble();scores[i] = score;}// 3. 遍历数组中的每个元素进行求和double sum = 0;for (int i = 0; i < scores.length; i++) {sum += scores[i];}System.out.println("选手最终得分是:" + sum / scores.length);}
}

3. 数组在计算机中的执行原理

3.1 数组的执行原理,Java 程序的执行原理

前面我们知道,程序都是在计算机中的内存中执行的,那么 Java 程序编译后会产生一个 class 文件,然后这个 class 文件是提取到内存中正在运行的虚拟机里面去执行的。那么 Java 为了便于虚拟机执行这个 Java 程序,它将虚拟机中的这块内存区域进行了划分

3.1.1 Java 内存分配介绍
  • 方法区
  • 本地方法栈
  • 程序计数器
3.1.2 方法区
  • 定义:放我们编译以后的 class 文件的,也就是字节码文件

3.1.3 栈
  • 定义:方法运行时所进入的内存,由于变量是在方法里面的,所以变量也在这块区域里

3.1.4 堆
  • 定义:堆里面放的都是 new 出来的东西,它会在这块堆内存中开辟空间并产生地址,比如之前用的数组就是放在队里面的

ps:堆和栈在数据结构中应用广泛,具体可见 数据结构与算法

3.1.5 数组在计算机中的执行原理

把程序的 class 文件提取到方法区里面来,这里面会有一个 main 方法。接着它会把这个 main 方法加载到我们的栈里面来执行,接着它就会正式执行 main 方法的第一行代码,代码中基本类型变量就会在栈里面开辟空间。如果执行创建数组,就会先在栈里面开辟一个变量空间,一开始变量里面并没有存数据,紧接着执行等号右边的代码(new 一个数组对象),在堆内存中开辟一块空间,这块空间会分成 n 块等分的区域每个元素也有自己的索引,并且也会有一个地址,然后把这个地址赋值给左边的这个变量,再由变量指向这个数组对象

总结
  1. 运行一个 Java 程序,主要看 JVM 中包含的哪几部分内存区域?
  • 方法区
  • 栈内存
  • 堆内存
  1. 简单说说 int a = 20; int[] arr = new int[3] 这两行代码的执行原理?
  • a 是变量,直接放在栈中,a 变量存储的数据就是20这个值
  • new int[3] 是创建一个数组对象,会在堆内存中开辟区域存储3个整数
  • arr 是变量,在栈中,arr 中存储的是数组对象在堆内存中的地址值

3.2 多个变量指向同一个数组的问题

3.2.1 使用数组时常见的一个问题
  • 如果某个数组变量存储的地址是 null,那么该变量将不再指向任何数组对象

arr2 = null; // 把null赋值给arr2System.out.println(arr2); // nullSystem.out.println(arr2[0]); // 会出异常
System.out.println(arr2.length); // 会出异常
代码实现
package f_memory;public class b_ArrayDemo2 {public static void main(String[] args) {// 目标:认识多个变量指向同一个数组对象的形式,并掌握其注意事项int[] arr1 = {11, 22, 33};// 把int类型的数组变量arr1赋值给int类型的数组变量arr2int[] arr2 = arr1;System.out.println(arr1); // [I@5caf905dSystem.out.println(arr2); // [I@5caf905darr2[1] = 99;System.out.println(arr1[1]); // 99arr2 = null; // 拿到的数组变量中存储的值是nullSystem.out.println(arr2);// System.out.println(arr2[0]);System.out.println(arr2.length);}
}
总结
  1. 多个数组变量,指向同一个数组对象的原因是什么?需要注意什么?
  • 多个数组变量中存储的是同一个数组对象的地址
  • 多个变量修改的都是同一个数组对象中的数据
  1. 如果某个数组变量中存储的 null,代表什么意思?需要注意什么?
  • 代表这个数组变量没有指向数组对象
  • 可以输出这个变量,但不能用这个数组变量去访问数据或者访问数组长度,会报空指针异常:NullPointerException

专项训练:数组常见案例

数组求最值

分析

实现步骤:

  • 把数据拿到程序中去,用数组装起来
int[] socres = {15, 9000, 10000, 20000, 9500, -5};
  • 定义一个变量用于记录最终的最大值
int[] max = socres[0]; // 建议存储数组的第一个元素值作为参照 
  • 从第二个位置开始:遍历数组的数据,如果遍历的当前数据大于 max 变量存储的数据,则替换变量存储的数据为当前数据
  • 循环结束后输出 max 变量即可
代码实现
package g_demo;public class a_Test1 {public static void main(String[] args) {// 目标:掌握数组元素求最值// 1. 把数据拿到程序中来,用数组装起来int[] scores = {15, 9000, 10000, 20000, 9500, -5};// 2. 定义一个变量用于最终记住最大值int max = scores[0];// 3. 从数组的第二个位置开始遍历for (int i = 0; i < scores.length; i++) {// i = 1 2 3 4 5// 判断一个当前遍历的这个数据,是否大于最大值变量max存储的数据,如果大于当前遍历的数据需要赋值给maxif (scores[i] > max) {max = scores[i];}}System.out.println("最大数据是:" + max); // 20000}
}
总结
  1. 求数组中的元素最大值,我们是如何实现的?
  • 把数据拿到程序中去,用数组装起来
  • 定义一个变量 max 用于记录最大值,max 变量默认存储了第一个元素值作为参照物
  • 从第二个位置开始遍历数组的数据,如果当前元素大于变量存储的数据,则替换变量存储的值为该元素
  • 循环结束后输出 max 变量即可

数组反转

需求 - 分析

需求:

  • 某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转
    [10, 20, 30, 40, 50] 反转后 [50, 40, 30, 20, 10]

分析:

  • 数组的反转操作实际上就是:依次前后交换数据即可实现

代码实现
package g_demo;public class b_Test2 {public static void main(String[] args) {// 目标:完成数组反转// 1. 准备一个数组int[] arr = {10, 20, 30, 40, 50};// 2. 定义一个循环,设计2个变量,一个在前,一个在后for (int i = 0, j = arr.length - 1; i < j; i++, j--) {// arr[i]   arr[j]// 交换// 1. 定义一个临时变量记住后一个位置处的值int temp = arr[j];// 2. 把前一个位置处的值赋值给后一个位置arr[j] = arr[i];// 3. 把临时变量中记住的后一个位置处的值赋值给前一个位置arr[i] = temp;}// 3. 遍历数组中的每个数据,看是否反转成功了for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " "); // 50 40 30 20 10 }}
}
总结
  1. 我们如何完成数组的反转的?
  • 使用 for 循环,控制让数组的前后位置的元素,依次交换
  1. 数组如何实现前后元素交换的?
  • 定义一个临时变量记住后一个位置处的元素值
  • 再把前一个位置处的元素,赋值给后一个位置处
  • 最后把临时变量记住的后一个位置的值赋值给前一个位置处

随机排名

需求:

  • 某公司的开发部门有5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。请依次录入5名员工的工号,然后展示出一组随机的排名顺序

测试用例:[22, 33, 35, 13, 88] —> [13, 35, 88, 33, 22]

分析:

  • 在程序中录入5名员工的工号存储起来 —> 使用动态初始化数组的方式
  • 依次遍历数组中的每个数据
  • 每遍历到一个数据,都随机一个索引值出来,让当前数据与该索引位置处的数据进行交换
代码实现
package g_demo;import java.util.Random;
import java.util.Scanner;public class c_Test3 {public static void main(String[] args) {// 目标:完成随机排名// 1. 定义一个动态初始化的数组用于存储5名员工的工号int[] codes = new int[5];// [0, 0, 0, 0, 0]//  0  1  2  3  4// 2. 提示用户录入5名员工的工号Scanner sc = new Scanner(System.in);for (int i = 0; i < codes.length; i++) {// i = 0 1 2 3 4System.out.println("请您输入当前第" + (i + 1) + "员工的工号");int code = sc.nextInt();codes[i] = code;}// 3. 打乱数组中的元素排序Random r = new Random();for (int i = 0; i < codes.length; i++) {// codes[i]// 每遍历到一个数据,都随机一个数组索引范围内的值,然后让当前遍历的数据与索引位置处的值交换int index = r.nextInt(codes.length); // 0 - 4// 定义一个临时变量记住index位置处的值int temp = codes[index];// 把i位置处的值赋值给index位置处codes[index] = codes[i];// 把index位置原来的值赋值给i位置处codes[i] = temp;}// 4. 遍历数组中的工号输出即可for (int i = 0; i < codes.length; i++) {System.out.print(codes[i] + " ");}}
}
总结
  1. 我们是如何实现随即排名的?
  • 定义一个动态初始化的数组用于录入员工的工号
  • 遍历数组中的每个元素
  • 每遍历到一个数据,都随机一个索引值出来,让当前数据与索引位置出的数据进行交换

补充知识:Debug 工具的使用

  • IDEA(大部分 IDE 都有)自带的断点调试工具,可以控制代码从断点一行一行的执行,然后详细观看程序执行的情况

DEBUG 工具基本使用步骤

  1. 在需要控制的代码左侧,点击一下,形成断点
  2. 选择使用 DEBUG 方式启动程序,启动后程序会在断点暂停
  3. 控制代码一行一行的往下执行

断点:

用 Debug:

点击按钮,实现不同效果:


总结


相关文章:

Java从入门到精通 - 数组

数组 此笔记参考黑马教程&#xff0c;仅学习使用&#xff0c;如有侵权&#xff0c;联系必删 文章目录 数组1. 认识数组2. 数组的定义和访问2.1 静态初始化数组2.1.1 数组的访问2.1.1 定义代码实现总结 2.1.2 数组的遍历2.1.2.1 定义代码演示总结 案例代码实现 2.2 动态初始化…...

《Vuejs 设计与实现》第 4 章(响应式系统)( 下 )

目录 4.6 避免无限递归循环 4.7 调度执行 4.8 计算属性 computed 与 lazy 4.9 watch 的实现原理 4.10 立即执行的 watch 与回调执行时机 4.11 过期副作用与竞态问题 总结 4.6 避免无限递归循环 在实现完善响应式系统时&#xff0c;需要注意避免无限递归循环。以以下代码…...

在 Windows 上为 Intel UHD Graphics 编译 OpenCL 程序

如果您使用的是 Intel UHD Graphics 集成显卡,以下是完整的 OpenCL 开发环境配置指南: 1. 准备工作 确认硬件支持 首先确认您的 Intel UHD Graphics 支持 OpenCL: 大多数第6代及以后的 Intel Core 处理器(Skylake 及更新架构)都支持 OpenCL 2.1+ 运行 clinfo 工具可以查…...

C++自学笔记 makefile

本博客参考南科大于仕琪教授的讲解视频和这位同学的学习笔记&#xff1a; 参考博客 感谢两位的分享。 makefile 的作用 用于组织大型项目的编译&#xff0c;是一个一键编译项目的脚本文件。 本博客通过四个版本的makefile逐步说明makefile的使用 使用说明 四个演示文件 …...

【PDF】使用Adobe Acrobat dc添加水印和加密

【PDF】使用Adobe Acrobat dc添加水印和加密 文章目录 [TOC](文章目录) 前言一、添加保护加密口令二、添加水印三、实验四、参考文章总结 实验工具&#xff1a; 1.Adobe Acrobat dc 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、添加保护加…...

客服系统重构详细计划

# 客服系统重构详细计划 ## 第一阶段&#xff1a;系统分析与准备工作 ### 1. 代码审查和分析 (1-2周) - 全面分析现有代码结构 - 识别代码中的问题和瓶颈 - 理解当前系统的业务逻辑 - 确定可重用的组件 - 制作系统功能清单 ### 2. 技术栈升级准备 (1周) - 升级PHP版本到7…...

基于VSCode + PlatformIO平台的ESP8266的DS1302实时时钟

基于ESP8266的DS1302实时时钟系统开发 一、项目概述 本实验通过ESP8266开发板实现&#xff1a; DS1302实时时钟模块的驱动系统时间同步与维护串口实时时间显示RTC模块状态监控 硬件组成&#xff1a; NodeMCU ESP8266开发板DS1302实时时钟模块CR2032纽扣电池&#xff08;备…...

Flink 系列之十四 - Data Stream API的自定义数据类型

之前做过数据平台&#xff0c;对于实时数据采集&#xff0c;使用了Flink。现在想想&#xff0c;在数据开发平台中&#xff0c;Flink的身影几乎无处不在&#xff0c;由于之前是边用边学&#xff0c;总体有点混乱&#xff0c;借此空隙&#xff0c;整理一下Flink的内容&#xff0c…...

【数据结构】线性表

目录 1.1 线性表的概念 1.1.1 线性表的抽象数据类型 1.1.2 线性表的存储结构 1.1.3 线性表运算分类 1.2 顺序表 1.2.1 顺序表的类定义 1.2.2 顺序表的运算实现 1. 顺序表的检索 2. 顺序表的插入 3. 顺序表的删除 1.3 链表 1.3.1 单链表 1. 链表的检索 2. 链表的插…...

大疆卓驭嵌入式面经及参考答案

FreeRTOS 有哪 5 种内存管理方式&#xff1f; heap_1.c&#xff1a;这种方式简单地在编译时分配一块固定大小的内存&#xff0c;在整个运行期间不会进行内存的动态分配和释放。它适用于那些对内存使用需求非常明确且固定&#xff0c;不需要动态分配内存的场景&#xff0c;优点是…...

【网络】:传输层协议 —— UDP、TCP协议

目录 UDP协议 UDP协议的核心特点 UDP协议格式 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP协议的核心特点 TCP协议格式 确认应答机制 连接管理机制 三次握手 四次挥手 流量控制 滑动窗口 拥塞控制 基于字节流 粘包和拆包 可靠性和性能保障 基于TCP的应用层…...

每日c/c++题 备战蓝桥杯(洛谷P1115 最大子段和)

洛谷P1115 最大子段和 题解 题目描述 最大子段和是一道经典的动态规划问题。题目要求&#xff1a;给定一个包含n个整数的序列&#xff0c;找出其中和最大的连续子序列&#xff0c;并输出该最大和。若所有数均为负数&#xff0c;则取最大的那个数。 输入格式&#xff1a; 第…...

Python与矢量网络分析仪3671E:通道插损自动化校准(Vscode)

一、背景介绍 DUT集成了多个可调衰减的射频通道&#xff0c;可调衰减由高精度DAC和VVA构成&#xff0c;使用中电思仪的3671E矢量网络分析仪测试DUT的S参数&#xff0c;并自动化调整VVA的控制电压&#xff0c;以自动化获取指定衰减值对应的控制电平。 二、前期准备 Python环境&…...

设计模式系列(1):总览与引导

目录 前言 设计模式简介 UML与设计模式 术语解释 UML工具与PlantUML 面向对象设计原则(SOLID等) 设计模式分类与典型场景 设计模式的价值 学习与实践建议 常见面试题 推荐阅读 1. 前言 本篇为设计模式系列的第一篇,定位为总览和引导,旨在为后续各专题打下基础,帮助大家…...

Day21打卡—常见降维算法

知识点回顾&#xff1a; LDA线性判别PCA主成分分析t-sne降维 作业&#xff1a; 自由作业&#xff1a;探索下什么时候用到降维&#xff1f;降维的主要应用&#xff1f;或者让ai给你出题&#xff0c;群里的同学互相学习下。可以考虑对比下在某些特定数据集上t-sne的可视化和pca可…...

什么是人工智能(Artificial Intelligence,AI)? —— 机器学习 =》 深度学习 =》 新型技术

文章目录 什么是人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;&#xff1f; —— 关系&#xff1a;AI >> ML >> DL一、机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;1、历史2、类型&#xff08;1&#xff09;监督学习…...

iVX 平台技术解析:图形化与组件化的融合创新

一、图形化逻辑编程&#xff1a;用流程图替代代码的革命 iVX 的核心突破在于可视化逻辑表达—— 开发者通过拖拽 “逻辑块”&#xff08;如条件判断、循环控制、数据操作等&#xff09;来搭建应用逻辑&#xff0c;彻底摒弃传统代码的字符输入模式。这种 “所见即所得” 的开发…...

【Diffusion】在华为云ModelArts上运行MindSpore扩散模型教程

目录 一、背景与目的 二、环境搭建 三、模型原理学习 1. 类定义与初始化 2. 初始卷积层 3. 时间嵌入模块 4. 下采样模块 5. 中间模块 6. 上采样模块 7. 最终卷积层 8. 前向传播 9. 关键点总结 四、代码实现与运行 五、遇到的问题及解决方法 六、总结与展望 一、…...

跟我学c++高级篇——模板元编程之十三处理逻辑

一、元编程处理逻辑 无论在普通编程还是在元编程中&#xff0c;逻辑的处理&#xff0c;都是一个编程开始的必然经过。开发者对普通编程中的逻辑处理一般都非常清楚&#xff0c;不外乎条件谈判和循环处理。而条件判断常见的基本就是if语句&#xff08;switch如果不考虑效率等情…...

组合模式(Composite Pattern)详解

文章目录 1. 什么是组合模式?2. 为什么需要组合模式?3. 组合模式的核心概念4. 组合模式的结构5. 组合模式的基本实现5.1 基础示例:文件系统5.2 透明组合模式 vs 安全组合模式5.2.1 透明组合模式5.2.2 安全组合模式5.3 实例:公司组织结构5.4 实例:GUI组件树6. Java中组合模…...

最长字符串 / STL+BFS

题目 代码 #include <bits/stdc.h> using namespace std;int main() {map<vector<int>, vector<string>> a;set<vector<int>> c;vector<int> initial(26, 0);c.insert(initial);ifstream infile("words.txt");string s;w…...

C++ stl中的set、multiset、map、multimap的相关函数用法

文章目录 序列式容器和关联式容器树形结构和哈希结构树形结构哈希结构 键值对setset的相关介绍set定义方式set相关成员函数multiset mapmap的相关介绍map定义方式map的相关操作1.map的插入2.map的查找3.map的删除 序列式容器和关联式容器 CSTL中包含了序列式容器和关联式容器&…...

普通IT的股票交易成长史--20250511 美元与美股强相关性

声明&#xff1a;本文章的内容非原创。参考了yt博主Andy Lee的观点&#xff0c;为了加深自己的学习印象才做的复盘&#xff0c;不构成投资建议。感谢他的无私奉献&#xff01; 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&#xff01;&#x…...

系统架构设计(四):架构风格总结

黑板 概念 黑板体系架构是一种用于求解复杂问题的软件架构风格&#xff0c;尤其适合知识密集型、推理驱动、数据不确定性大的场景。 它模拟了人类专家协同解决问题的方式&#xff0c;通过一个共享的“黑板”协同多个模块&#xff08;专家&#xff09;逐步构建解决方案。 组…...

ElasticSearch进阶

一、文档批量操作 1.批量获取文档数据 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式&#xff1a;GET请求地址&#xff1a;_mget功能说明 &#xff1a; 可以通过ID批量获取不同index和type的数据请求参数&#xff1a; docs : 文档数组参…...

0基础 | L298N电机驱动模块 | 使用指南

引言 在嵌入式系统开发中&#xff0c;电机驱动是一个常见且重要的功能。L298N是一款高电压、大电流电机驱动芯片&#xff0c;广泛应用于各种电机控制场景&#xff0c;如直流电机的正反转、调速&#xff0c;以及步进电机的驱动等。本文将详细介绍如何使用51单片机来控制L298N电…...

Synchronized与锁升级

一、面试题 1&#xff09;谈谈你对Synchronized的理解 2&#xff09;Sychronized的锁升级你聊聊 3&#xff09;Synchronized实现原理&#xff0c;monitor对象什么时候生成的&#xff1f;知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛&#…...

MNIST DDP 分布式数据并行

Distributed Data Parallel 转自我的个人博客&#xff1a;https://shar-pen.github.io/2025/05/04/torch-distributed-series/3.MNIST_DDP/ The difference between DistributedDataParallel and DataParallel is: DistributedDataParallel uses multiprocessing where a proc…...

语音合成之十三 中文文本归一化在现代语音合成系统中的应用与实践

中文文本归一化在现代语音合成系统中的应用与实践 引言理解中文文本归一化&#xff08;TN&#xff09;3 主流LLM驱动的TTS系统及其对中文文本归一化的需求分析A. SparkTTS&#xff08;基于Qwen2.5&#xff09;与文本归一化B. CosyVoice&#xff08;基于Qwen&#xff09;与文本归…...

9.1.领域驱动设计

目录 一、领域驱动设计核心哲学 战略设计与战术设计的分野 • 战略设计&#xff1a;限界上下文&#xff08;Bounded Context&#xff09;与上下文映射&#xff08;Context Mapping&#xff09; • 战术设计&#xff1a;实体、值对象、聚合根、领域服务的构建原则 统一语言&am…...

如何配置光猫+路由器实现外网IP访问内部网络?

文章目录 前言一、网络拓扑理解二、准备工作三、光猫配置3.1 光猫工作模式3.2 光猫端口转发配置&#xff08;路由模式时&#xff09; 四、路由器配置4.1 路由器WAN口配置4.2 端口转发配置4.3 动态DNS配置&#xff08;可选&#xff09; 五、防火墙设置六、测试配置七、安全注意事…...

C++题题题题题题题题题踢踢踢

后缀表达式求值 #include<bits/stdc.h> #include<algorithm> using namespace std; string a[100]; string b[100]; stack<string> op; int la0,lb0; int main(){while(true){cin>>a[la];if(a[la]".") break;la;}for(int i0;i<la;i){if(…...

M. Moving Both Hands(反向图+Dijkstra)

Problem - 1725M - Codeforces 题目大意&#xff1a;给你一个有向图&#xff0c;起始点在1&#xff0c;问起始点分别与另外n-1个 点相遇的最短时间&#xff0c;无法相遇输出-1。 思路&#xff1a;反向建图&#xff0c;第一层建原图&#xff0c;第二层建反向图&#xff0c;两层…...

11、参数化三维产品设计组件 - /设计与仿真组件/parametric-3d-product-design

76个工业组件库示例汇总 参数化三维产品设计组件 (注塑模具与公差分析) 概述 这是一个交互式的 Web 组件&#xff0c;旨在演示简单的三维零件&#xff08;如带凸台的方块&#xff09;的参数化设计过程&#xff0c;并结合注塑模具设计&#xff08;如开模动画&#xff09;与公…...

智能座舱开发工程师面试题

一、基础知识类 简述智能座舱的核心组成部分及其功能 要求从硬件&#xff08;如显示屏、传感器、控制器&#xff09;和软件&#xff08;操作系统、中间件、应用程序&#xff09;层面展开&#xff0c;阐述各部分如何协同实现座舱的智能化体验。 对比 Android Automotive、QNX…...

【连载14】基础智能体的进展与挑战综述-多智能体系统设计

基础智能体的进展与挑战综述 从类脑智能到具备可进化性、协作性和安全性的系统 【翻译团队】刘军(liujunbupt.edu.cn) 钱雨欣玥 冯梓哲 李正博 李冠谕 朱宇晗 张霄天 孙大壮 黄若溪 在基于大语言模型的多智能体系统&#xff08;LLM-MAS&#xff09;中&#xff0c;合作目标和合…...

06.three官方示例+编辑器+AI快速学习webgl_animation_skinning_additive_blending

本实例主要讲解内容 这个Three.js示例展示了**骨骼动画(Skinning)和变形动画(Morphing)**的结合应用。通过加载一个机器人模型&#xff0c;演示了如何同时控制角色的肢体动作和面部表情&#xff0c;实现更加丰富的角色动画效果。 核心技术包括&#xff1a; 多动画混合与淡入…...

【Java学习日记36】:javabeen学生系统

ideal快捷键...

.Net HttpClient 使用请求数据

HttpClient 使用请求数据 0、初始化及全局设置 //初始化&#xff1a;必须先执行一次 #!import ./ini.ipynb1、使用url 传参 参数放在Url里&#xff0c;形如&#xff1a;http://www.baidu.com?namezhangsan&age18, GET、Head请求用的比较多。优点是简单、方便&#xff0…...

详解 Java 并发编程 synchronized 关键字

synchronized 关键字的作用 synchronized 是 Java 中用于实现线程同步的关键字&#xff0c;主要用于解决多线程环境下的资源竞争问题。它可以修饰方法或代码块&#xff0c;确保同一时间只有一个线程可以执行被修饰的代码&#xff0c;从而避免数据不一致的问题。 synchronized…...

《Go小技巧易错点100例》第三十二篇

本期分享&#xff1a; 1.sync.Map的原理和使用方式 2.实现有序的Map sync.Map的原理和使用方式 sync.Map的底层结构是通过读写分离和无锁读设计实现高并发安全&#xff1a; 1&#xff09;双存储结构&#xff1a; 包含原子化的 read&#xff08;只读缓存&#xff0c;无锁快…...

时序约束高级进阶使用详解四:Set_False_Path

目录 一、背景 二、Set_False_Path 2.1 Set_false_path常用场景 2.2 Set_false_path的优势 2.3 Set_false_path设置项 2.4 细节区分 三、工程示例 3.1 工程代码 3.2 时序约束如下 3.3 时序报告 3.4 常规场景 3.4.1 设计代码 3.4.2 约束场景 3.4.3 约束对象总结…...

每日定投40刀BTC(16)20250428 - 20250511

定投 坚持 《恒道》 长河九曲本微流&#xff0c;岱岳摩云起累丘。 铁杵十年销作刃&#xff0c;寒窗五鼓淬成钩。已谙蜀栈盘空险&#xff0c;更蓄湘竹带泪遒。 莫问枯荣何日证&#xff0c;星霜满鬓亦从头。...

C# 高效处理海量数据:解决嵌套并行的性能陷阱

C# 高效处理海量数据&#xff1a;解决嵌套并行的性能陷阱 问题场景 假设我们需要在 10万条ID 和 1万个目录路径 中&#xff0c;快速找到所有满足以下条件的路径&#xff1a; 路径本身包含ID字符串该路径的子目录中也包含同名ID 初始代码采用Parallel.ForEach嵌套Task.Run&am…...

【Java EE初阶 --- 多线程(初阶)】线程安全问题

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 线程不安全的原因根本原因…...

从InfluxDB到StarRocks:Grab实现Spark监控平台10倍性能提升

Grab 是东南亚领先的超级应用&#xff0c;业务涵盖外卖配送、出行服务和数字金融&#xff0c;覆盖东南亚八个国家的 800 多个城市&#xff0c;每天为数百万用户提供一站式服务&#xff0c;包括点餐、购物、寄送包裹、打车、在线支付等。 为了优化 Spark 监控性能&#xff0c;Gr…...

《Redis应用实例》学习笔记,第一章:缓存文本数据

前言 最近在学习《Redis应用实例》&#xff0c;这本书并没有讲任何底层&#xff0c;而是聚焦实战用法&#xff0c;梳理了 32 种 Redis 的常见用法。我的笔记在 Github 上&#xff0c;用 Jupyter 记录&#xff0c;会有更好的阅读体验&#xff0c;作者的源码在这里&#xff1a;h…...

Redis 缓存

缓存介绍 Redis 最主要三个用途&#xff1a; 1&#xff09;存储数据&#xff08;内存数据库&#xff09; 2&#xff09;消息队列 3&#xff09;缓存 对于硬件的访问速度&#xff0c;通常有以下情况&#xff1a; CPU 寄存器 > 内存 > 硬盘 > 网络 缓存的核心…...

Apache Flink 与 Flink CDC:概念、联系、区别及版本演进解析

Apache Flink 与 Flink CDC:概念、联系、区别及版本演进解析 在实时数据处理和流式计算领域,Apache Flink 已成为行业标杆。而 Flink CDC(Change Data Capture) 作为其生态中的重要组件,为数据库的实时变更捕获提供了强大的能力。 本文将从以下几个方面进行深入讲解: 什…...

缓存(4):常见缓存 概念、问题、现象 及 预防问题

常见缓存概念 缓存特征: 命中率、最大元素、清空策略 命中率&#xff1a;命中率返回正确结果数/请求缓存次数 它是衡量缓存有效性的重要指标。命中率越高&#xff0c;表明缓存的使用率越高。 最大元素&#xff08;最大空间&#xff09;&#xff1a;缓存中可以存放的最大元素的…...