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

简介:

1.数组的定义

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

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

2.数组的存储

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

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

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

210803292.jpg

平常所说的“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)。

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

210818595.jpg

210827747.jpg

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

3.基本类型数组

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


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

210837109.jpg

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

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;

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

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

213014705.jpg

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 ;

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

210900398.jpg










本文转自 LinkedKeeper 51CTO博客,原文链接:http://blog.51cto.com/sauron/1223831,如需转载请自行联系原作者
目录
相关文章
|
26天前
|
数据采集 机器学习/深度学习 算法
|
22天前
|
人工智能 算法 BI
第一周算法设计与分析 D : 两面包夹芝士
这篇文章介绍了解决算法问题"两面包夹芝士"的方法,通过找出两个数组中的最大最小值,计算这两个值之间的整数个数,包括特判不存在整数的情况。
|
14天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
22天前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
18天前
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理
|
22天前
|
人工智能 算法
第一周算法设计与分析:C : 200和整数对之间的情缘
这篇文章介绍了解决算法问题"200和整数对之间的情缘"的方法,通过统计数组中每个数模200的余数,并计算每个同余类中数的组合数来找出所有满足条件的整数对(i, j),使得\( A_i - A_j \)是200的整数倍。
|
22天前
|
人工智能 算法
第一周算法设计与分析 G : 排队援救
这篇文章介绍了解决算法问题"排队援救"的方法,通过使用队列和映射来模拟救援点的排队过程,并确定最终得到救援的人的顺序和编号。
|
22天前
|
算法 C++
第一周算法设计与分析 E : 构造回文串
这篇文章介绍了解决算法问题"构造回文串"的方法,即判断给定的整数N(视为字符串)是否可以通过在前面添加任意个0(或不添加)来构造一个回文串,并给出了相应的C++代码实现。
|
1月前
|
算法
【初阶数据结构】复杂度算法题篇
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部 kmodn 个元素会移动至数组头部,其余元素向后移动 kmodn 个位置。
|
1月前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
40 2