详解Java中一维、二维数组在内存中的结构

前言

我们知道在Java中数组属于引用数据类型,它整个数组的数组元素既可以是基本数据类型的(如 byte \ int \ short \ long \ float \ double \ char \ boolean 这些),也可以是引用数据类型的。当它的数组元素是基本数据类型时,这个数组就是一个一维数组;当它的数组元素是引用数据类型时,它就是一个多维数组。比如,在一个数组中它的某个元素值其实是一个一维数组,而其他不同的元素也各自包含了一个一维数组,我们就把这个包含很多个一维数组的数组叫做二维数组。

1、内存中的简化结构

内存也叫做主存,它是计算机五大部件(输入设备、输出设备、运算器、控制器、存储器)中存储器的一部分。在Java中我们可以简单的将 内存分为栈、堆和方法区三部分,其中方法区又包含了常量池和静态域。如下图所示,下面来解释一下这三部分的作用:
                   属于线性表中的一种,它 具有先进后出的性质,在 Java 中我们 用来存放局部变量,如某方法里的数组名。
                   它存放的东西其长度、类型不一定相等,一般存放的都是 new 出来的结构,像数组、对象这些
       方法区     可以存放各种我们自定义的方法。

内存的简单结构

2、一维数组

下面我们来通过代码了解一下,一维数组在内存中的表现形式。我们先定义一个ArrayTest类。

public class ArrayTest{
		public static void main(String[] args){
			//定义三个数组 a[]、b[]、c[]
			int[] a = new int[]{1,2,3};
			float[] b = new float[3];
			String[] c = new String[4];

			//给特定元素赋值
			c[1] = "张三";
			c[2] = "李四";

			//改变变量指向
			c = new String[2];
		}
	}

上面的代码中,我们定义了三个数组 a[ ]、b[ ]、c[ ] 就相当于 在堆开辟了三个各自连续的空间作为数组,如果指定了数组元素的值,则存放的是各个指定的值。如果没有指定,则存放的是默认该数组类型的初始化值,如 b[ ] 。然后会 在栈里依次定义三个变量 a、b、c ,三个变量存放的是各自对应的数组的地址值,如 a 存放的是 0x1234,而堆里该数组的地址是 0x11234 。
       给元素赋值的话就相当于用我们指定的值覆盖原有的值。下面我们来重点看一下这一句:

c = new String[2];

原本栈中的 c 变量存放的地址是 0x12ab 的,指向绿色的数组,但是我们 使用了这句话就相当于在堆中又重新开辟了一个数组,并将这个数组的地址赋给了变量 c ,也就是说** c 这个时候的指向变量,不再指向原来的数组了,而是指向了新的数组**。而没有变量指向的原有数组会被 Java 自动回收。这就是一维数组在内存中的表现形式。那么二维数组在内存中又是如何表示的呢?

一维数组在内存中的表现形式

3、二维数组

其实 在底层中并没有二维数组这个概念,我们知道数组是引用数据类型,其元素值可以是基本数据类型,又可以是引用数据类型。所谓的 二维数组其实就相当于我们在内存中开辟了一个数组空间,只不过它的那个元素各自指向一个数组
下面我们来举个例子:

public class ArrayTest2{
		public static void main(String[] args){
			int[][] arr1 = new int[3][]{ {1,2,3},{4,5},{6,7,8,9} };

			//这个是二维数组的长度
			System.out.println(arr1.length);

			//这个是二维数组中的某个元素所指向的数组的长度
			System.out.println(arr1[2].length);
		}
	}

上面的代码中,我们定义了一个二维数组 arr1[ ][ ],并给它初始化了。就相当于我们在堆中开辟了四个一维数组,其中一个一维数组用来存放二维数组的元素,然后由二维数组的元素各自指向一个一维数组。栈中定义了一个变量 arr1 ,存放的是该二维数组的地址,如下图所示。

二维数组在内存中的表现形式

可以看到我们定义的二维数组 arr1[3][0] 其实存放的都是各自元素所指向的元素的地址值。而在栈中存放的则是该数组的地址值。
好了,知道了二维数组在内存的结构,我们便可以知道下面两句代码的值:

	//这个是二维数组的长度
			System.out.println(arr1.length);

			//这个是二维数组中的某个元素所指向的数组的长度
			System.out.println(arr1[2].length);
		}
	}

其中 arr1.length 所指的就是二维数组的长度,那么二维数组的长度是多少呢?答案是 3 。而 arr1[2].length 所指的是该二维数组中第 3 个元素所指向的数组的长度,因此它的值是 4 。这两者的区别需要结合图细细体会。

到此这篇关于详解Java中一维、二维数组在内存中的结构的文章就介绍到这了,更多相关Java一维、二维数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python矩阵转换为一维数组的实例

    实例如下所示: >>>from compiler.ast import flatten >>>X matrix([[ 1, 17, 13, 221, 289, 169], [ 1, 17, 14, 238, 289, 196], [ 1, 17, 15, 255, 289, 225], [ 1, 18, 13, 234, 324, 169], [ 1, 18, 14, 252, 324, 196], [ 1, 18, 15, 270, 324, 225], [ 1, 1

  • Python爬虫 批量爬取下载抖音视频代码实例

    这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 项目源码展示: ''' 在学习过程中有什么不懂得可以加我的 python学习交流扣扣qun,934109170 群里有不错的学习教程.开发工具与电子书籍. 与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容. ''' # -*- coding:utf-8 -*- from contextlib import closing import request

  • Python3.x爬虫下载网页图片的实例讲解

    一.选取网址进行爬虫 本次我们选取pixabay图片网站 url=https://pixabay.com/ 二.选择图片右键选择查看元素来寻找图片链接的规则 通过查看多个图片路径我们发现取src路径都含有 https://cdn.pixabay.com/photo/ 公共部分且图片格式都为.jpg 因此正则表达式为 re.compile(r'^https://cdn.pixabay.com/photo/.*?jpg$') 通过以上的分析我们可以开始写程序了 #-*- coding:utf-8 -

  • python的set处理二维数组转一维数组的方法示例

    for splitValue in set(dataset[:, featureIndex].tolist()): 首先set是一个无序,无重复的数据结构,所以很多时候使用它来进行去重:但是set接收的函数是原生array,这个怎么办?我现在有的numpy里面的matrix:于是我查了一下,直接使用matrix.tolist(),但是发现返回值有问题: import os os.chdir("D:\\galaxy\\aliyunsvn\\code\\MLInAction\\dataset&quo

  • python numpy 一维数组转变为多维数组的实例

    如下所示: import numpy new_list = [i for i in range(9)] numpy.array(new_list).reshape(3,3) 借助numpy库: 以上这篇python numpy 一维数组转变为多维数组的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Python numpy实现二维数组和一维数组拼接的方法

    撰写时间:2017.5.23 一维数组 1.numpy初始化一维数组 a = np.array([1,2,3]); print a.shape 输出的值应该为(3,) 二维数组 2.numpy初始化二维数组 a = np.array([[1,2,3]]); b = np.array([[1],[2],[3]]); print a.shape//(1,3) print b.shape//(3,1) 注意(3,)和(3,1)的数组是不一样的,前者是一维数组,后者是二维数组. 拼接 3.numpy有很

  • Python3实现将一维数组按标准长度分隔为二维数组

    如下所示: def trans_data_to_pair(self,data,index): contents=[ data[i:i+index] for i in range(0,len(data),index) ] print(contents) return contents 经过漫长研究,终于让我弄出来了,记录一下,这样短短的一行代码让我研究好几个小时,气死了 习惯了使用Java,用Python编程,感觉很别扭,加油吧,革命尚未成功,同志任需努力 以上这篇Python3实现将一维数组按标

  • Python爬虫获取图片并下载保存至本地的实例

    1.抓取煎蛋网上的图片. 2.代码如下: import urllib.request import os #to open the url def url_open(url): req=urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0') response=urllib.request.u

  • Python实现爬虫从网络上下载文档的实例代码

    最近在学习Python,自然接触到了爬虫,写了一个小型爬虫软件,从初始Url解析网页,使用正则获取待爬取链接,使用beautifulsoup解析获取文本,使用自己写的输出器可以将文本输出保存,具体代码如下: Spider_main.py # coding:utf8 from baike_spider import url_manager, html_downloader, html_parser, html_outputer class SpiderMain(object): def __ini

  • Python视频爬虫实现下载头条视频功能示例

    本文实例讲述了Python视频爬虫实现下载头条视频功能.分享给大家供大家参考,具体如下: 一.需求分析 抓取头条短视频 思路: 分析网页源码,查找解析出视频资源url(查看源代码,搜mp4) 对该url发起请求,返回二进制数据 将二进制数据保存为视频格式 视频链接: http://video.eastday.com/a/170612170956054127565.html 二.代码实现 # encoding: utf-8 import sys reload(sys) sys.setdefault

  • Python 利用scrapy爬虫通过短短50行代码下载整站短视频

    近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题. 因为这个事儿,勾起了我另一个念头,这不最近一直想把python爬虫方面的知识梳理梳理吗,干脆借机行事,正凑着短视频火热的势头,做一个短视频的爬虫好了,中间用到什么知识就理一理. 我喜欢把事情说得很直白,如果恰好有初入门的朋友想了解爬虫的技术,可以将就看看,或许对你的认识会有提升.如果有高手路过,

随机推荐