博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.[数据结构和算法分析笔记]数组
阅读量:6758 次
发布时间:2019-06-26

本文共 2133 字,大约阅读时间需要 7 分钟。

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,如需转载请自行联系原作者
你可能感兴趣的文章
XenServer关闭电源以后部分虚机无法启动
查看>>
IIS部署flask之实现文件上传功能
查看>>
redis开机启动
查看>>
XaaS ------什么都是一种服务
查看>>
Linux下磁盘配额
查看>>
从雅迪赞助FIFA世界杯透视体育营销趋势
查看>>
《用chsh选择shell》-linux命令五分钟系列之十二
查看>>
parseDouble() 的用法
查看>>
shell的基础语法
查看>>
CentOS 6.9使用Shell脚本实现FTP自动上传和下载文件
查看>>
#51CTO学院四周年#我与51CTO不得不说多的故事
查看>>
java函数参数默认值
查看>>
远程关机对企业的意义
查看>>
Kafka笔记整理(三):消费形式验证与性能测试
查看>>
WINPE集成SCSI/RAID驱动
查看>>
我们为什么需要大数据?
查看>>
单例模式-singleton
查看>>
自动布局下的iPhone 6 plus等比例放大,且UITextfield失败关于placeholder的原因
查看>>
利用div实现邮件收件人的输入框
查看>>
我的友情链接
查看>>