Java数组以及内存分配

  1. 什么数组(简)
  2. 数组初始化
    • 动态初始化
    • 静态初始化
  3. 内存分配问题(重)
  4. 数组操作的两个常见小问题

什么是数组:

定义格式:

数组类型 [] 数组名 ;

如:常用格式,其他方式自行百度;

int[] arr;
double[] arr;
float[] arr;

数组初始化:

动态初始化格式

数据类型[] 数组名 = new 数据类型[数组长度/数组元素个数]

如:

int[] arr =new int[6];
double[] arr = new double[6];

等号左边

  • int:数组的数据类型

  • []:代表这是一个数组

  • arr:代表数组的名称

等号右边

  • new:为数组开辟内存空间

  • int:数组的数据类型

  • []:代表这是一个数组

  • 6:代表数组的长度

示例代码:

public class CsArrays {
public static void main(String[] args) {
//动态初始化
int[] arr = new int[6]; System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]); arr[0] =100;
arr[1] =200;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]); }
}

静态初始化格式

数据类型[] 数组名 = {元素、元素、.....}

int[] arr = {};
double[] arr = {};

示例代码:

public class JingTai {
public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}

内存分配的问题:

前提:

内存是计算机中的重要原件,临时存储区域,作用是运行程序。

我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。

必须放进内存中才能运行,运行完毕后会清空内存。

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

分析

  1. 单个数组的内存图

  2. 多个数组的内存图

  3. 多个数组指向相同内存图

主要明确两个主要内存

  1. 栈内存:存储 --->局部变量(定义在方法中或者方法声明上的变量)

    • 特点:局部变量在使用完毕, 立即被回收
  2. 堆内存:存储 ---->new出来的东西(实体, 对象)

    • 特点:对象在使用完毕, 在垃圾回收器空闲时回收掉

首先一个数组在Java虚拟机中的内存分配情况:

按照上面的分析:左边栈内存存放的是局部变量,所以int[] arr在左边;右边堆内存存放的new出来的数据;由栈内存指向堆内存,并将堆内存中的对象内存地址赋给定义的数组;刚开始创建的内存空间int类型默认为0;所以第一次输出的情况是:0 0 0;

数组创建完成后,对数组中的元素的进行赋值;arr[0]、arr[2] 通过地址值找到堆中对应的地址值,将 arr[0]、arr[2] 进行重新赋值,在内存中指向不变,但是将原来的0-->100/200;再输出则出现赋值后的值;

两个数组在Java中的内存分配情况:

解:

基本逻辑与一个数组的内存分配情况大体相同,现在是定义两个数组,在初始化数组时按照在堆内存开辟不同的空间地址进行数据元素的分配,如上图可视;

两个数组指向同一个地址的内存分配情况(重点):

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

数组操作的两个常见小问题

索引越界异常

  • 出现原因

    public class ArrayDemo {
    public static void main(String[] args) {
    int[] arr = new int[3];
    System.out.println(arr[3]);
    }
    }

    数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。

    程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

  • 解决方案

    将错误的索引修改为正确的索引范围即可!

空指针异常

  • 出现原因

    public class ArrayDemo {
    public static void main(String[] args) {
    int[] arr = new int[3]; //把null赋值给数组
    arr = null;
    System.out.println(arr[0]);
    }
    }

    arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。

  • 解决方案

    给数组一个真正的堆内存空间引用即可。

图片原文地址:https://zhuanlan.zhihu.com/p/59515103

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

  1. Java数组及其内存分配

    几乎所有的程序设计语言都支持数组.Java也不例外.当我们需要多个类型相同的变量的时候,就考虑定义一个数组.在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静 ...

  2. Java 中数组的内存分配

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

  3. Java数组的内存管理

    Java数组的内存管理 Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java程序中的数组必须经初始化才能使用.所谓初始化,就是当数组对象的元 ...

  4. java程序的内存分配

    java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的 ...

  5. java程序的内存分配(一)

      首 页 阅览室 馆友 我的图书馆 帐号 java程序的内存分配(一) 收藏  JAVA 文件编译执行与虚拟机(JVM)介绍  Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据J ...

  6. Java数组和内存控制

    1.数组初始化 1.1 Java数组是静态的 Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java程序中的数组必须经初始化才可使用.所谓初始 ...

  7. Java变量以及内存分配

    Java变量以及内存分配(非常重要) 堆栈 静态存储区域 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操 ...

  8. Java当中的内存分配以及值传递问题内存解析

    首先必须说明作为Java程序员对于内存只要有大致的了解就可以了,如果你对Java当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把 ...

  9. C++二维数组动态内存分配

    对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int  a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体 ...

随机推荐

  1. SSM整合+WebUpload使用(spring+springmvc+mybatis+maven)

      SSM框架整合以及webupload的集成与使用 在项目中最近用到了webupload.js,也方方面面遇到了不少问题,比如上传文件前对表单参数校验,当校验失败不予提交,及在文件上传成功后,选择同 ...

  2. 04router

    1.以 / 开头的嵌套路径会被当作根路径.一级路由可以放在二级router-view里面 实现的效果是页面嵌套 { path: '/console', name: 'console', compone ...

  3. [oracle/sql]求员工表中每个部门里薪水最高的员工,那种sql最优?

    开始正题前,先把我的数据库环境列出: # 类别 版本 1 操作系统 Win10 2 数据库 Oracle Database 11g Enterprise Edition Release 11.2.0. ...

  4. 【Java/DateTime】用当前日期时间与确定日期时间比较,大于则执行某动作

    代码: package logbackCfg; import java.text.ParseException; import java.text.SimpleDateFormat; import j ...

  5. 基于arm v8搭建区块链环境

    服务器信息: cpu:华为鲲鹏 cpu架构:arm v8 系统:CenOS-AltArch 7.6 相关工具安装 yum更新 yum update 安装vim/gcc/git/curl工具软件 yum ...

  6. pwnable.kr之input

    连接到远程服务器:ssh input2@pwnable.kr -p2222 查看题目所给的代码,根据题目的要求我们要给出所有符合条件的输入才能拿到flag,本来想在输入上动点歪脑筋,结果输入有字节数的 ...

  7. 从架构到部署,全面了解K3s

    Kubernetes无处不在--开发者的笔记本.树莓派.云.数据中心.混合云甚至多云上都有Kubernetes.它已然成为现代基础设施的基础,抽象了底层的计算.存储和网络服务.Kubernetes隐藏 ...

  8. 【小白学PyTorch】9 tensor数据结构与存储结构

    文章来自微信公众号[机器学习炼丹术]. 上一节课,讲解了MNIST图像分类的一个小实战,现在我们继续深入学习一下pytorch的一些有的没的的小知识来作为只是储备. 参考目录: @ 目录 1 pyto ...

  9. 15个随机图片API

    15个随机图片API 妈妈再也不用担心我网站没图用了呜 请不要重复刷新此页面 ! 找了很久的说,你难道不想收藏一下吗 其中有些 API 速度并不太好,可能会拖慢贵站的速度 我也不能保证这些 API 能 ...

  10. h5页面在浏览器上好好的,到手机上熄火了又看不到报错信息怎么办?

    背景 最近小编接了一个新需求,用h5开发页面,通过webview嵌入原生APP中,自己在浏览器上开发爽歪歪,什么信息都能看到,可是一嵌入原生app中,瞬间就熄火了,啥也看不到了,不知道为什么,反正就是 ...