Java 中数组的内存分配

1、Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式。

2、数组基本概念

	数组是存储同一种数据类型多个元素的容器。
数组既可以存储基本数据类型,也可以存储引用数据类型。 格式:数据类型[] 数组名 ;
int[] arr; 数组的初始化方式: 动态初始化 : 初始化时只指定数组长度,由系统为数组分配初始值。
格式:数据类型[] 数组名 = new 数据类型[数组长度];
数组长度其实就是数组中元素的个数。
int[] arr = new int[3];
解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
int[] arr = {1,2,3};
解释:定义了一个int类型的数组,并且存进去{1,2,3}三个数。

3、Java中数组的内存分配

A、基本内存分配概念图解

	int[] arr 存在于堆内存,new int[3] 存在于栈内存。

	在堆内存中每一个 new 出来的对象都有一个唯一的地址值,就如同图中的 001,在 int[] arr = new int[3];
相当于把堆内存的地址值 001 赋值给栈内存的的数组。当执行打印语句时候 : System.out.println(arr); 会打印出地址值。 堆内存每一个对象的数据类型都有默认值(在没有赋值的情况下),如图所示,
当执行打印语句时候 : System.out.println(arr[0]); 会打印出0。
当执行打印语句时候 : System.out.println(arr[1]); 会打印出0。
当执行打印语句时候 : System.out.println(arr[2]); 会打印出0。
栈内存通过地址值 001 找到堆内存对应的 001 地址值,然后通过索引找到对应的数值。

B、静态初始化内存图解

	静态初始化内存如图:当数组初始化的时候,都会有默认值,但是因为我们初始化的时候进行了赋值,所以默认值会被新的赋值所覆盖。

C、一个数组的内存图

	如图所示,初始值都是 0,当给数组元素赋值时,arr[0]、arr[2] 通过地址值找到堆中对应的地址值,将 arr[0]、arr[2] 进行重新赋值。

D、两个数组的内存图

	如图所示,定义了 2 个数组 arr、arr2,它们的初始化都是在堆内存中开辟空间,进行初始化的原始赋值。然后通过不同的地址值地址给不同的的数组进行赋值。

E、两个数组指向同一个地址的内存图(重点)

	如图所示,初始化数组 arr,然后进行赋值操作。输出即为:100、200、300。
当定义数组 arr2 的时候把第一个数组 arr 的地址值赋给第二个数组,arr2 数组会根据地址值找到堆内存中的 arr 的地址及,
然后给第二个数组进行赋值,会将原来 arr 的数值进行覆盖,所以当我们再次打印 arr 和 arr2 的数据时候,会出现一样的数据。

F、数组操作的两个常见小问题:空指针和索引越界

	索引越界:如图所以,数组的初始化是从 0 开始,所以访问数组元素 arr[3] 的时候,会出项索引越界异常。
空指针:如图所示,将 null 赋值给 arr,相当于地址001就没有了,既然没有了地址值指向堆内存,所以就会出项空指针异常。

G、对象数组的内存图

		首先方法区会有 Student.class(里面有成员变量、构造方法、成员方法)、StudentDemo.class(里面有 main函数)。
main 方法执行,栈中开辟空间创建 Student[ ] students,堆内存中会 new Student[3] ,默认值都是 null,通过地址值
001 指向栈。
然后创建学生对象 Student s1,同样通过地址值002指向堆内存为002的对象,而对象的方法(包括构造方法和成员方法)也有
地址值 0001,堆内存通过地址值 0001 指向 方法区对象的方法 0001,进行赋值覆盖。 Student s2,Student s3同理。此时创建完对象并赋值完成时,这3个对象还和 students 数组没有关联。 最后把学生对象作为元素赋值给学生数组:students[0]=s1,其实就是拿着 s1 的地址值 002 指向数组的第一个元素,数组
中的 null 就被 002替代。students[1]=s2;students[2]=s;同理可得!! 赋值完毕后,进行遍历操作时,如果使用 System.out.println(s); 打印出来的是地址值001、002、003。

Java 中数组的内存分配的更多相关文章

  1. Java中数组在内存中的存放原理?

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyong0717/article/details/79165685Java中数组被实现为对象, ...

  2. JAVA中堆栈和内存分配原理

    1.栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

  3. JAVA中堆栈和内存分配

    (一).栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或 ...

  4. 05-02 Java 一维数组、内存分配、数组操作

    数组的定义 动态初始化 /* 数组:存储同一种数据类型的多个元素的容器. 定义格式: A:数据类型[] 数组名; B:数据类型 数组名[]; 举例: A:int[] a; 定义一个int类型的数组a变 ...

  5. JAVA中堆栈和内存分配详解(摘抄)

    在Java中,有六个不同的地方可以存储数据: 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存 ...

  6. Java中数组在内存中的图解

    Java中的数组在内存中的图解,其实对于数组,还是比较熟悉的,平时用的也是很多的,在看数据结构与算法的极客时间专栏,最常用的10个数据结构:数组.链表.栈.队列.散列表.二叉树.堆.跳表.图.Trie ...

  7. Java中对象的内存分配机制

    一.内存划分 Java把内存划分为两种,一种是栈内存,另一种是堆内存. 1.栈内存 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配.当在一段代码块定义一个变量时,Java就在栈 ...

  8. Java中数组

    数组的定义格式: 1: 数据类型[] 数组名 2: 数据类型 数组名 动态初始化: 初始化的时候 系统会默认给数组赋值 数据类型[] 变量名 = new 数据类型[数组长度] int[] arr = ...

  9. Java数组以及内存分配

    Java数组以及内存分配 什么数组(简) 数组初始化 动态初始化 静态初始化 内存分配问题(重) 数组操作的两个常见小问题 什么是数组: 定义格式: 数组类型 [] 数组名 ; 如:常用格式,其他方式 ...

随机推荐

  1. 【读书笔记】iOS-优化iOS Web应用

    一,代码优化: 代码优化是任何优化技术的第一步,因为归根结底网页上的一切都是构建在代码之上的.优秀的代码可以节省宽带,减少渲染延迟,以及提高页面的可读性和长远的可维护性.下面列出了一些在Web应用中编 ...

  2. Bootstrap里的文件分别代表什么意思及其引用方法

    关于Bootstrap打包的文件分别代表什么意思,官网也没有给出一个明确的解释,在网上查了一些资料,总价归纳了如下: bootstrap/ <!--主目录--> ├── css/ < ...

  3. Oracle 11g数据库详细安装过程

    1.Oracle 11g下载 官方网址为:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.h ...

  4. Network-Emulator Network-Emulator-Toolkit网络模拟器使用详细介绍

    Network-Emulator-Toolkit网络模拟器使用详细介绍 by:授客 QQ:1033553122 原理介绍 图1 如上图,一个ADSL用户通过modem连接到网络,通过网络应用如IE,M ...

  5. LeanCloud数据存储相关问题

    1.短信验证码 当注册用户的时候,会发现收不到短信验证码,打印e : That operation isn't allowed for clients. 含义 - 该操作无法从客户端发起.请检查该错误 ...

  6. WebAPI路由、参数绑定

    ​ 一.测试Web API a)测试Web API可以用来检测请求和返回数据是否正常,可以使用Fiddler.Postman等工具.以Fiddler为例,这是一个http协议调试代理工具,它能够记录客 ...

  7. 腾讯云部署golang flow流程,vue.js+nginx+mysql+node.js

    这次总算把js-ojus/flow的ui部署到腾讯云上,比较吐槽的就是,为啥这么复杂,vue.js前后端分离,比golang编写的部署方面复杂几万倍.真是浪费人生啊. golang+sqlite写的东 ...

  8. Button's four click events

    第一种:内部类的方式 1 package com.example.phonedialer; 2 3 import com.example.click2.R; 4 5 import android.ne ...

  9. Telephone dialer

    运行电话拨号器,需要加这个权限,否则不会打通电话.这个权限是用户权限,是谷歌工程师为了跟自己撇清关系,用户需要权限的时候自己加. 运行android程序的时候提示:ActivityManager: W ...

  10. nginx的应用(window环境下)

    nginx(背景) nginx是一个高性能的HTTP服务器,以前我经常在linux系统中配置,主要做反向代理和负载均衡,最近根据业务需要,需要在window中配置反向和负载,下面就介绍一下nginx的 ...