数组

概述

数组 VS 列表

优缺点

优点

  • 代码优化:它使代码优化,可以轻松地检索或排序数据。
  • 随机访问:可以获取任何位于任何索引位置的数据。

缺点

  • 大小限制:只能在数组中存储固定大小的元素。 它在运行时不会增长其大小。 为了解决这个问题,在Java中使用了集合框架。

不同语言的实现

C

C++

Java

Java数组在内存中如何储存的

Java的数组是存在函数栈中?还是存堆中?为什么这个图里,像是存在堆中?

数组引用变量是存放在栈内存(stack)中,数组元素本质是一个对象,是存放在堆内存(heap)中。通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问。

基本数据类型的数组在内存分配情况

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

引用类型数组在内存中如何储存

元素为引用类型的数组,在内存中的存储与基本类型完全不一样。

此时数组元素存放引用,指向另一块内存,在其中存放有效的数据。如图:

在数组参数传递的时候,数组是作为引用参数,传递的是数组的引用指针,将数组引用传递给另一数组引用,但仍然不能改变数组长度(仅仅只是调整数组引用指针的指向)。

疑问

  1. Java在堆中分配数组,能否保证连续性?是等价于C++中的malloc分配数组吗?
  2. Java分配数组的源码在哪?

python

对比

C的数组存储在stack中,Java的数组是对象,存储在堆中。

参考