Java数组详解/从JVM理解数组/数组反转/随机排名/数组在计算机如何存储
本文详细讲解了数组的定义、数组的访问方法、数组的遍历、静态数组和动态数组、以及数组中的自动类型转换、引用类型指向数组的地址、以及从JVM理解数组、空指针异常、数组反转、随机排名的案例。
数组是存放在连续内存空间上的相同类型数据的集合。
数组可以方便的通过下标索引的方式获取到下标对应的数据。
举一个字符数组的例子,如图所示:
需要两点注意的是
-
数组下标都是从0开始的。
-
数组内存空间的地址是连续的
正是因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
一、数组的定义和访问
1.静态初始化数组
-
定义数组的时候直接给数组赋值。
完整模式: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3}; int[] a = new int[]{1,2,3,4,5}; 简化格式: 数据类型[] 数组名 = {元素1,元素2,元素3}; double[] score = {85.5,75.5,90.5}; 其他写法: 左边:数据类型[] 数组名 也可以写成 数据类型 数组名[] 源码中可能会看到这种写法。
[重点]数组中的自动类型转换
虽然,数组只能保存相同数据类型的数据。
但,如果存储字符类型,编译的时候也不会报错。
-
我们知道byte、short、char能自动类型转换为int
-
float能自动类型转换为double类型。
数组中也可以:
int[] numbers = {10, (byte)20, (short)30, 'A'}; // 等价于 {10, 20, 30, 65},自动转换为int double[] decimals = {1, 2.5f, 3L}; // 等价于 {1.0, 2.5, 3.0},自动转换为double
System.out.println(Arrays.toString(ages1)); // 输出 [12, 24, 36, 65]
二、数组在计算机中的基本原理
数组是引用数据类型,存储数组在内存中的地址信息。
int[] args = new int[]{1,2,3,4};
[重点]这里args是一个数组的对象,数组是引用数据类型,存储数组在内存中的地址信息。
[重点]数组地址分析
-
那么我们打印这个数组会发生什么?
打印出数组(引用数据类型)的地址。
[I@776ec8df]
//@ 占位符,读法at
//[ 数组
//I int
//776ec8df 内存地址
详情见:Java中的对象存储形式及控制台输出哈希码问题
回顾:
1.数组的静态初始化的写法和特点是什么?
我们再默写一遍 数据类型[] 数组名 = new 数据类型[]{1,2,3}; 数据类型[] 数组名 = {1,2,3,4};
如上,能够简写,或者源码写法。
数据类型 数组名[] = {1,2,3,4};
2.定义数组我们说了那几个注意点?
1.什么类型的数组就存放什么样的数据。也有特例,不过能编译。一般,数组只能存储一种数据类型的数据
2.可以源码写法
3.数组属于什么类型?数组变量名中存储的是什么?
数组属于引用数据类型,存储的是数组在内存中的地址信息。
三、数组的访问
数组名称[索引]
数组的长度
数组名.length
[重点]末尾元素:数组名.length - 1的前提条件
ArrayIndexOutOfBoundsException
前提数组中的元素>0
回顾:
1.如何访问数组元素?
数字名[索引]
2.如何访问数组长度?
数组名.length
3.数组的最大索引/数组末尾元素是多少?
数组名.length -1
4.如果访问数组的时候,使用索引超过数组的最大索引会出现什么问题?
ArrayIndexOutOfBoundsException数组索引越界异常。
四、数组遍历
为什么,因为要进行数组元素的比较。
快捷键:args.fori,选择fori能自动快速生成遍历数组
案例-求和
package com.itheima.array.define; public class ArrayTest4 {public static void main(String[] args) { // 某员工的销售额是16,26,36,6,100,请计算他们部门的总销售额。int[] arg = {16,26,36,6,100}; // 求和思想:/*1.定义变量* 2.进行累加* */int sum = 0;for (int i = 0; i < arg.length; i++) {sum += arg[i];}System.out.println(sum); } }
2.动态数组初始化
其实是没有规定元素是什么,而是规定元素的数据类型和个数。
数据类型[] 数组名 = mew 数据类型[元素个数]; int args = new int[3];
args[0] =10;//后赋值
我们知道,对象都存在于堆内存中,这里动态数组也是,存在堆内存中,直接打印数组,会出现在堆内存中的地址(哈希码形式)。
注意:
不要混了
[重点]动态初始化数组元素默认值规则:
分类 | 数据类型 | 默认值 |
---|---|---|
基本类型 | byte , short , char (Unicode是\u0000)显示空白字符, int , long | 0 |
浮点型 | float , double | 0.0 |
布尔型 | boolean | false |
引用数据类型 | 类 , 接口 , 数组 , String 等 | null |
其实String也是对象。
注意boolean类型是false。
[重点]注意char数组的默认值为\u0000
(Unicode空字符)对应的ASCII码值为0。控制台输出不是0
但直接打印时,\u0000
不会显示为字符0
,而是显示为“空白”(不可见字符)。
而是这个符号,代表Unicopde中的\u0000,不可见符号。
重点
package com.itheima.array.define; public class ArrayDemo5 {public static void main(String[] args) {//注意char是Unicode编码(\u0000)char []arr = new char[3];System.out.println(arr[0]);System.out.println("==="); int []arr1 = new int[3];System.out.println(arr1[0]);System.out.println("==="); byte[]arr3 = new byte[3];System.out.println(arr3[0]);System.out.println("==="); short[]arr2 = new short[3];System.out.println(arr2[0]);System.out.println("==="); long[] arr31 = new long[3];System.out.println(arr31[0]);System.out.println("==="); float[] arr4 = new float[3];System.out.println(arr4[0]);System.out.println("==="); double[] arr5 = new double[3];System.out.println(arr5[0]);System.out.println("==="); String[] arr6 = new String[3];System.out.println(arr6[0]);System.out.println("===");} }
回顾:
1.动态初始化数组的写法是什么?
数据类型[] 数组名 = new 数据类型[长度]; int [] args = new int[5]
2.动态初始化数组的默认值是什么?
byte、short、int、char、long是0
float、double是0.0
boolean是false
String、类、接口、数组等引用数据类型是null。
3.两种数组定义的方法各自适用于什么业务场景?
静态初始化数组:适用于确定是数组元素的场景;
动态初始化:适用于只确定数组元素个数的场景
案例-求评委打分平均分
package com.itheima.array.define; import java.sql.SQLOutput; import java.util.Scanner; public class ArrayTest5 {public static void main(String[] args) {//需求:现在有6个评委,给1名选手进行打分。请你求该选手的平均分 //首先,数组存储//先解决单次一个人录入,然后存入数组//之后累加求和//最后求平均分sum/数组长度 //完成单次录入/* int[] arr = new int[6];Scanner sc = new Scanner(System.in);arr[0]= sc.nextInt();System.out.println("第一个评委的打分是"+ arr[0]);*/ int[] arr = new int[6];//改为多次录入ctrl+alt+tfor (int i = 0; i < arr.length; i++) {//0-5索引 // System.out.println("请输入" + (i + 1) + "个评委的打分"); Scanner sc = new Scanner(System.in);arr[i] = sc.nextInt();System.out.println("第" + (i + 1) + "个评委的打分是" + arr[i]);} // 得到六个评委打分并存入数组//累加求和int sum = 0;//快捷键 arr.forifor (int i = 0; i < arr.length; i++) { sum += arr[i];}System.out.println("评委总分" + sum); //求平均分int avg = sum / arr.length;System.out.println("评委打分的平均分是" + avg);} }
数组在计算机中的执行原理
JVM的内存划分
-
方法区
-
栈
-
堆
-
本地方法栈
-
寄存器
方法区:加载字节码.class文件
栈内存:方法执行的时候进栈,方法中的变量存储也在栈内存。
堆内存:new出来的东西会在这块内存中开辟空间并产生地址。
讲解:
栈内存给main方法分配区域(栈帧)那么a就在栈内存中划分了一块区域,
执行打印,这里根据a找到区域,然后打印执行。
数组创建,那么就在堆内存中创建数组对象,数组对象也有地址,这个地址也会存到栈内存中。
通过arr存在栈内存的这个地址,找这个数组对象。
-
其实arr是引用变量,是存在栈内存中的。
数组赋值之后真正产生变化的是堆内存的数据,而不栈中,栈中只有地址,
最后打印。
回顾:
方法区:执行class文件
执行方法,进入栈内存
new对象进入堆内存,
2.简单说说inta=20;int[]arr=new int[3]这两行代码的执行原理?
a是变量,直接放在栈内存中,a变量中存储的数据就是20这个值。
new int[3]是创建一个数组对象,会在堆内存中开辟区域存储3个整数。
[重点]案例:多个变量指向同一个数组
引用变量:引用数据类型的变量
1.多个变量指向同一个数组
引用变量arr1和arr2都是指向堆内存中同一个区域,那么其实赋值给arr2[1]==99;后修改的是堆内存中存储的数据。
2.赋值null
详见代码
package com.itheima.memory; public class Demo1 {public static void main(String[] args) {//目标:多个变量指向同一个数组对象的执行原理//这个变量指的是引用变量,引用变量,就是引用数据类型的变量。数组就是引用数据类型 //创建两个数组int arr1[] = {1,2,3};int arr2[] = arr1;//我们将arr1赋值给arr2,实际上是让 存在栈内存中的引用变量 指向 同一堆内存中的对象,也就是数组的元素。System.out.println(arr1);System.out.println(arr2);System.out.println("可以看到,两个数组的引用变量的地址是一致的,指向的是同一个堆内存中的区域");//如果我们修改arr2的一个元素,那arr1会改变吗?arr2[0] = 99;System.out.println(arr1[0]);//arr1也改变了System.out.println(arr1);System.out.println(arr2);////以上,证明了arr1和arr2两个引用数据类型的变量,指向的是堆内存中的同一块区域,而且修改后同时发生改变。 System.out.println("============【重点】如果赋值null===============");//2.如果赋值nullarr2 = null; // System.out.println(arr2.length);System.out.println(arr1.length);System.out.println("编译不报错,因为arr2数组有length方法,输出arr2.length会运行报错");System.out.println("但是输出arr1.length不会报错,因为实际上修改的是引用变量arr2,arr1指向堆内存中的对象没有发生变化");} }
执行过程图解:
[重点]空指针异常代表:引用数据类型的变量,该有东西,但是为空
[重点]回顾:
1.多个数组变量,指向同一个数组对象的原因是什么?需要注意什么?
因为创建数组的时候,这两个引用数据类型变量,指向的都是同一个数组对象。存储的都是同一个数组对象的地址。
注意:多变量修改的都是同一个数组对象的数据。
2.如果某个数组变量中存储的null,代表什么意思?需要注意什么?
代表这个数组变量(引用类型变量),没有指向同一个对象。
可以输出这个变量,但是访问数组元素或获取数组长度,报NullPointerException
代码如下:
package com.itheima.memory;
public class Demo2 {//2.如果某个数组变量中存储的null,代表什么意思?需要注意什么?public static void main(String[] args) {
int arr[] = new int[]{1,2};//引用变量赋值为nullarr = null;System.out.println(arr);//可以打印出null
int length1= arr.length;//访问数组长度:NullPointerExceptionSystem.out.println(length1);
int num = arr[0];//获取数组元素:NullPointerExceptionSystem.out.println(num);
}
}
代码如下:
package com.itheima.memory;
public class Demo1 {public static void main(String[] args) {//目标:多个变量指向同一个数组对象的执行原理//1.修改元素//这个变量指的是引用变量,引用变量,就是引用数据类型的变量。数组就是引用数据类型
//创建两个数组int arr1[] = {1,2,3};int arr2[] = arr1;//我们将arr1赋值给arr2,实际上是让 存在栈内存中的引用变量 指向 同一堆内存中的对象,也就是数组的元素。System.out.println(arr1);System.out.println(arr2);System.out.println("可以看到,两个数组的引用变量的地址是一致的,指向的是同一个堆内存中的区域");//如果我们修改arr2的一个元素,那arr1会改变吗?arr2[0] = 99;System.out.println(arr1[0]);//arr1也改变了System.out.println(arr1);System.out.println(arr2);////以上,证明了arr1和arr2两个引用数据类型的变量,指向的是堆内存中的同一块区域,而且修改后同时发生改变。
System.out.println("============【重点】如果赋值null===============");//2.如果赋值nullarr2 = null;
// System.out.println(arr2.length);System.out.println(arr1.length);System.out.println("编译不报错,因为arr2数组有length方法,输出arr2.length会运行报错");System.out.println("但是输出arr1.length不会报错,因为实际上修改的是引用变量arr2,arr1指向堆内存中的对象没有发生变化");}
}
编译不报错,因为arr2数组有length方法,输出arr2.length会运行报错
但是输出arr1.length不会报错,因为实际上修改的是引用变量arr2,arr1指向堆内存
的对象没有发生变化。
[重点]案例,求数组元素中的最大值,最小值
要点:确定固定值max。以及。从第二个位置开始遍历元素。
1.首先用MAX变量作为数组中的一个元素,默认arr[0]。(就是一个普通的固定值,默认为0都可以)
2.从第二个位置开始遍历数组的元素,比较后,赋值到MAX变量中。因为是循环语句套在外面,跳出不了循环,那么会一直比较,所有的元素。大的就再次赋值,小的就继续循环。会直到循环结束。
package com.itheima.array;
public class ArrayTest3 {public static void main(String[] args) {//数组,求最大值int arr[] = {1,2,3,4,5,5,6,7,8,10,6};
int max = arr[0];//仅仅是一个固定值而已,赋值为数组中的一个元素,这样普遍性更强,否则如果是0,0可能是数组元素中最大或最小的。//arr.length-1 是指数组最后一个元素for (int i = 0; i < arr.length; i++) {if(max < arr[i]){max = arr[i];}}System.out.println(max);}
}
[重点]数组反转
int temp1 = arr1[0];//仅仅是一个固定值,这里赋值0也可以。表示成这样,方便阅读。
package com.itheima.array.cases; public class Test2 {public static void main(String[] args) {//1.变量互换int a = 250;int b = 985;int temp = 0; temp = a;a = b;b = temp;System.out.println("a:" + a + "\n" + "b:" + b);System.out.println("======2.数组元素互换==============");//2.数组元素互换//让第一个和倒数第一个互换,第二个和倒数第二个互换,第三个和倒数第三个互换...int arr1[] = new int[]{10, 20, 30, 40, 50};int temp1 = arr1[0];//仅仅是一个固定值,这里赋值0也可以。表示成这样,方便阅读for (int i = 0, j = (arr1.length - 1); i < j; i++, j--) {//当i不小于j的时候进行结束,也就是刚好等于的时候//相当于变量互换temp1 = arr1[j];arr1[i] = arr1[j];arr1[i] = temp1;}//输出for (int i = 0; i < arr1.length; i++) {System.out.print(arr1[i] + "\t");}} }
[难点]随机排名
package com.itheima.array.cases; import java.util.Random; import java.util.Scanner; public class ArrayRandomRange_import_3 {public static void main(String[] args) {//非常熟练 //需求:现在有五名创业者需要进行路演,他们分别有工号,但是为确保公平性,现在想随机上台路演。请你实现功能int c_num[] = new int[5];Scanner sc = new Scanner(System.in); //输入5个工号for (int i = 0; i < c_num.length; i++) {System.out.println("请你输入第"+(i+1)+"个工号");int num = sc.nextInt();c_num[i] = num;} //随机工号for (int j = 0; j < c_num.length; j++) {Random r = new Random();int ranDomIndex = r.nextInt(c_num.length);//nextInt()产生的是[0,4]与数组对应,不用[加减法]。//交换:(以随机索引的数组)=>数组的随机的另一个元素 与 本数组元素 按照迭代顺序交换。[首位呼应一条龙]//实际是:该数组的元素相互进行交换。//只是ranDomIndex是独立事件,会有重复数,会重复交换,导致随机的不是很彻底。int temp = 0;temp = c_num[j];c_num[j] = c_num[ranDomIndex];//先写,现在看就是数组俩元素进行交换,只是这个地方改成了ranDdonIndexc_num[ranDomIndex] = temp;}//输出for (int k = 0; k < c_num.length; k++) {System.out.print(c_num[k] +" "); }} }
相关文章:
Java数组详解/从JVM理解数组/数组反转/随机排名/数组在计算机如何存储
本文详细讲解了数组的定义、数组的访问方法、数组的遍历、静态数组和动态数组、以及数组中的自动类型转换、引用类型指向数组的地址、以及从JVM理解数组、空指针异常、数组反转、随机排名的案例。 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索…...
网络安全wireshark题目
一、填空题: 网络安全的目标是在计算机网络的信息传输、存储与处理的整个过程中,提高 物理逻辑上 的防护、监控、反应恢复和 对抗 的能力。SSL协议是在网络传输过程中,提供通信双方网络信息 保密性 和 可靠性 。TCP/IP网络安全管理…...
TomcatServlet
https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架构图,与 jre,应用程序之前的关系 安装使用 tomcat 10 开始,api 从 javax.* 转为使用 jakarta.*,需要至少使用 jdk 11 cmd 中默认 gbk 编码,解决控制…...
Seurat - Guided Clustering Tutorial官方文档学习及复现
由于本人没有使用过Seurat4.0,而是直接使用的最新版。所以本文都是基于Seurat5.2.0(截止2025/3/6)来进行撰写。 参考的官方教程来进行学习(上图中的 Guided tutorial-2.700 PBMCs),肯定没有官方文档那么全面…...
Python数据分析面试题及参考答案
目录 处理 DataFrame 中多列缺失值的 5 种方法 批量替换指定列中的异常值为中位数 使用正则表达式清洗电话号码格式 合并两个存在部分重叠列的 DataFrame 将非结构化 JSON 日志转换为结构化表格 处理日期列中的多种非标准格式(如 "2023 年 12 月 / 05 日") 识…...
极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6
本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…...
【JavaSE-7】方法的使用
1、方法的概念和使用 1.1、什么是方法 方法(method)是程序中最小的执行单元,类似于 C语言中的函数,方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置…...
阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1
阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎 QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen C…...
C语言笔记(通讯录)
目录 1.通讯录的架构 2.通讯录的功能 3.实现静态通讯录的功能步骤 3.1.创建通讯录数组 3.2.显示功能菜单 3.3.初始化通讯录 3.4.添加联系人的信息 3.5.显示联系人的信息 3.6.查找某个人的信息 3.7.删除某一个联系人信息 3.8.修改某一联系人的信息 3.9.按名字对联系…...
【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)
DeepSeek 之后,又一个AI沸腾,冲击的不仅仅是通用大模型。 ——全球首款通用AI Agent的破圈启示录 2025年3月6日凌晨,全球AI圈被一款名为Manus的产品彻底点燃。由Monica团队(隶属中国夜莺科技)推出的“全球首款通用AI…...
Python 面向对象高级编程-定制类
目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()…...
安装remixd,在VScode创建hardhat
在终端,以管理员身份,cmd 需要科学上网 npm install -g remix-project/remixd 在vscode插件中,安装solidity插件,是暗灰色那款 1.将nodeJs的版本升级至18以上 2.在vscode打开一个新的文件,在终端输入 npx hardhat 3.…...
开发环境搭建-02.后端环境搭建-熟悉项目结构
一.后端环境搭建...
Linux(Centos 7.6)命令详解:vi
1.命令作用 vi/vim 是Linux 系统内置不可或缺的文本编辑命令,vim 是vi 的加强版本,兼容vi 的所有指令,不仅能编辑文本,而且还具有shell 程序编辑的功能,可以不同颜色的字体来辨别语法的正确性。 2.命令语法 usage: …...
Ubuntu 20.04下配置VSCode以支持Eigen库开发
这里写目录标题 1. 安装Eigen库2. 配置VSCode的C开发环境3. 配置c_cpp_properties.json4. 编写代码并测试5. 配置tasks.json(可选)6. 运行程序总结 在VSCode中配置Eigen库(用于线性代数、矩阵和向量运算的C库)的步骤如下ÿ…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Android14 OTA差分包升级报kPayloadTimestampError (51)
由于VF 架构, 所以镜像的打包时间可能存在偏差, 如 boot.img 和 客制化的一些镜像打包 可能会在 vendor 侧进行打包。 而 与system 侧进行merge 时,时间戳比较乱,为了解决这个问题,让时间戳进行统一。 使用adb方式验证…...
PPT 技能:巧用 “节” 功能,让演示文稿更有序
在制作PPT时,你是否遇到过这样的情况:幻灯片越来越多,内容越来越杂,找某一页内容时翻得眼花缭乱?尤其是在处理大型PPT文件时,如果没有合理的结构,编辑和调整都会变得非常麻烦。这时候࿰…...
Mysql创建库、表练习
创建库 #创建 create database gc_novels default charsetutf8mb4;#default charsetutf8mb4 指定编码为utf-8#使用 use gc_novels#查看当前所在位置 select database(); 结果: 创建表 #创建 create table heros(-> id int,-> name varchar(50),-&…...
【原创】Ollama Test API For Linux/MacOS/Unix
安装Json解析工具 Linux/Unix sudo apt-get install jq -yMacOS brew install jq -y设置环境变量 export IP"192.168.250.229" export PORT"8080" export MODEL"deepseek-r1:7b"检查Ollama版本 curl http://"$IP":"$PORT&qu…...
盛铂科技 SLMF315频率综合器200MHz至15GHz 国产频综模块
在当今科技飞速发展的时代,射频技术在众多领域发挥着关键作用,从通信、雷达系统到科研实验,对频率综合器的性能要求日益严苛。以下是关于盛铂科技的 SLMF315 超低相位噪声频率综合器的介绍: SLMF315超低相位噪声0.2至15GHz频率综合…...
AI-前端开发webcrumbs.ai/frontend-ai,Fitten Code提高开发效率
1.webcrumbs.ai/frontend-ai Frontend AI by Webcrumbshttps://app.webcrumbs.ai/frontend-ai 可选择某一模版进行生成对应版本代码,减少开发量。 2.Fitten Code Vue AI 编程助手 Vue AI 编程助手 | 菜鸟教程https://www.runoob.com/vue2/fitten-code-vue2.htm…...
DeepSeek开源Day4:DualPipeEPLB技术详解
2 月 24 日,DeepSeek 启动 “开源周”,第四个开源的代码库为 DualPipe 与 EPLB(一下发布了两个)。DualPipe 与 EPLB 依然使用了大量与 Hopper 架构绑定的技术。 DualPipe 是由 DeepSeek-AI 团队开发的一种双向流水线并行通信算法&…...
代码随想录算法训练营第22天 | 组合 组合总和 电话号码的字母组合
77. 组合 77. 组合 - 力扣(LeetCode) class Solution {List<Integer> path new ArrayList<>();List<List<Integer>> result new ArrayList<>();public void backTracking(int n,int k,int startIndex){if(path.size() …...
Oracle19c进入EM Express(Oracle企业管理器)详细步骤
以下是使用Oracle 19c进入Oracle Enterprise Manager Database Express(EM Express)的详细步骤: ### **步骤 1:确认EM Express配置状态** 1. **登录数据库服务器** 使用Oracle用户或管理员权限账户登录操作系统。 2. **查看EM…...
Oracle 数据库基础入门(六):视图与索引的深入解析
在 Oracle 数据库的知识体系中,视图与索引是提升数据库操作效率和优化数据管理的重要工具。对于 Java 全栈开发者而言,熟练掌握视图与索引的运用,不仅能够增强数据库查询的性能,还能为构建高效稳定的后端应用提供有力支持。接下来…...
机器学习-随机森林解析
目录 一、.随机森林的思想 二、随机森林构建步骤 1.自助采样 2.特征随机选择 3构建决策树 4.集成预测 三. 随机森林的关键优势 **(1) 减少过拟合** **(2) 高效并行化** **(3) 特征重要性评估** **(4) 耐抗噪声** 四. 随机森林的优缺点 优点 缺点 五.…...
Qt添加MySql数据库驱动
文章目录 一. 安装MySql二.编译mysql动态链接库 Qt版本:5.14.2 MySql版本:8.0.41 一. 安装MySql 参考这里进行安装:https://blog.csdn.net/qq_30150579/article/details/146042922 将mysql安装目录里的bin,include和lib拷贝出来…...
MR的环形缓冲区(底层)
MapReduce的大致流程: 1、HDFS读取数据; 2、按照规则进行分片,形成若干个spilt; 3、进行Map 4、打上分区标签(patition) 5、数据入环形缓冲区(KVbuffer) 6、原地排序ÿ…...
RMAN备份bug-审计日志暴涨(select action from gv$session)
问题概述 /oracle 文件系统使用率过大,经过检查是审计日志过大,/oracle 目录 197G 审计日志占用70G,每6个小时产生大量审计日志,日志内容全是select action from gv$session ,猜测可能跟备份有关, $>df -h /oracle…...
30秒从零搭建机器人管理系统(Trae)
1. 安装 [Trae官网】(https://www.trae.com.cn/) 2. 提示词 创建一个BS架构的机器人远程操控系统,具备机器人状态及位置实时更新,可以实现机器人远程遥控,可以对机器人工作日志进行统计分析,以及其它管理系统的常用功能3. 模型…...
OpenFeign 学习笔记
OpenFeign 学习笔记 一、基础入门 1.1 简介 OpenFeign 是基于声明式的 REST 客户端,用于简化服务间远程调用。(编程式 REST 客户端(RestTemplate)) 通过接口注解方式定义 HTTP 请求,自动实现服务调用。 …...
单例模式(线程案例)
单例模式可以分为两种:1.饿汉模式 2.懒汉模式 一.饿汉模式 //饿汉模式👇 class MySingleTon{//因为这是一个静态成员变量,在类加载的时候,就创建了private static MySingleTon mySingleTon new MySingleTon();//创建一个静…...
HttpServletRequest 和 HttpServletResponse 不同JDK版本的引入
java中,可能会用到JWT令牌校验, 这时,大概率会用到 HttpServletRequest,和 HttpServletResponse。 若为 JDK8,SpringBoot 2.7.3 的版本则引入: import javax.servlet.http.HttpServletRequest; import ja…...
数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南
文章目录 数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南ChatGPTKimi腾讯元宝DeepSeek 数据安全VS创作自由:ChatGPT与国产AI工具隐私管理对比——论文党程序员必看的避坑指南 产品隐私设置操作路径隐私协议ChatGPT…...
【JavaEE】SpringMVC简单练习
目录 一、计算器1.1 接口定义1.2 前端代码1.3 后端代码1.4 运行结果 二、⽤⼾登录2.1 需求2.2 接口定义2.3 前端页面2.4 后端代码2.5 结果 三、留⾔板3.1 需求:3.2 接口3.3 前端代码3.4 后端代码3.5 运行结果 四、图书管理系统4.1 需求4.2 接口定义4.3 后端代码 一、计算器 1.…...
文件上传漏洞:upload-labs靶场11-20
目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 ,发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…...
苹果Siri升级遇阻,国行iPhone或将引入阿里、百度AI自救
AI整合进展缓慢 苹果正加速将生成式AI技术整合至Siri,但内部消息称其底层技术研发落后于竞争对手,进展未达预期。 国行iPhone将引入双AI模型 苹果计划在2025年中期为国行iPhone引入AI功能,目前已敲定与 阿里巴巴、百度 合作,用户…...
立即释放 Mac 空间!Duplicate File Finder 8 重复文件高速清理工具
Duplicate File Finder 专业的 Mac 重复文件清理工具。查找并删除重复的文件、文件夹,甚至相似的照片。 不要让无用的文件占用磁盘上的宝贵空间。 整理你的 Mac。用最好的重复文件查找器来管理你的文件集合。 扫描任何磁盘或文件夹 主文件夹、照片/音乐库、外部磁…...
ES时序数据库的性能优化
本文主要是讲解了Elasticsearch数据库的优化,大家可以看一下。因为当时实操中涉及了6版本和7版本的一起优化,所以内容上大家自行区分一下。 一、基础设置 1. jvm.options参数详解 不同版本java配置会不一样 -Xms12g -Xmx12g 说明: 将 Xms…...
第3章:启动界面与主界面设计
第3章:启动界面与主界面设计 学习目标 掌握SwiftUI中的启动界面(Splash Screen)设计与实现学习主界面的布局与导航结构设计实现灵感笔记的列表与网格视图掌握SwiftUI中的动画与过渡效果学习如何使用环境对象共享数据理论知识讲解 启动界面设计原则 启动界面(Splash Scre…...
c++ 作用域解析操作符::
目录 什么是 ::? 基本语法 主要用途 1. 访问全局作用域 2. 访问类的静态成员 3. 访问命名空间中的内容 4. 区分嵌套作用域 5. 在类中定义成员函数 注意事项 什么是 ::? 在C中,:: 是作用域解析操作符(Scope Resolution O…...
JavaScript数据类型转换
在JavaScript编程中,由于其动态类型特性,经常需要在不同的数据类型之间进行转换。正确地执行类型转换不仅能够避免潜在的错误,还能提高代码的灵活性和可维护性。本文将探讨JavaScript中的常见数据类型转换方法,并提供一些实用的例…...
css错峰布局/瀑布流样式(类似于快手样式)
当样式一侧比较高的时候会自动换行,尽量保持高度大概一致, 例: 一侧元素为5,另一侧元素为6 当为5的一侧过于高的时候,可能会变为4/7分部dom节点 如果不需要这样的话删除样式 flex-flow:column wrap; 设置父级dom样…...
AI 技术 引入 RTK(实时动态定位)系统,可以实现智能化管理和自动化运行
将 AI 技术 引入 RTK(实时动态定位)系统,可以实现智能化管理和自动化运行,从而提高系统的精度、效率和可靠性。以下是 AI 技术在 RTK 系统中的应用实例: 一、AI 技术在 RTK 系统中的应用场景 1. 整周模糊度快速解算 问题:RTK 的核心是解算载波相位的整周模糊度,传统方法…...
【STM32F103ZET6——库函数】11.捕获红外信号
目录 红外原理 数据码 引导码 连发码 配置捕获引脚 使能引脚时钟 配置定时器 使能定时器时钟 配置输入捕获 中断优先级分组 配置定时器4中断 定时器中断使能 使能定时器 重写定时器中断服务函数 清空定时器中断标志位 例程 例程说明 main.h main.c HongWai…...
江科大51单片机笔记【9】DS1302实时时钟(上)
一、DS1302介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。RTC(Real Time Clock):实时时钟,是一种集成电路…...
在Spring Boot + MyBatis中优雅处理多表数据清洗:基于XML的配置化方案
问题背景 在实际业务中,我们常会遇到数据冗余问题。例如,一个公司表(sys_company)中存在多条相同公司名的记录,但只有一条有效(del_flag0),其余需要删除。删除前需将关联表…...
【计网】网络层
网络层 4.1 网络层提供的两种服务(一) 面向连接的虚电路服务(二) 无连接的数据报服务 4.2 IPv44.2.1 IPv4概述4.2.2 分类编址的IPv4地址4.2.3 划分子网的IPv4地址4.2.4 无分类编址的IPv4地址4.2.5 IPv4地址的应用规划(…...
稳定性保障-前端
前端稳定性保障是确保应用在各种环境下都能 高效、稳定、无错误 运行的策略和方法。可以从 监控、测试、容灾、优化 等方面进行保障。 📌 1. 监控 & 报警 实时监控 线上情况,及时发现问题。 ✅ 1.1 前端错误监控 • Sentry、Fundebug:…...