1.[数据结构和算法分析笔记]数组

简介:

1.数组的定义

数组是n(n>=1)个相同/数据类型的数据元素a0,a1,a2,…an-1,存储在地址/连续的/内存单元的/有限集合。

Java中数组是用来存储/同一种/数据类型的/数据,一旦初始化完成,即占用的空间就已固定下来,即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变。

2.数组的存储

数组(数据引用和数据对象):数组引用变量/是引用类型的变量,存储在栈(stack)内存中,数组对象/存储在堆(heap)内存当中,通过栈内存中的指针/指向对应对象的在堆内存中的位置来实现访问。

例如:int num[] = new int[4];其中num这个数组变量/并非是数组本身,而是类似指针,存在于栈内存中,指向处于堆内存中实实在在的/数组对象。

以下图说明数组的存储形式。

平常所说的“Java中数组必须要被初始化”,并非是/数组变量/被初始化,而是指/数组对象。数组引用变量/不需要初始化,数组对象/要进行初始化。例如:int num[];是完全合法的,只不过这个/数组变量/没有指向真正的数组,所以不能使用。要使用就必须初始化数组:num = new int[4];这样一个存在于堆内存中的、长度为4的数组的“地址”就被赋给了num,即num“指向”了那个数组。

而且在堆内存当中的数组大小是不能改变的。

什么是栈和堆(参见JVM虚拟机运行时内存区域)

当执行方法时,该方法都会建立自身的内存栈,以用来将该方法内部定义的变量逐个加入到内存栈中,当执行结束时/方法的内存栈也随之销毁,我们说所有变量存放在栈内存中,即随着/寄存主体的消亡而消亡;反之,当我们创建一个对象时,这个对象被保存到运行时/数据区中,以便反复利用,此时不会/随着执行方法的结束而消亡,同时该对象还可被其他对象所引用,只有当这个对象没有/被任何引用变量引用时,才会在垃圾回收在合适的时间点回收,我们说此时变量所指向的运行时数据区存在堆内存中。

数组传递

只有类型兼容,才能将数组引用传递给另一个数组引用,但仍然不能改变数组长度(仅仅只是调整数组引用指针的指向)。

1
2
3
int []digits =  new  int [ 4 ];
int []numbers = { 3 , 5 , 12 };
digits= numbers;


这时,num 和number这两个数组变量都指向/同一个/数组对象,而digits本身失去引用而变成垃圾,等待垃圾回收来回收(但其长度仍然为4)。

其内部运行机制如下图所示。

因此当我们看一个数组时,通常看成两部分:数组引用变量和数组元素本身,而数据元素是存放在堆内存中,只能通过数组引用变量来访问。

3.基本类型数组

1
2
3
4
5
int [] numbers;
numbers =  new  int [ 4 ];
for ( int  i =  0 ;i < numbers.length;i++) {
     numbers[i] = i *  10 ;
}


其内部运行机制如下图所示。

从图中可看出数组元素/直接存放在堆内存中,当操作数组元素时,实际上是操作/基本类型的变量。

4.引用对象数组

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
//1.定义数组
Person[] persons;
//2.分配内存空间
persons =  new  Person[ 2 ];
//3.为数组元素指定值
Person p1 =  new  Person();
p1.age =  28 ;
p1.name =  "Miracle" ;
Person p2 =  new  Person();
p2.age =  30 ;
p2.name =  "Miracle He" ;
persons[ 0 ] = p1;
persons[ 1 ] = p2;

对于数组对象/为引用类型/在内存中的存储/与基本类型不一样,此时数组对象/仍然/存放引用,指向另一块内存,在其中存放有效的数据。

其内部运行机制如下图所示。

5.多维数组

从底层来看,数组对象/可以存放/引用类型,包含数组。也就是说在/数组对象/的内部还可以包含数组,如int[][] numbers = new int[length][],即任何多维数组(维度为n,n>1)都当作一维数组,其数组对象为n-1维数组。

对于数组int array[2][],数组变量array存储在栈内存中,它指向堆内存中的一个包含两个对象的数组。其中每个对象的类型是一个引用类型(一维数组类型),并指向一个实实在在的数组。

1
2
3
4
5
6
7
//1.定义二维数组
int [][] numbers;
//2.分配内存空间
numbers =  new  int [ 3 ][];
//3.为数组元素指定值
numbers[ 0 ] =  new  int [ 2 ];
numbers[ 0 ][ 1 ] =  1 ;

其内部运行机制如下图所示。










本文转自 LinkedKeeper 51CTO博客,原文链接:http://blog.51cto.com/sauron/1223831,如需转载请自行联系原作者
目录
相关文章
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
1040 4
|
机器学习/深度学习 边缘计算 算法
NOMA和OFDMA优化算法分析
NOMA和OFDMA优化算法分析
607 127
|
11月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
530 3
|
11月前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
199 0
|
编解码 算法 5G
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
1060 2
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
784 1
|
人工智能 自然语言处理 算法
2025 年 7 月境内深度合成服务算法备案情况分析报告
2025年7月,中央网信办发布第十二批深度合成算法备案信息,全国389款产品通过备案,服务提供者占比超七成。截至7月14日,全国累计备案达3834款,覆盖文本、图像、音视频等多模态场景,广泛应用于生活服务、医疗、金融等领域。广东以135款居首,数字人、AI客服等C端应用主导,民营企业成主力,国企聚焦公共服务。随着AI政策推动,备案已成为AI产品合规上线关键环节。
|
12月前
|
机器学习/深度学习 算法 5G
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
778 0
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
306 0
|
存储 监控 算法
员工行为监控软件中的 Go 语言哈希表算法:理论、实现与分析
当代企业管理体系中,员工行为监控软件已逐步成为维护企业信息安全、提升工作效能的关键工具。这类软件能够实时记录员工操作行为,为企业管理者提供数据驱动的决策依据。其核心支撑技术在于数据结构与算法的精妙运用。本文聚焦于 Go 语言中的哈希表算法,深入探究其在员工行为监控软件中的应用逻辑与实现机制。
320 14

热门文章

最新文章