Java程序基础⑤Java数组的定义和使用+引用的概念
目录
1. Java数组的基本概念
1.1 数组的定义
1.2 数组存在的意义
1.3 数组的使用
1.4 二维数组
2. 引用类型+JVM的内存分布
2.1 JVM的内存分布
2.2 基本数据类型和引用型数据类型的区别
2.3 引用注意事项
2.4 传值传递
3. 数组总结和应用场景
3.1 一维数组和二维数组的存储
3.2 引用的概念
3.3 数组的应用场景
1. Java数组的基本概念
1.1 数组的定义
在C语言中我们也学过数组,数组是一组相同元素的集合,其内存储的都是相同类型的元素,数组在内存空间里面是连续的,这也就意味着我们只需要知道数组的首地址就可以找到后面的所有元素。
Java里面的数组定义和C语言的大相径庭,但是在Java里面同样也可以使用C语言的数组定义方式,只是有些别扭。
为什么说Java用C语言的数组定义方式有些别扭呢?
我们知道数组的内容是一组相同类型元素的集合,而数组的类型和内容的类型是息息相关的,如果内容是int型的,那么数组的类型就是int[ ]型的,那么看C语言的数组的定义方式,中括号[ ]在数组名的后面,数组的类型直接给数组名分割开来了
再看Java的数组定义方式,数组名在类型的后面,一般来说,我们平时定义变量的时候都是先写类型,然后变量名,然后再赋值。
public static void main(String[] args) {int a = 100;double d = 1.0;String str = "rtx";}
那这么一对比,是不是显得C语言的数组定义方式很别扭,所以在Java中数组定义方式都是先写内容类型然后加[ ] ,然后是数组名,再然后是内容,不过Java的数组定义方式有三种:
public static void main(String[] args) {int[] array1 = {1,2,3,4}; // 方法1int[] array2 = new int[]{1,2,3,4}; // 方法2int[] array3 = new int[X]; // 方式3}
方法1和方法2叫做静态初始化: 在创建数组的时候不直接指定数据元素的个数,而直接将具体的数据内容进行指定,方法1可以说是方法2 的简写,平时比较常用方法1,在编译器编译代码的时候,会将方法1 给还原成方法2 的格式。但是需要注意的是使用方法2的时候 [ ]内不可以写任何数值,否则报错。
方法3叫做动态初始化: 在创建数组的时候直接指定数组中元素的个数,当我们使用该方法定义数组时,我们只是为数组开辟了空间,并没有进行初始化,此时数组内的内容默认为0,不管是任何类型,都是其对应的默认0值。
public static void main(String[] args) {int N = 10;int[] array1 = {1,2,3,4}; // 方法1int[] array2 = new int[]{1,2,3,4}; // 方法2int[] array3 = new int[N]; // 方式3System.out.println("array3[3] = " + array3[3]);}
如果数组内存储的是基本数据类型,默认值为基本数据类型对应的0值。如果数组内存储的是引用型数据类型,默认值为null
1.2 数组存在的意义
在编程代码过程中,比如我们需要定义学生类,类里面有学生的年龄成员,此时我们需要把学生的年龄输入进去。并且需要将其输出,在没有数组的情况下,我们只能:
public static void main(String[] args) {int a1 = 10;int a2 = 10;int a3 = 10;int a4 = 10;int a5 = 10;int a6 = 10;int a7 = 10;int a8 = 10;int a9 = 10;int a10 = 10;}
一旦数量特别大,我们需要创建大量的变量,占用大量的时间,占用大量的代码行,导致代码的可读性下降,得不偿失,这个时候数组的出现解决了这个问题,由于类型都是相同的,直接可以存储到数组中,方便快捷,同时代码的可读性也提高了。
1.3 数组的使用
数组是一段连续的内存空间,支持随机访问。 我们只需要通过数组的下标就可以将数组的内容提取出来,数组的每个空间都有自己的下标,起始空间的下标为0,只需要知道对应内容的下标,就可以将对应位的内容提取出来。
数组的下标从0开始,介于 [ 0 , 数组个数-1 ] 之间,不能越界,否则报出数组越界异常。
数组的存在就是方便数据的存储和数据的调用,当我们需要将数组的内容全部打印出来时,就需要用到数组的遍历,通常情况下遍历某个内容我们都是使用循环遍历的,数组也是如此。
方法1: 通过下标进行循环遍历。
int[] array = {1, 2, 3, 4, 5};for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}
方法2:不通过下标,只是简单的遍历数组。
int[] array = {1, 2, 3, 4, 5};for (int x : array) {System.out.println(x);}
两者没有太大的区别,唯一就是是否依靠下标
打印数组内容还有一个方法,就是使用Java提供的Arrays.toString()方法,只需要输入数组,直接将返回值进行打印即可。
int[] array = {1, 2, 3, 4, 5};System.out.println(Arrays.toString(array));
1.4 二维数组
无论是C语言还是Java,二维数组都是由一维数组构成的,这也就意味着二维数组本质上是一个一维数组,只是有些特殊,二维数组的每个元素就是一个一维数组。
二维数组的定义语法:
和一维数组的定义方式相似,不管需要注意的是初始化数据需要将内容用{ }分割开来。
int[] array = {1, 2, 3, 4, 5};System.out.println(Arrays.toString(array));
2. 引用类型+JVM的内存分布
在了解什么是引用类型之前我们需要先了解什么是JVM的内存分布。
2.1 JVM的内存分布
内存是一段连续的空间,是一段有限性的空间,并非无穷无尽,其主要用来存储程序运行时数据的。
- 程序运行时代码需要加载到内存
- 程序运行时产生的中间数据要存放在内存中
- 程序中定义的常量有需要保存
- 有些数据需要长时间存储,有些数据应该在方法运行结束后就要被销毁
内存中含有各式各样的数据,如果不加区分的随意存放,那么会有可能导致内存提前耗尽,从而导致程序异常终止,内存的管理也非常困难。在干净整洁的空间内查找事物和在脏乱差的空间内查找事物,那种环境查找更加方便?
所以需要对内存进行划分,是为了更好的归纳和整理我们的内存从而提高内存的利用率。
因此JVM也对使用的内存按照不同的功能进行了划分,当前只需要对虚拟机栈和堆进行了解即可。引用类型和两者之间有重要关系。
- 程序计数器:用于保存下一条执行的指令的地址。
- 虚拟机栈:每个方法在执行时,都会先创建一个栈帧,栈帧内包含:局部变量,操作数栈,动态链接,返回地址以及其他的一些信息,保存的都是和方法有关的信息。当方法运行结束后,栈帧会主动销毁,栈帧中保存的数据也随之销毁了,当下一次再调用该方法时,又会重新创建栈帧。
- 本地方法栈:本地方法栈的作用和虚拟机栈的类似,但是本地方法栈是用于保存被Native方法修饰的局部变量,被Native关键字修饰的方法是由C/C++的代码编写的,JVM本质上也是由C/C++代码编写的。
- 堆:JVM管理的最大内存区域,使用new创建的对象都是保存在堆上的,堆是随之程序的开始运行而创建,随着程序的退出而创建,堆中的数据只要还在使用,那么就不会被销毁。
- 方法区:用于存储已经被虚拟机加载的类信息,常量,静态常量,以及编译器编译后的代码等数据,方法的字节码文件就是保存在这个区域。
2.2 基本数据类型和引用型数据类型的区别
- 基本数据类型创建的变量,称之为变量,该变量空间内存储的是其所对应的值,该变量空间是栈。
- 引用型数据类型创建的变量,一般作为对象的对象的引用,称之为引用变量,其变量空间内存储的是对象在堆上的地址。
public static void main(String[] args) {int a = 1;int b = 2;int[] array = {1,2,3};System.out.println(a);System.out.println(b);System.out.println(array);}
输出:
数组也是引用类型的,引用类型一般是:数组,类,接口,枚举。
变量a,b,array都是属于局部变量,并且都是存储在虚拟机栈上的,只是两者存储的内容不同,局部变量a和b存储的是实际值,而变量array也叫做引用变量,存储的是数组对象的地址。
上面输出中,“[ I @4eec7777”可以理解为数组在堆空间中的首地址,[ 表示的是该地址存储的是数组对象,I 表示的是该数组对象的类型是int,@是分隔符 ,4eeec7777表示地址,“[ I @4eec7777”并不是真正意义上的地址,但是可以将其当做地址使用,“[ I @4eec7777”就像是没有拆包装的面包,面包被外层的塑料包裹起来,保护里面可以食用的面包,“[ I @4eec7777”就是和面包一样,被封装保护起来了,但同时被塑料包裹起来的面包也叫面包,“[ I @4eec7777”也可以被称之为地址,同时也可以当真正的地址一样使用。
引用变量并不直接存储对象本身,可以简单理解为存储的是对象在堆空间中的起始地址,通过该地址便可以去操作对象,引用变量可以简称为引用。有点类似于C语言的指针,但是Java的引用使用起来比指针更加容易,引用的使用不需要频繁的解引用,可以直接使用。
public static void main(String[] args) {int[] array; // 代码1array = new int[]{1,2,3}; // 代码2}
代码1中,仅是在虚拟机栈上开辟了一块空间给引用array,但该空间里面并没有实际内容,可以理解为真正意义上的空,此时array是没有引用任何对象的,也就是此时:array == null,此时不可以对引用array进行任何调用对象的操作,否则会报空指针异常。
代码2中,此时使用new在堆上开辟了一块空间,给int[ ]类这个对象进行存储,并且把对象的地址存储到array中,此时栈空间中array的空间内不再是空,而是存储数组对象的地址。
需要注意的是:代码2里面的等号“=”并不是真正意义上的赋值的意思,而是将对象的地址传递给变量,类似于返回值。
2.3 引用注意事项
看一段代码:
public static void main(String[] args) {int[] array1 = {1,2,3};int[] array2 = {1,2,3,4,5,6};array2 = array1; // 代码1System.out.println(Arrays.toString(array1)); // 代码2System.out.println(Arrays.toString(array2)); // 代码3}
代码1的意思并不是引用array1引用array2的意思,而是引用array1引用array2所指向的对象,原本在代码1之前,array1和array2两个引用指向的是不同对象,但是经过代码1之后,两个引用指向了同一个对象。
此时引用array2原本指向的对象没有任何引用指向它,我们就无法再找到该对象进行操作了,这也就意味着该对象的地址找不到了,JVM就会将该对象进行销毁回收。当运行代码2和3时,打印出来的结果就是1,2,3。
2.4 传值传递
在C语言中有传值和传参两种,但是在Java中就只有一种,那就是传值,只是这个值可以是引用,也可以是实际值。
public static void func1(int ii) {ii = 2;System.out.println(ii);}public static void func2(int[] array2) {array2[0] = 10;}public static void func3(int[] array3) {array3 = new int[]{11,22,33};}public static void main(String[] args) {int i = 1;int[] array = {1,2,3,4};func1(i);func2(array);func3(array);System.out.println("i = " + i);System.out.println("array = " + Arrays.toString(array));}
从学习C语言的角度来说,传值,是不会修改实参本身的,这个说法在Java中不全对。在Java中的传值传递,首先要看你传的值是什么类型的。
- 该值是基本数据类型的,那么传参绝对不会修改实参本身。
- 如果值是引用型数据类型的,那么传参就有可能会改变实参本身,因为值是引用型数据类型,此时传参就相当与array2 = array,这也就意味着array和array2同时是指向同一个对象的,通过array操作该对象等同于array2操作该对象。但还是具体要看传参后形参做了什么,并不是说一定会修改实参的内容。
在方法func3中,方法内部给形参重新new了一个对象,那么此时形参和实参是指向两个完全没有关系的对象,那么此时两者再怎么操作都不会再影响到对方了
在方法func2中,代码:array2[0] = 10,该代码的意思是:将数组下标为0的空间里面存储的数值修改为10,此时因为array2和array指向的是同一个对象,那也就是真正意义上的形参的修改影响到了实参,代码array2[0] = 10等同于array[0] = 10。
在方法func1中,形参和实参是两个完全互不影响的栈帧,在方法内部无论如何对形参修改,当方法运行结束了之后,都不会对实参造成任何影响。
3. 数组总结和应用场景
3.1 一维数组和二维数组的存储
一维数组的存储:
二维数组的存储:
int[][] array = {{1,2,3},{4,5,6}};该二维数组由两个一维数组组成,分别为:array[0]和array[1]组成。
为什么说二维数组本质上是一个特殊的一维数组呢?
其实可以把二维数组理解为,有X行,里面加存储有X个一维数组,二维数组的引用虽然类型是int[ ][ ],但实际上在堆空间里面建立的还是一维数组,只是这个一维数组里面存储的不是基本数据类型,而是引用型数据类型,也就意味着,这个一维数组里面存储的是引用,此时这个引用的类型是一维数组。
遍历二维数组也很简单,使用两次for循环,并且范围分别是二维数组的范围和一维数组的范围。
int[][] array = {{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();}
3.2 引用的概念
引用本质上是一个变量,但是引用本身并不存储相应的实际值,而是用于存储对象的地址,此时就可以同过引用去对对象进行操作,这也就意味着引用的作用并非存储实际值。当我们创建一个对象时,实际上是在堆上为对象开辟了一块空间,但此时我们没办法直接对对象进行操作,对象也根本没有名字,也就是只有内在没有外表。
此时我们就需要一个类似于指针的东西,能够通过操作对象,而唯一能够将两个空间给联系起来的方法就是一个空间能够找到另外一个空间,这很明显就是一个空间内存储有另外一个空间的地址,通过地址可以找到另外一个空间的内容并进行操作,此时引用型变量油然而生,而引用型变量也叫做引用。
并且因为形参是实参的临时拷贝,如果在调用方法的时候传递数组,在没有引用的情况下,陡然将实参数组内大量的数据拷贝给实参,拷贝过程中会创建大量的中间变量以及大量的栈帧,一旦数据过多,就会导致系统资源快速消耗,虚拟机栈空间提前消耗,运行效率也会大大降低。而引用的存在恰好解决了这一难题,直接将引用作为实参传递给形参,此时仅仅只是传递了一个数据,形参就可以直接对实参指向的对象直接进行操作,省去了拷贝大量数据的繁琐过程,运行效率大大提升。
3.3 数组的应用场景
3.3.1 保存数据
public static void main(String[] args) {int[] array = {1, 2, 3};for(int i = 0; i < array.length; ++i){System.out.println(array[i] + " ");}
}
3.2.2 参数传基本数据类型
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);
}
发现在 func 方法中修改形参 x 的值 , 不影响实参的 num 值 。
3.2.3 参数传数组类型(引用数据类型)
public static void main(String[] args) {int[] arr = {1, 2, 3};func(arr);System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {a[0] = 10;System.out.println("a[0] = " + a[0]);
}
发现在 func 方法内部修改数组的内容 , 方法外部的数组内容也发生改变 .
因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。
总结 : 所谓的 " 引用 " 本质上只是存了一个地址 . Java 将数组设定成引用类型 , 这样的话后续进行数组参数传参 , 其实只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝 ( 数组可能比较长 , 那么拷贝开销就会很大 )。
比如:获取斐波那契数列的前N项。
public class TestArray {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]);}}
}
相关文章:
Java程序基础⑤Java数组的定义和使用+引用的概念
目录 1. Java数组的基本概念 1.1 数组的定义 1.2 数组存在的意义 1.3 数组的使用 1.4 二维数组 2. 引用类型JVM的内存分布 2.1 JVM的内存分布 2.2 基本数据类型和引用型数据类型的区别 2.3 引用注意事项 2.4 传值传递 3. 数组总结和应用场景 3.1 一维数组和二维数组…...
丁真杯理塘大赛题解
前言:部分代码思路可能与题解思路不同,请勿强行带入 真蛰虫 原题链接 1.一道非常基础的数学题。 2.主要就是在考察分解质因数。首先看真蛰虫的质因数是不是包含了容器的所有质因数,如果没有,那么就不能放入容器中。如果全部包…...
FPGA经验谈系列文章——8、复位的设计
前言 剑法往往有着固定的招式套路,而写代码似乎也存在类似的情况。不知从何时起,众多 FPGA 工程师们在编写代码时开启了一种关于 always 语句块的流行写法,那就是: always @(posedge i_clk or negedge i_rstn) 就笔者所经历的诸多项目以及所接触到的不少工程师而言,大家在…...
Android studio与JS交互
文章目录 前言一、html二、使用步骤1.2.AS 总结 前言 最近在使用Android Studio的WebView,有些功能要AS与JS交互。 一、html html文件 <!DOCTYPE html> <html> <!--javascript--> <head><meta charset"utf-8"><title>Carson…...
健身房小程序服务渠道开展
健身不单单是锻炼身体、保持身材,也是一种社交方式,城市里门店不少,每家都有一定流量和老客,但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户,而消费者也对门…...
大宗商品行业区块链应用
应用场景 区块链技术具有透明性、去中心化、不可篡改等特点,因此可以在大宗商品定价方面得到应用。通过区块链技术,相关交易的各方可以在无需依赖中心化第三方的情况下,实时、准确地获取定价信息。这种技术的应用能够提高效率、降低成本、提…...
软考教材重点内容 信息安全工程师 第 5 章 物理与环境安全技术
5.1.1 物理安全概念 传统上的物理安全也称为实体安全,是指包括环境、设备和记录介质在内的所有支持网络信息系统运行的硬件的总体安全,是网络信息系统安全、可靠、不间断运行的基本保证,并且确保在信息进行加工处理、服务、决策支持的过程中&…...
蓝桥杯每日真题 - 第21天
题目:(空间) 题目描述(12届 C&C B组A题) 解题思路: 转换单位: 内存总大小为 256MB,换算为字节: 25610241024268,435,456字节 计算每个整数占用空间: 每个 32 位整数占用…...
【C++】C++11新特性详解:可变参数模板与emplace系列的应用
C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriori…...
下载并安装Visual Studio 2017过程
一、下载 1、下载链接 下载链接:官方网址 先登录 往下滑找到较早的下载 2、进行搜索下载 或者直接点击🔗网站跳转 3、确认系统信息进行下载 二、安装 下载完成后右键使用管理员身份运行 1、点击同意后安装 2、若报错—设置失败 打开控制面板-&g…...
【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制
目录 一、概述 1.1. 缓冲区管理的重要性 1.2. 实现方式 1.2.1. HCI_Read_Buffer_Size 命令 1.2.2. HCI_Number_Of_Completed_Packets 事件 1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令 1.2.4. HCI_Host_Buffer_Size 命令 1.2.5. HCI_Host_Number_Of_Complete…...
Java开发经验——Spring Test 常见错误
摘要 本文详细介绍了Java开发中Spring Test的常见错误和解决方案。文章首先概述了Spring中进行单元测试的多种方法,包括使用JUnit和Spring Boot Test进行集成测试,以及Mockito进行单元测试。接着,文章分析了Spring资源文件扫描不到的问题&am…...
麦肯锡报告 | 科技落地的真谛:超越技术本身的价值创造
科技创新正在以惊人的速度改变企业运作和客户体验,但实现其潜力的关键在于正确的策略、流程、文化和人才。麦肯锡强调了一个理念:Never just tech(不仅仅是技术)。这表明,成功的数字化转型不仅依赖于技术,还…...
React 常见问题解答:设置、安装、用户事件和最佳实践
在本文中,我们将回答您在开始使用 React 时可能会问的 9 个常见问题。 1、开始使用 React 需要哪些技能和知识? 在深入研究 React 之前,您应该对以下内容有深入的了解: HTML、CSS 和 JavaScript (ES6)&a…...
Mairadb 最大连接数、当前连接数 查询
目录 查询数据库 最大连接数 查询当前连接总数 环境 Mariadb 10.11.6 跳转mysql数据库: 查询数据库 最大连接数 show variables like max_connections; 注意; 这个版本不能使用 : show variables like ‘%max_connections%’; 会报错 ÿ…...
【R库包安装】R库包安装总结:conda、CRAN等
【R库包安装】R库包安装总结:conda、CRAN等 方法1:基于 R 的 CRAN 仓库安装CRAN库包查询从 CRAN 安装 方法2:使用conda安装库包确保已安装 R 和 Conda 环境使用 Conda 官网浏览是否存在相应库包Conda 安装 R 库 方法3:从 GitHub 安…...
php反序列化1_常见php序列化的CTF考题
声明: 以下多内容来自暗月师傅我是通过他的教程来学习记录的,如有侵权联系删除。 一道反序列化的CTF题分享_ctf反序列化题目_Mr.95的博客-CSDN博客 一些其他大佬的wp参考:php_反序列化_1 | dayu’s blog (killdayu.com) 序列化一个对象将…...
LabVIEW动态显示控件方案
在LabVIEW开发中,涉及到动态显示和控制界面的设计时,经常需要根据用户选择的不同参数来动态显示或隐藏相关控件。例如,某些能可能会根据“Type”控件的不同选择显示不同的参数,如“Target”、“Duration”和“EndType”等。在一个…...
游戏引擎学习第22天
移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结: 问题和解决方案: 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…...
GitLab|GitLab报错:PG::ConnectionBad: could not connect to server...
错误信息: PG::ConnectionBad: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"? /opt/gitlab/embedded/service…...
Ray 和 PyTorch
Ray 和 PyTorch 的介绍 Ray 是什么? Ray 是一个用于 分布式计算和机器学习任务 的开源框架,提供了一个高效的、灵活的并行计算平台。它的核心功能是支持分布式计算,帮助开发者以简单的方式扩展 Python 应用程序。 Ray 适用于以下场景&…...
Qt之详解QLockFile 文件锁
文章目录 QLockFile 详解前言什么是 QLockFile?QLockFile 的构造函数和常用成员函数构造函数1. 指定锁文件路径的构造函数 常用成员函数1. lock2. unlock3. isLocked4. setStaleLockTime5. getLockInfo6. removeStaleLock 完整示例代码总结 QLockFile 详解 前言 在…...
从0开始学PHP面向对象内容之常用设计模式(组合,外观,代理)
二、结构型设计模式 4、组合模式(Composite) 组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示”部分–整体“的层次结构。通过组合模式,客户端可以以一致的方式处理单个对…...
机械设计学习资料
免费送大家学习资源,已整理好,仅供学习 下载网址: https://www.zzhlszk.com/?qZ02-%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83SOP.zip...
论文笔记3-XCube: Large-Scale 3D Generative Modeling using Sparse Voxel Hierarchies
目录 Abtract 相关工作 核心算法: 整体流程概述 具体流程解析 1. 输入(Input) 2. 稀疏结构 VAE(Sparse Structure VAE) 3.分层体素潜在扩散(Hierarchical Voxel Latent Diffusion)…...
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能 https://live.csdn.net/v/435737 <template><div><el-popoverstyle"overflow-y: auto; "placement"bottom"trigger"click"><el-inputstyle"margi…...
诠视科技受邀出席“中国虚拟现实产学研大会”
2024年11月2-3日,由中国虚拟现实技术与产业创新平台举办的第十届“中国虚拟现实产学研大会” 在北京顺利召开,大会围绕“虚拟现实技术与产业创新融合”这一主题进行深入探讨。诠视科技作为虚拟现实产业的创新领军企业,CEO林瓊受邀参加本次活动…...
【达梦数据库】授权查询
目录 授权查询EXPIRED_DATECLUSTER_TYPE 更换原则更换方法 授权查询 select * from v$license;EXPIRED_DATE 过期日期,如果是正式版会显示NULL CLUSTER_TYPE 授权使用的集群类型CLUSTER_TYPE,格式为字符串“XXXX”, 每一位上 0 表示禁止…...
探索 ZED 双目 3D 相机发展:ZED 2i 的创新功能扩展之路
在科技迅速发展的当下,3D 视觉技术在众多领域的发展中有着重要作用。Stereolabs 公司研发的 ZED 相机受到广泛关注。Stereolabs 于 2010 年在美国旧金山成立,一直专注于立体视觉和 3D 深度相机技术的研究。2015 年推出的 ZED 相机为无人机、机器人等设备…...
基于卷积神经网络的白菜病虫害识别与防治系统,resnet50,mobilenet模型【pytorch框架+python源码】
更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 白菜病虫害识别与防治系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili (一)简介 基于卷…...
计算机网络 | 7.网络安全
1.网络安全问题概述 (1)计算机网络面临的安全性威胁 <1>计算机网络面临的完全性威胁 计算机网络面临的两大类安全威胁:被动攻击和主动攻击 被动攻击 截获:从网络上窃听他人的通信内容。主动攻击 篡改:故意篡改…...
Opencv+ROS自编相机驱动
目录 一、工具 二、原理 代码 标定 三、总结 参考: 一、工具 opencv2ros ubuntu18.04 usb摄像头 二、原理 这里模仿usb_cam功能包对Opencv_ros进行修饰,加上相机参数和相机状态,难点在于相机参数的读取。 对于相机参数话题 camera…...
js---函数参数是值传递还是引用传递
理解1:都是值(基本/地址值)传递 理解2:可能是值传递,也可能是引用传递(地址值) 在JavaScript中,函数参数的传递方式取决于参数的类型: 值传递(Pass by Val…...
如何解决DDoS导致服务器宕机?
分布式拒绝服务攻击(DDoS攻击)是一种常见的网络安全威胁,通过大量恶意流量使目标服务器无法提供正常服务。DDoS攻击可能导致服务器宕机,严重影响业务的正常运行。本文将详细介绍如何检测和防御DDoS攻击,防止服务器宕机…...
临床检验项目指标学习笔记
声明: 家有病人,记录此学习笔记仅为了更好照顾家人。本文不负责内容的准确性和版权。如果存在侵权、或不希望被转载的媒体或个人可与我们联系,我将立即进行删除处理。 血脂四项 [Q&A] 血脂四项 指导意义 测定血清中血脂含量,…...
代码管理之Gitlab
文章目录 Git基础概述场景本地修改未提交,拉取远程代码修改提交本地,远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区:本地电脑上看到的目录; repository 本地仓库:就是工作区中隐…...
秒杀系统三层架构设计:缓存、消息队列与数据库
秒杀是一种极端高并发场景,短时间内数百万用户涌入,抢购有限库存的商品。为了保证系统稳定性和数据一致性,同时提升用户体验,我们可以设计一个三层架构:缓存层、消息队列层、数据库层。本文将详细设计这一架构并探讨其…...
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
官网链接:What is Tauri? | Tauri 初始准备 rust版本一定要1.77.2以上的版本,查看版本和升级版本: 升级命名: rustup update 不然会报错: error: package tauri-plugin-shell v2.0.2 cannot be built because it r…...
SCI论文部分题目
SC20243213 通过氢和氨集成增强Power-to-X灵活性和可持续成本降低:绿色实验室Skive案例研究 SC20243211 分析同时发电的综合系统中的能量和能量效率、环境影响和经济可行性,淡水、热水和天然气凝液 SC20243208 双燃料生物质-天然气系统中的氢、…...
使用PyTorch在AMD GPU上进行INT8量化实现精简化的LLM推理
Leaner LLM Inference with INT8 Quantization on AMD GPUs using PyTorch — ROCm Blogs 随着大型语言模型(LLMs)规模达到数千亿参数,我们在这些庞大模型中表示数据的方式极大地影响了训练所需的资源(例如,用于推理的…...
Solon 拉取 maven 包很慢或拉不了,怎么办?
注意:如果在 IDEA 设置里指定了 settings.xml,下面两个方案可能会失效。(或者直接拿 "腾讯" 的镜像仓库地址,按自己的习惯配置) 1、可以在项目的 pom.xml 添加 "腾讯" 的镜像仓库 "阿里&qu…...
spring的事务隔离?
在Spring中,事务的隔离级别是指在多事务并发执行时,事务之间的隔离程度,隔离级别定义了一个事务可以看到另一个事务的哪些数据,Spring事务管理器允许通过Transactional注解或者xml配置来指定事务的隔离级别。 事务的隔离级别有以…...
13 —— 开发环境调错-source map
问题:代码被压缩后,无法正确定位源代码的位置(行数和列数) source map:准确追踪error和warning在原始代码的位置 —— webpack.config.js配置devtool选项 module.exports { devtool: inline-source-map }; inline-s…...
【大数据分析深度学习】在Hadoop上实现分布式深度学习
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML&a…...
【Linux探索学习】第十六弹——进程地址空间:深入解析操作系统中的进程地址空间
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 进程地址空间是操作系统进程管理的重要概念之一,它定义了进程在执行时所能访问的内存布局。理解进程地址空间不仅有助于掌握操…...
【数据结构与算法】相交链表、环形链表(判断是否有环)、环形链表(返回入环节点)
主页:HABUO🍁主页:HABUO 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 1.相交链表 题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表…...
hubuctf-2024校赛-复现wp
web easyweb1 <?php error_reporting(0); highlight_file(__FILE__);$flag getenv("GZCTF_FLAG");if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("You are failed.");}if(intval($num)){echo $flag;} } 利…...
.NET Core发布网站报错 HTTP Error 500.31
报错如图: 解决办法: 打开任务管理器》》服务》》找到这仨服务,右键启动即可,如果已经启动了就重启:...
RTSP摄像头、播放器为什么需要支持H.265?
H.264还是H.265? 好多开发者在做选RTSP播放器的时候,经常问我们的问题是,用H.264好还是H.265好?本文我们就H.264 和 H.265的主要区别和适用场景,做个大概的交流。 一、压缩效率 H.265 更高的压缩比 H.265 在相同视频…...
brynet源码阅读——解决文件描述符耗尽问题mIdle
1、背景 在高并发服务器程序中,文件描述符资源是有限的。当一个程序同时处理多个网络连接时,每个连接都会占用一个文件描述符。如果系统没有足够的文件描述符可用,调用 accept()(用于接收新的连接)或其他文件操作时可…...