Java数组以及内存分配
Java数组以及内存分配
- 什么数组(简)
- 数组初始化
- 动态初始化
- 静态初始化
- 内存分配问题(重)
- 数组操作的两个常见小问题
什么是数组:
定义格式:
数组类型 [] 数组名 ;
如:常用格式,其他方式自行百度;
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虚拟机要运行程序,必须要对内存进行空间的分配和管理。
分析:
单个数组的内存图
多个数组的内存图
多个数组指向相同内存图
主要明确两个主要内存:
栈内存:存储 --->局部变量(定义在方法中或者方法声明上的变量)
- 特点:局部变量在使用完毕, 立即被回收
堆内存:存储 ---->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数组以及内存分配的更多相关文章
- Java数组及其内存分配
几乎所有的程序设计语言都支持数组.Java也不例外.当我们需要多个类型相同的变量的时候,就考虑定义一个数组.在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静 ...
- Java 中数组的内存分配
Java 中数组的内存分配 1.Java 程序在运行时,需要在内存中分配空间.为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据和内存管理方式. 2.数组基本概念 数组是 ...
- Java数组的内存管理
Java数组的内存管理 Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java程序中的数组必须经初始化才能使用.所谓初始化,就是当数组对象的元 ...
- java程序的内存分配
java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的 ...
- java程序的内存分配(一)
首 页 阅览室 馆友 我的图书馆 帐号 java程序的内存分配(一) 收藏 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据J ...
- Java数组和内存控制
1.数组初始化 1.1 Java数组是静态的 Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java程序中的数组必须经初始化才可使用.所谓初始 ...
- Java变量以及内存分配
Java变量以及内存分配(非常重要) 堆栈 静态存储区域 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操 ...
- Java当中的内存分配以及值传递问题内存解析
首先必须说明作为Java程序员对于内存只要有大致的了解就可以了,如果你对Java当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把 ...
- C++二维数组动态内存分配
对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体 ...
随机推荐
- OC基础--字符串
前言 做iOS开发有3年了,从当初的小白到现在,断断续续看过很多资料,之前也写过一些博文来记录,但是感觉知识点都比较凌乱.所以最近准备抽时间把iOS开发的相关知识进行一个梳理,主要分为OC基础.UI控 ...
- 1090 Highest Price in Supply Chain (25 分)(模拟建树,找树的深度)牛客网过,pat没过
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- css动画是否会被js阻塞
css动画是否会被js阻塞 css的动画部分是会被js阻塞的,不过transform的动画则不会受影响. 下面举一个margin-left移动的动画下,启动js阻塞动画的性能图表 <style& ...
- Oracle中真正稳妥的求三甲的方法
坐地铁回家路上忽然想起,三甲排名可能为多个,只取三名岂不荒谬.不信请看下面数据: create table tb_score( id number(4,0) primary key, name nva ...
- vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
一. 前言 本篇基于 有来商城 youlai-mall微服务项目,通过对vue-element-admin的权限菜单模块理解个性定制其后台接口,实现对vue-element-admin工程几乎不做改动 ...
- Bootstrap学习第二天轮播插件
Bootstrap不仅提供了整套的样式,还提供了一系列插件,帮助开发者构建更受欢迎的网站. Bootstrap的轮播插件用起来很简单,代码如下. <!DOCTYPE html> <h ...
- 并发编程中死锁、递归锁、进程/线程池、协程TCP服务器并发等知识点
1.死锁 定义; 类似两个人分别被囚禁在两间房子里,A手上拿着的是B囚禁房间的钥匙,而B拿着A的钥匙,两个人都没法出去,没法给对方开锁,进而造成死锁现象.具体例子代码如下: # -*-coding:u ...
- BFC与HasLayout的理解
1.(Block Formatting Contexts)BFC 定义 BFC(Block formatting context)直译为"块级格式化上下文".它是一个独立的渲染区域 ...
- 正则表达式与SQL
在我心中正则表达式和SQL就是一样的东西. SQL是结构化查询语言,是根据某个查询.修改规则来查询修改数据,是描述一个规则给数据库,数据库来执行, 数据库返回结果,过程不需要考虑,不算是编程语言. 正 ...
- 部署cobbler服务器
部署cobbler服务器 1.准备环境使用nat或者仅主机模式,不要使用桥接模式,方式获取的IP不是自己的 2. 配置yum源[epel]name=epelenabled=1gpgcheck=0bas ...