【JavaSE】数组的定义和使用(上)
数组的定义和使用(上)
- 6-数组的定义与使用
- 1. 数组的基本概念
- 1.1 为什么要使用数组
- 1.2 什么是数组
- 1.3 数组的创建及初始化
- 1.3.1 数组的创建
- 1.3.2 数组的初始化
- 1.4 数组的使用
- 1.4.1 数组中元素的访问
- 1.4.2 遍历数组
- 2. 数组是引用类型
- 2.1 初始JVM的内存分布
- 2.2 基本数据变量与引用类型变量的区别
- 2.3 再谈引用变量
- 2.4 认识null
- 3. 数组的应用场景
- 3.1 保存数据
- 3.2 作为函数的参数
- 3.2.1 实参传递基本数据类型
- 3.2.2 实参传递数组类型
- 3.3 作为函数的返回值
6-数组的定义与使用
【本节目标】
-
理解数组基本概念
-
掌握数组的基本用法
-
数组与方法互操作
-
熟练掌握数组相关的常见问题和代码
1. 数组的基本概念
1.1 为什么要使用数组
假设现在要存5个学生的考试成绩,并对其进行输出,按照之前掌握的知识点,我么会写出如下代码:
public static void main(String[] args){int score1 = 70;int score2 = 80;int score3 = 85;int score4 = 60;int score5 = 90;System.out.println(score1);System.out.println(score2);System.out.println(score3);System.out.println(score4);System.out.println(score5);
}
上述代码没有任何问题,但不好的是:如果有20名同学成绩呢,需要创建20个变量吗?有100个学生的成绩那不得
要创建100个变量。仔细观察这些学生成绩发现:所有成绩的类型都是相同的,那Java中存在可以存储相同类型多个数据的类型吗?这就是本节要将的数组。
1.2 什么是数组
数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。
在java
中,包含6个整形类型元素的数组,其中:
-
数组中存放的元素其类型相同
-
数组的空间是连续的
-
每个空间有自己的编号,起始位置的编号为0,即数组的下标。我们通过下标(索引 )访问数组。
数组的作用:存储一组相同数据类型的数据。
那在程序中如何创建数组呢?
1.3 数组的创建及初始化
1.3.1 数组的创建
定义数组的三种方法
int[] arr1 = {1,2,3,4,5,6};//定义数组的方法1。
//int [] 是数据类型 arr 是数组名
int[6] arr = {1,2,3,4,5,6};//error,不允许定义数组的大小
int[] arr2 = new int[]{1,2,3,4,5,6};//定义数组的方法2。
int[] arr3 = new int[10];//定义数组的方法3。
//方法一同时定义+初始化
//方法二完全等价于方法一,相当于方法一是方法二的简写版本
//new是一个关键字,我们一般通过new关键字实例化对象
专业术语:
实例化对象==新建了一个对象
其实Java当中的数组就是一个对象。
我们可能听过这样一句话:Java当中一切皆对象。
在方法三中:只是定义了数组,并没有初始化,只是分配了内存,在没有初始化的时候,系统默认初始化为0。
并且只有方法三是能够初始化自己的空间。
其他两种方法如果对数组进行指定大小的初始化都会报错。
我们一般使用最多的是方法一。其他两种方法使用较少。
1.3.2 数组的初始化
数组的初始化主要分为动态初始化以及静态初始化。
- 动态初始化:在创建数组时,直接指定数组中元素的个数
int[] array = new int[10];
- 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
语法格式: 数据类型[] 数组名称 = {data1, data2, data3, ..., datan};
int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = new String[]{"hell", "Java", "!!!"};
【注意事项】
- 静态初始化虽然没有指定数组的长度,编译器在编译时会根据{}中元素个数来确定数组的长度。
- 静态初始化时, {}中数据类型必须与[]前数据类型一致。
- 静态初始化可以简写,省去后面的new T[]。
// 注意:虽然省去了new T[], 但是编译器编译代码时还是会还原
int[] array1 = {0,1,2,3,4,5,6,7,8,9};
double[] array2 = {1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = {"hell", "Java", "!!!"};
- 数组也可以按照如下C语言个数创建,不推荐
/*
该种定义方式不太友好,容易造成数组的类型就是int的误解
[]如果在类型之后,就表示数组类型,因此int[]结合在一块写意思更清晰
*/
int arr[] = {1, 2, 3};
- 静态和动态初始化也可以分为两步,但是省略格式不可以。
//动态
int[] array1;
array1 = new int[10];
//静态
int[] array2;
array2 = new int[]{10, 20, 30};
// 注意省略格式不可以拆分, 否则编译失败
// int[] array3;
// array3 = {1, 2, 3};
//只能在一行写完
- 如果没有对数组进行初始化,数组中元素有其默认值
○如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值,比如:
类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0 |
char | \u0000 |
boolean | false |
○如果数组中存储元素类型为引用类型,默认值为null
1.4 数组的使用
1.4.1 数组中元素的访问
**数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。**比如:
int[]array = new int[]{10, 20, 30, 40, 50};
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]);
// 也可以通过[]对数组中的元素进行修改
array[0] = 100;
System.out.println(array[0]);
【注意事项】
-
数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素
-
下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。
public static void main(String[] args) {int[] arr = {1,2,3};System.out.println(arr[3]);
}
//--------------
//编译器运行结果为
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
// at Test.main(Test.java:14)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0l13PT0r-1677938123591)(https://typora-888.oss-cn-hangzhou.aliyuncs.com/20221115110747.png)]
1.4.2 遍历数组
所谓 “遍历” 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作,比如:打印
方法一
public static void main(String[] args) {int[] array = {1,2,3,4,5,6};for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}
}
//---------------
//编译器运行结果为
//1 2 3 4 5 6
方法二
也可以使用 for-each 遍历数组
for (int x:array) {System.out.print(x + " ");
}
//-----------
//编译器运行结果为
//1 2 3 4 5 6
方法三
在Java当中有一个类Arrays
是用来专门操作数组的。
在Array
类当中有一个方法叫做toString
toString
的作用:返回指定数组的内容的字符串表示形式。
返回类型为String
类型
代码示例
public static void main(String[] args) {int[] arr = {1,2,3,4};String ret = Arrays.toString(arr);System.out.println(ret);
}
//----------
//编译器运行结果为
//[1, 2, 3, 4]
所以在Java当中,如果只是简单的打印数组可以使用toString
方法。
在Arrays
当中还有很多的方法,我们可以使用例如:Arrays.sort
就可以按照一定的顺序对数组进行排序。
代码示例
public static void main(String[] args) {int[] arr = {4,3,2,1};Arrays.sort(arr);String ret = Arrays.toString(arr);System.out.println(ret);
}
//-------------
//编译器运行结果为
//[1, 2, 3, 4]
数组长度的求法
数组名.length
就可以求出数组的长度
代码示例
public static void main(String[] args) {int[] arr = {1,2,3};System.out.println(arr.length);
}
//-------------
//编译器运行结果为
//3
2. 数组是引用类型
2.1 初始JVM的内存分布
内存是一段连续的存储空间,主要用来存储程序运行时数据的。
我们对JVM虚拟机当中的内存进行了不同的划分。
程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址
虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。
本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的
堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。
方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. 方法编译出的的字节码就是保存在这个区域
现在我们只简单关心堆 和 虚拟机栈这两块空间,后序JVM
中还会更详细介绍。
我们平常说的栈区就是虚拟机栈。
int[] arr = {1,2,3};
我们将数据{1,2,3}
存放到堆区,再将数组的地址存放到栈区。所以可以理解为arr当中存放的是数组的地址。
我们把存储地址的变量称为引用变量。
public static void main(String[] args) {int[] arr = {4,3,2,1};System.out.println(arr);
}
//-----------
//编译器运行结果为
//[I@1b6d3586
[I@1b6d3586
当中[
代表是一个数组,I
代表是int类型的数组 @
是分隔符 1b6d3586
可以暂且看作为数组当中存储的地址。
2.2 基本数据变量与引用类型变量的区别
基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址
public static void func() {int a = 10;int b = 20;int[] arr = new int[]{1,2,3};
}
在上述代码中,a、b、arr,都是函数内部的变量,因此其空间都在func方法对应的栈帧中分配。
a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。
array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhNUz8cE-1677938123592)(https://typora-888.oss-cn-hangzhou.aliyuncs.com/20221115180629.png)]
从上图可以看到,引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。有点类似C语言中的指针,但是Java中引用要比指针的操作更简单。
补充
Java当中的局部变量在使用的时候必须初始化。
所以局部变量必须进行初始化,初始化的方法代码示例
public static void main(String[] args) {int a = 0;System.out.println(a);int[] arr = null;System.out.println(arr);
}
//--------------
//编译器运行结果为
//0
//null
当我们用null赋值给引用类型变量的时候,表示不指向任何对象。
如果再使用空指针赋值后的变量,就会空指针异常。
public static void main(String[] args) {int[] arr = null;System.out.println(arr[0]);
}
//------------
//编译器运行结果为
//Exception in thread "main" java.lang.NullPointerException
// at Test.main(Test.java:13)
对于空指针进行的任何操作都会报NPE,所以根据问题所在位置,判断为什么会是空指针。
2.3 再谈引用变量
代码一
public static void main(String[] args) {int[] arr1 = {1,2,3,4,5};arr1[0] = 9;int[] arr2 = arr1;arr2[0] = 10;System.out.println(Arrays.toString(arr1));System.out.println(Arrays.toString(arr2));
}
//-----------
//编译器运行结果为
//[10, 2, 3, 4, 5]
//[10, 2, 3, 4, 5]
因为arr1
当中存储的是数组{1,2,3,4,5,}
的地址,所以int[] arr2 = arr1
将数组的地址存储在arr2
当中,所以arr1
等价于arr2
。
代码二
public static void main(String[] args) {int[] arr1 = {1,2,3,4};int[] arr2 = {11,22,33,44};arr1 = arr2;arr1[0] = 55;System.out.println(Arrays.toString(arr1));System.out.println(Arrays.toString(arr2));
}
//------------
//编译器运行结果为
//[55, 22, 33, 44]
//[55, 22, 33, 44]
如果没有人引用a对象,那么a对象就会被系统自动回收。
代码三
public static void main(String[] args) {int[] array1 = new int[3];array1[0] = 10;array1[1] = 20;array1[2] = 30;int[] array2 = new int[]{1,2,3,4,5};array2[0] = 100;array2[1] = 200;array1 = array2;array1[2] = 300;array1[3] = 400;array2[4] = 500;for (int i = 0; i < array2.length; i++) {System.out.println(array2[i]);}
}
//-------------
//编译器运行结果为
//100
//200
//300
//400
//500
2.4 认识null
null 在 Java 中表示 “空引用” , 也就是一个不指向对象的引用。
int[] arr = null;
System.out.println(arr[0]);
// 执行结果
//Exception in thread "main" java.lang.NullPointerException
// at Test.main(Test.java:6)
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 NullPointerException
注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联.
3. 数组的应用场景
3.1 保存数据
public static void main(String[] args) {int[] array = {1, 2, 3};for(int i = 0; i < array.length; ++i){System.out.print(array[i] + " ");}
}
//-----------
//编译器运行结果为
//1 2 3
3.2 作为函数的参数
3.2.1 实参传递基本数据类型
public static void main(String[] args) {int num = 0;func(num);System.out.println("num = " + num);
}
public static void func(int x) {x = 10;System.out.println("x = " + x);
}
// 执行结果
x = 10
num = 0
发现在func方法中修改形参 x 的值, 不影响实参的 num 值.
3.2.2 实参传递数组类型
public static void func2(int[] arr) {arr[0] = 99;
}
public static void main(String[] args) {int[] arr = {1,2,3,4};func2(arr);System.out.println(Arrays.toString(arr));
}
//------------
//编译器运行结果为
//[99, 2, 3, 4]
通过指针进行修改。
**总结:**当数组作为参数进行传递的时候,其实还是按值传递,只不过此时的值是一个地址。
那么会出现两种情况:
1.形参的指向发生修改:
array = new int[10];
2.通过地址进行修改指向对象的值
array[0] = 9;
3.3 作为函数的返回值
代码一
public static int[] func10() {int[] tmpArr = {10,11,12};return tmpArr;
}
public static void main(String[] args) {int[] array = func10();System.out.println(Arrays.toString(array));
}
//-----------
//编译器运行结果为
//[10, 11, 12]
当把数组的地址返回之后,tmpArr
变量进行销毁,但是地址存储到了array
当中。
代码二
获取斐波那契数列的前N项
public static int[] fib(int n){if(n <= 0){return null;}int[] array = new int[n];array[0] = array[1] = 1;for(int i = 2; i < n; ++i){array[i] = array[i-1] + array[i-2];}return array;
}
public static void main(String[] args) {int[] array = fib(10);for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}
}
相关文章:

【JavaSE】数组的定义和使用(上)
数组的定义和使用(上)6-数组的定义与使用1. 数组的基本概念1.1 为什么要使用数组1.2 什么是数组1.3 数组的创建及初始化1.3.1 数组的创建1.3.2 数组的初始化1.4 数组的使用1.4.1 数组中元素的访问1.4.2 遍历数组2. 数组是引用类型2.1 初始JVM的内存分布2…...

计算机的学习路线
本文是介绍如何成为一个Geek,一个真正的计算机高手。 适合有成为IT领域技术大牛的人参考。 写给大一新生和所有向深耕IT领域的人,避免走一些弯路。 第一门入门的必备功课-语法与算法 什么是计算机? 用来做运算的机器 电子计算机在运算方面…...

TD算法超详细解释,一篇文章看透彻!
【已解决】TD算法超详细解释和实现(Sarsa,n-step Sarsa,Q-learning)一篇文章看透彻! 郑重声明:本系列内容来源 赵世钰(Shiyu Zhao)教授的强化学习数学原理系列,本推文出于非商业目的分享个人学习…...

4.1 路由器(华硕 官改/梅林 华为 小米 路由) 使用花生壳 实现远程管理
最近添置了一台华硕的八爪鱼GT AC5300,到手后刷了官改,而里面软件中就提供了花生壳程序,想到花生壳为每个用户提供了两条免费映射(带宽为1mbs,流量为1g/月),所以就打算利用来做一个远程访问。具…...

内容算法解读:提高内容摘要与原文的一致性(Faithfulness)
全文摘要:受益于预训练语言模型的发展,应用神经网络模型提取内容摘要的技术也获得了长足进步。但目前还存在一个未被很好解决的问题:神经网络模型提取的摘要不能如实反映原文档的中心思想,没有做到忠实(not faithful&a…...

python用openpyxl包操作xlsx文件,统计表中合作电影数目最多的两个演员
题目🎉🎉🎉:编程完成下面任务:已知excel文件“电影导演演员信息表.xlsx”如下图所示:🍳🍳🍳要求:使用 openpyxl 包操作打开此文件,编写程序统计在…...

Lesson12---人工神经网络(1)
12.1 神经元与感知机 12.1.1 感知机 感知机: 1957, Fank Rosenblatt 由两层神经元组成,可以简化为右边这种,输入通常不参与计算,不计入神经网络的层数,因此感知机是一个单层神经网络 感知机 训练法则&am…...
算法练习-排序(二)
算法练习-排序(二) 文章目录算法练习-排序(二)1 合并排序的数组1.1 题目1.2 题解2 有效的字母异位词2.1 题目2.2 题解3 判断能否形成等差数列3.1 题目3.2 题解4 合并区间4.1 题目3.2 题解5 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面5.1 题目5.2 题解6 颜色分类6.1 题目6.…...

202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多
202302读书笔记|《长安的荔枝》——只要肯努力,办法总比困难多 《长安的荔枝》这本书真是酣畅淋漓啊,读起来一气呵成,以讲故事的口吻叙述,上林署九品小官员——李善德,兢兢业业工作多年,终于借贷买了房&…...

java封装继承多态详解
1.封装 所谓封装,就是将客观事物封装成抽象的类,并且类可以把数据和方法让可信的类或者对象进行操作,对不可信的类或者对象进行隐藏。类就是封装数据和操作这些数据代码的逻辑实体。在一个类的内部,某些属性和方法是私有的&#…...

【uni-app教程】UniAPP 常用组件和 常用 API 简介# 知心姐姐聊天案例
五、UniAPP 常用组件简介 uni-app 为开发者提供了一系列基础组件,类似 HTML 里的基础标签元素,但 uni-app 的组件与 HTML 不同,而是与小程序相同,更适合手机端使用。 虽然不推荐使用 HTML 标签,但实际上如果开发者写了…...

阿尔法开发板 .bin 文件烧写
一. IMX6ULL 开发板简介 IMX6ULL 开发板是正点原子提供的阿尔法开发板,所用芯片为恩智浦,基于 Cortex-A7 架构。 这里介绍一下裸机篇中,关于如何将 .bin 文件烧写进 SD 卡,从而设备运行程序。 二. xx.bin 文件烧写 IMX6ULL支…...

Ceres-Solver 安装与卸载ubuntu20.04
卸载 sudo rm -rf /usr/local/lib/cmake/Ceres /usr/local/include/ceres /usr/local/lib/libceres.a 安装 sudo apt-get install libatlas-base-dev libsuitesparse-dev git clone https://github.com/ceres-solver/ceres-solver cd ceres-solver git checkout $(git descr…...

汇编系列02-借助操作系统输出Hello World
说明:本节的程序使用的是x86_64指令集的。 汇编语言是可以编译成机器指令的,机器指令是可以直接在CPU上面执行的。我们编写的汇编程序既可以直接在操作系统的帮助下执行,也可以绕过操作系统,直接在硬件上执行。 如果你打算编写的汇编程序在…...

【2023unity游戏制作-mango的冒险】-前六章API,细节,BUG总结小结
👨💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏:unity游戏制作 ⭐mango的冒险前六章总结⭐ 文章目录⭐mango的冒险前六章总结⭐👨&a…...
进程控制及其操作
进程创建1.1 fork()函数1.2 fork()函数的返回值进程等待2.1 进程等待的必要性1.之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。 2.另外,进程一旦变成僵尸状态,那…...

Git常用命令复习笔记
1. Git与SVN区别,各自优缺点 Git: 分布式,每个参与开发的人的电脑上都有一个完整的仓库,不担心硬盘出问题;在不联网的情况下,照样可以提交到本地仓库,可以查看以往的所有log,等到有…...

代码随想录算法训练营day49 | 动态规划 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV
day49123.买卖股票的最佳时机III1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组188.买卖股票的最佳时机IV1.确定dp数组以及下标的含义2.确定递推公式4.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组123.买卖股票的最佳时机III …...

【教学典型案例】14.课程推送页面整理-增加定时功能
目录一:背景介绍1、代码可读性差,结构混乱2、逻辑边界不清晰,封装意识缺乏3、展示效果不美观二:案例问题分析以及解决过程1、代码可读性…...
【算法基础】DFS BFS 进阶训练
DFS与BFS的基础篇详见:https://blog.csdn.net/m0_51339444/article/details/129301451?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129301451%22%2C%22source%22%3A%22m0_51339444%22%7D 一、案例分析1 (树的重心 —— D…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...