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,如需转载请自行联系原作者
目录
相关文章
|
17天前
|
存储 算法 索引
【算法与数据结构】队列的实现详解
【算法与数据结构】队列的实现详解
|
21天前
|
算法
【算法与数据结构】二叉树(前中后)序遍历2
【算法与数据结构】二叉树(前中后)序遍历
|
1天前
|
算法 数据可视化 大数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
30 13
|
7天前
|
算法 数据可视化 Python
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
Python中LARS和Lasso回归之最小角算法Lars分析波士顿住房数据实例
13 0
|
8天前
|
算法 定位技术 Windows
R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
13 4
|
12天前
|
算法
算法系列--两个数组的dp问题(2)(下)
算法系列--两个数组的dp问题(2)(下)
18 0
|
12天前
|
存储 算法
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)(下)
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)
16 0
|
12天前
|
算法
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)(上)
算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)
21 0
|
12天前
|
算法 计算机视觉
算法系列--两个数组的dp问题(1)(下)
算法系列--两个数组的dp问题(1)
18 0
|
12天前
|
算法
算法系列--两个数组的dp问题(1)(上)
算法系列--两个数组的dp问题(1)
14 0