java 把数组用分治法求和 java数组分配在哪里_堆内存

 Java 中内存分配

左边的int[] arr 会在内存中有一块区域, 专门用来存储.

 

java 把数组用分治法求和 java数组分配在哪里_算法_02


 右边的new int[3]也会在内存中有一块区域, 专门用来存储.

因为 new 的动作是开辟内存空间, 所以会有一块空间产生, 这块空间可以存储三个元素.

java 把数组用分治法求和 java数组分配在哪里_java 把数组用分治法求和_03

 可以通过索引0,1,2  去访问这个这三个元素.

java 把数组用分治法求和 java数组分配在哪里_内存空间_04

数组在初始化时, 会为存储空间添加默认值.

java 把数组用分治法求和 java数组分配在哪里_堆内存_05

 

因为是整数, 所以默认值是0. 

 

java 把数组用分治法求和 java数组分配在哪里_java_06

 

java 把数组用分治法求和 java数组分配在哪里_java 把数组用分治法求和_07

 使用001 来标识这块内存空间, 001 被称为内存地址.

java 把数组用分治法求和 java数组分配在哪里_算法_08

 接下来要把右边的赋值给左边, 也就是左边的要指向右边.

java 把数组用分治法求和 java数组分配在哪里_堆内存_09


 在内存中是这样的, 就是 int[] arr 要指向001 这片内存空间.

java 把数组用分治法求和 java数组分配在哪里_算法_10

 其实就是arr 指向 001, 因为001 代表的就是这块内存空间(这三个各自组成的空间)

java 把数组用分治法求和 java数组分配在哪里_java 把数组用分治法求和_11


之后呢, 把001 赋值给arr.

当这个动作做完之后, 第一行代码才算完成了.

java 把数组用分治法求和 java数组分配在哪里_java_12

 现在输出arr, arr 的值是001, 所以在控制台输出001, 也就是输出内存地址.

java 把数组用分治法求和 java数组分配在哪里_算法_13

arr 指向左边(栈内存)的001, 然后通过左边(栈内存)的001 找到右边(堆内存)的001.

java 把数组用分治法求和 java数组分配在哪里_算法_14

 右边(堆内存) 的 001代表的是这样一块区域.

java 把数组用分治法求和 java数组分配在哪里_算法_15

 

arr[0] 中的0, 会找到索引0, 其实最终找的是 0 索引位置的值.

java 把数组用分治法求和 java数组分配在哪里_堆内存_16

 

 这样, System.out.println(arr[0])这个输出语句最终在控制台中输出的就是数据0. 

java 把数组用分治法求和 java数组分配在哪里_java 把数组用分治法求和_17

 arr[1] 同理.

java 把数组用分治法求和 java数组分配在哪里_内存空间_18

  arr[2] 同理.

java 把数组用分治法求和 java数组分配在哪里_内存空间_19

 


栈内存 存储的是局部变量, 堆内存 存储的是 new 出来的东西, new 出来的东西也称之为实体,对象.

局部变量就是定义在方法中的变量,  比如 int[] arr  就是在main 方法中写的, 所以 arr 是局部变量.

栈内存中的变量, 使用完成, 会立即消失, 比如, arr 使用完成, 就立即消失了.

java 把数组用分治法求和 java数组分配在哪里_java_20

 每一个new 出来的东西, 都会有一个地址值.

比如 new 出来的int[3], 有一个地址值 001.

java 把数组用分治法求和 java数组分配在哪里_java_21

堆内存里的东西, 使用完毕, 会在垃圾回收器空闲时被回收, 也就是堆内存里的数据使用完之后, 并不会立即消失.

 

java 把数组用分治法求和 java数组分配在哪里_java_22