Java中数组的存储与内存分配

JAVA程序设计----数组基础 一些小思考题: 1.什么时候为数组分配内存? 数组在初始化时分配内存 2.数组一旦被创建,大小能不能改变? 数组一旦被创建,它的大小就不能改变,可以使用array.length的得到数组的大小。 int[] list; list = new int[10];//初始化数组 list = new int[20];//重新给数组变量赋值,而不是改变原数组的大小 3.实参是如何传递给方法的?实参可... 阅读详情

Java数组及其内存分配

[日期:2013-03-28]来源:Linux社区  作者:xiaoxuetu[字体:大 中 小]

几乎所有的程序设计语言都支持数组。Java也不例外。当我们需要多个类型相同的变量的时候,就考虑定义一个数组。在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静态的,所以想要使用就必须先初始化(为数组对象的元素分配空间)。

1.数组的初始化方式及其内存分配

对于Java数组的初始化,有以下两种方式,这也是面试中经常考到的经典题目:

  1. 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度,如:
    1 //只是指定初始值,并没有指定数组的长度,但是系统为自动决定该数组的长度为4
    2 String[] computers = {"Dell", "Lenovo", "Apple", "Acer"};  //①
    3 //只是指定初始值,并没有指定数组的长度,但是系统为自动决定该数组的长度为3
    4 String[] names = new String[]{"多啦A梦", "大雄", "静香"};  //②
  2. 动态初始化:初始化时由程序员显示的指定数组的长度,由系统为数据每个元素分配初始值,如:
    1 //只是指定了数组的长度,并没有显示的为数组指定初始值,但是系统会默认给数组数组元素分配初始值为null
    2 String[] cars = new String[4];  //③

     

前面提到,因为Java数组变量是引用类型的变量,所以上述几行初始化语句执行后,三个数组在内存中的分配情况如下图所示:

Java数组及其内存分配

由上图可知,静态初始化方式,程序员虽然没有指定数组长度,但是系统已经自动帮我们给分配了,而动态初始化方式,程序员虽然没有显示的指定初始化值,但是因为Java数组是引用类型的变量,所以系统也为每个元素分配了初始化值null,当然不同类型的初始化值也是不一样的,假设是基本类型int类型,那么为系统分配的初始化值也是对应的默认值0。

对于多维数组,假设有这么一段代码:

1 int[][] nums = new int[2][2];2 nums[0][1] = 2;

那么他在内存中的分配情况如下:

Java数组及其内存分配

由上图可知,并没有真正的多维数组,它的本质其实是一维数组。

linux

2.数组比较特殊,它是属于数组原本类型的一个特殊子类

我们先看一段代码:

/**
  * 重载了info方法的Test类
  * @ClassName: Test 
  * @author 小学徒
  * @date 2013-3-27
  */
 public class Test{
    
    //info方法一
    public void info(Object o, double count) {
        System.out.println("object o");
    }
    
    //info方法二
    public void info(Object[] o, double count) {
        System.out.println("object[] o");
    }
    public static void main(String[] args) {
        //我们看看,如果第一个形参为null,他到底会匹配哪一个方法呢?
        new Test().info(null, 0);
    }
 }

究竟会匹配哪一个方法呢?我们看一下运行结果:

很奇怪,为什么是object[] o而不是object o呢?

Java方法重载后的匹配规则:如果某个方法的形参要求参数范围越小,那么这个方法就越精确

根据这个规则得出,Object[] o的要求参数范围比Objec o 要求参数范围更小,我就猜测,Object[] o是不是Object o的子类呢?于是我写了以下代码进行验证:

/**
  * 使用instanceof有以下三个条件:
  * 1.两类相同 : true
  * 2.前者是后者的父类 : false
  * 3.前者是后者的子类 : true
  * @ClassName: ArrayTest 
  * @author 黄健基
  * @date 2013-3-27
  */
 public class ArrayTest {
    public static void main(String[] args) {
        Object[] a = new Object[1];
        Object b = new Object();
        System.out.println(a instanceof Object);    //看看Object[]到底是不是属于Object类型
        System.out.println(b instanceof Object[]);
    }
 }

结果运行结果是:

根据输出结果和instanceof的使用条件,我们可以得出,Object[] a 是属于Object b的子类;

换句话说,数组比较特殊,它是属于数组原本类型的一个特殊子类。因此Object[] o的要求参数范围比Objec o 要求参数范围更小,在运行Test类的时候,匹配的方法是public void info(Object[] o, double count)。

33、Java 数组与集合编程全解析 本文深入解析了Java数组与集合编程的核心内容,涵盖数组的基础知识、内存分配、元素初始化及对象数组的处理。通过示例代码详细讲解了数组在数据统计、存储管理及算法实现中的应用,并总结了数组操作的常见问题和注意事项。最后展望了数组的高级应用及与Java集合框架的结合使用,帮助读者构建更高效和灵活的程序。 阅读详情

相关推荐

汽水音乐自动化薅羊毛教程:从零搭建稳定赚钱脚本

📖 前言:为什么要学习自动化脚本?在数字时代,时间就是金钱。汽水音乐等App通过观看广告奖励用户金币的模式,本质上是将我们的时间转化为收益。本教程将教你如何用Python自动化这个过程,让程序为你"打工",实现被动收入。通过本教程,你将学到:移动端自动化测试的核心技术Python在自动化领域的实际应用如何将重复性任务转化为自动化流程创造属于自己的"数字员工"第一章:环境准备与基础配置1.1 硬件要求Android手机一部(建议使用备用机)USB数据线。

weixin_44947827的博客 5794

数组内存分配

使用C语言编程,实际上使用的内存只有一种——虚拟内存。根据功能的不同在C语言中又将虚拟内存为分三类:栈区、堆区、静态数据区,无论单一变量还是数组,其内存分配都是如此。其中,栈区、静态数据区、堆区都会有编译器负责分配、操作系统负责管理,程序员可以在堆区使用malloc()来动态分配堆内存。 1、栈区:一般每一个函数对应一个栈区,在编译原理中称为栈帧。比如下面的代码: int main() { //定义一个有20个int元素的数组。此时数组a分配的虚拟内存称为栈区,有编译器自行分配。 int a[20] =

weixin_44679229的博客 3142

智能车赛道识别:八邻域算法的实战解析与优化

本文深入解析了智能车赛道识别中八邻域算法的核心原理与实战优化。作为兼顾性能与稳定性的经典方案,该算法通过模拟探险家环顾八方的策略,能精准追踪弯道与直道边界。文章详细拆解了代码逻辑,并提供了边界平滑、异常处理及应对十字路口、环岛等复杂场景的关键优化策略,助力开发者提升智能车视觉系统的鲁棒性与实时性。

weixin_29228781的博客 261

数组在内存中如何分配?最详细解答!看这个就够了!

在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静态的,所以想要使用就必须先初始化(为数组对象的元素分配空间)。 对于Java数组的初始化,有以下两种方式: 1.静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度 ,如:int[] a = {2,4,65}; 。 2.动态初始化:初始化时由程序员显示的指定数组的长度,由系统为数据每个元素分配初始值 ,如: int[] a1 = new int[2];//动态初始化数组,先分配空间。 总结:

zovee的博客 3122

Python 中调用 R 语言的教程(包含编码问题解决办法)

rpy2 是一个 Python 库,允许在 Python 中直接运行 R 代码并实现数据转换。安装需确保 Python 和 R 环境正确配置,Windows 用户需注意编码问题(GBK 错误可通过控制面板调整区域设置解决)。基本用法包括执行 R 代码、传递数据(支持 Python 与 R 数据类型自动转换)以及调用 R 包函数。通过 robjects.r() 执行 R 代码,使用 pandas2ri 转换器处理 DataFrame 数据交换,并支持像导入 Python 模块一样加载 R 包(如 import

zygalaxy的博客 995

C#每日面试题-属性和字段的区别

在C#面试中,“属性(Property)和字段(Field)的区别”是基础且高频的考点。很多初学者会把两者混为一谈,甚至觉得“属性就是加了get/set的字段”,但这种理解只停留在表面。面试考察的核心,是对“封装思想”的理解,以及两者在语法特性、底层实现、实际应用中的本质差异。今天我们从“基础认知→核心差异→底层原理→实际应用→面试避坑”五个层面,把这个知识点讲透,既保证新手能看懂,又能满足面试的深度要求。

Amon的专栏 780

内存分配时间

1、变量在声明时即分配内存,此时将根据变量的内存分配内存大小,如int类型4字节,float类型4字节,double类型8字节。如下例中的a. 2、但对于数组,有以下几种情况(以int类型为例): (1)声明数组时即指定数组大小N,则此时可按N*sizeof(int)的大小分配内存。如下例中的c。 (2)声明数组时虽然未指明大小,但声明的同时也对数组进行了初始化,则按初始化时的元

我不会编程,但不是完全不会,我会一点点 1545

23种设计模式-享元(Flyweight)设计模式

软考中级-软件设计师 享元设计模式

片言可决讼,半纸能缚龙 3223

数组与内存分配

1. 数组 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。 1.1 数组定义格式 数据类型[] 数组名 int[] arr; double[] arr; char[] arr; 数据类型 数组名[] int arr[]; double arr[]; char arr[]; 1.2 数组初始化 数组动态初始化 动态初始化:创建数组的时候,指定数组的长度,由虚拟机为数组的元素设置默认值 数据类型[] 数组名 = new 数据类型[数组长度]; int[] arr = new int[3];

LyonBlog 2338

智能车图像处理3-入门级分析2 ---直道冲刺

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 4316

Oracle11g下载与安装(windows)

一、Oracle11g下载 二、安装准备 三、执行安装步骤 四、测试连接 附:Oracle11g服务说明

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 2万+

java数组分配存储空间_Java 基础【04】数组内存分配

可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题。突然发现许多书上“基本数据类型存储在栈内存当中,对象则保存在堆内存”这句话完全是错误的。下面是个简单的例子代码:public classTest {public static voidmain(String[] argv) {//静态初始化数组String[] names = { "Michael", "Orson"...

weixin_34173220的博客 202

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

2018.9.30 Java中数组的存储与内存分配

java 数组与集合的区别 集合:长度可变,可以存放不同类型的元素,只能存放引用类型! 数组:长度固定,只可以存放相同的同种类型的元素,可以存放数据类型也可以存放引用类型! 数组定义的三种方式 // 第一种 int [] a = newint[5]; // a[0] = 10; // 第二种 int [] c = ne...

weixin_30855099的博客 77

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JAVA基础应用——数组

本文是个人学习心得,如有错误还望指出。目录一、数组1.1数组介绍1.2数组的定义格式1.3数组的初始化1.4数组元素读写1.4.1索引1.4.2数组元素赋值1.4.3数组元素读取1.5内存分配1.5.1内存概述1.5.2 JAVA中的内存分配1.5.3一个数组内存图1.5.4 两个数组内存图1.5.5多个数组指向相同内存图1.6数组遍历二、Arraylist2.1Arraylist介绍2.2Arraylist使用方法2.2.1创建Arraylist2.2.2添加元素2.2.3访问元素2.2.4移除元素。

Aokl_LuvSic的博客 1878

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C语言和java语言中二维数组的区别

C语言与Java语言中二维数组的区别

triumph_421的博客 1479

Java和C++数组在内存中存储的区别

Java和C++在内存分配上有一些区别,尤其是数组的创建方面,这里来梳理一下这两者的区别。 1.JAVA 数组 注:必须规定数组的长度,且数组长度终生不变,数组必须先初始化才可以使用,初始化的时候会分配内存;动态初始化和静态初始化不能同时存在。 1.1创建一维数组 动态初始化:只指定数组的长度,具体数据不指定;此时数组元素的值是缺省值. 语法规则:数据类型[] 数组名 = new 数据类...

Searchin_R的博客 1211

JAVA -内存分配

图片出处:截图来自b站黑马程序员 学习时候截图的用来学习Java内存分配。

m0_68711597的博客 240

java中的数组

java中的数组 定义方式 int [] a=new int[3] int a []=new int[3] int [] a=new int[]{1,2,3,4} 其中a变量存储在内存的栈中,分配的内存空间则是在堆中分配。a存储的是数组块的首地址,并以脚标的方式来区分每个小的存储空间,例如a[1]首地址为a的块中第二个存储空间的值。数组为赋值前分配了默认值,根据数组类型的不同有不同的

wudiisss的专栏 622

Java入门基础-数组知识点整理

今天上班第一天,也学习Java基础。下面我整理了学习数组过程中的笔记。 1、Java中,数据存储在什么地方?下面是在视频中的截图,很清晰! 从上面JVM内存分配图中,我也可以把程序分解为:数据+代码(方法)+CPU时间片。 栈Stack的数据可以直接访问,堆Heap是需要寻址访问,因而Stack栈的访问效率要比Heap堆高效的。 2、数组的声明,是指在栈中创建一个引用句柄空间;数组

GordonOo的专栏 1534

Java学习之旅基础知识篇:数组及引用类型内存分配

转自: http://www.cnblogs.com/hmiinyu/archive/2012/10/22/2732781.html       在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点。数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然保留,因此数组长度将不能被改变。

Syes_lei的博客 712

数组与内存

在java中数组是对象,数组变量是引用类型的变量,当数组初始化之后,该数组所占的内存的空间、数组长度都是不可变的。java程序中的数组只能通过初始化之后才能使用。所谓的初始化就是,创建实际的数组对象,也就是在内存中为数组对象分配内存空间,并为每个数组元素指定初始值。既然数组是对象则对象有对象引用名和对象他们的内存分配如下:      内存分为栈内存和堆内存,我们经常说基本类型存储在堆内存中而引用

bit-cafe 1192

Java 基础【04】数组内存分配

可能Java 数组大家都很熟悉,最近我遇到了一个关于Java 数组内存分配的问题。 突然发现许多书上“基本数据类型存储在栈内存当中,对象则保存在堆内存”这句话完全是错误的。下面是个简单的例子代码: public class Test { public static void main(String[] argv) { // 静态初始化数组 ...

weixin_30549175的博客 57

Java中数组的内存分配

一、JVM内存划分 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。 栈: 存储局部变量 堆:...

hewenqing 885

java 运行时内存分配 堆和栈区别

java 运行时 内存 分配一个java进程可以包含多个线程一个Java进程对应唯一一个JVM实例一个JVM实例唯一对应一个堆每一个线程有一个自己私有的栈 这儿也可以看出线程共享进程的堆, 但不共享栈 这篇文章里有一道 线程和进程面试题 堆 堆是被线程共享的 一个进程只有一个堆 堆中存放对象本身和数组本身 java 中, 数组(比如 int[]) 也是继承Object对象,

手把手教你学安卓 1340
上一篇: 又来了,上班又开始了,奋斗还得继续....
下一篇: 使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决
Java我人生
博客等级 码龄15年 2147粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值