大家好,今天小编关注到一个比较有意思的话题,就是关于数组java语言的问题,于是小编就整理了2个相关介绍数组Java语言的解答,让我们一起看看吧。
Java数组有最大长度吗?
Java数组的length必须是一个非负的int值,所以理论上最大的大小是2^31-1。
另外可能还与jvm实现相关,例如说如果jvm使用32位int来记录大小的话,那么数组的总空间需要小于int32的最大值。这时可能最大的大小也会与数组类型相关。
肯定有最大长度的,java中的数组length返回的是个int类型的数据,且为正数,所以理论的最大长度 为Integer.MAX_VALUE。但是对于不同的程序,不同的运行环境,应该是达不到这个长度的。具体是多少,还是要根据运行是虚拟机堆内存来分配的。如果申请过的数组,可能就会报内存溢出异常。
回答这个问题之前,我们先来看一下Java中数组是怎么定义的(以String类型为例):
第一种方式,String[] = new String[8]; 第二种方式 String[] = {"a","b","c"};
这两个方式有什么区别呢,第一种方式是定义的时候,只是在堆内存中分配了8个连续的内存,而每个一内存地址中对应的都是null。第二种方式,也是在堆内存中分配了连续的内存空间,但是每个内存地址中,都有指向了指定的值。不管是哪种方式,我们都可以知道数组的长度是一个非负的int类型的。如果按照int类型数据的取值范围的话,理论的最大值应该是2^31-1 = 2147483647。那么实际情况真的是这样的么?
为了,弄清楚这个问题,我们去查看一下jdk8 ArrayList的源码:
我们可以很清楚地看到,jdk8中ArrayList里面定义的数组最大长度是Integer.MAX_VALUE - 8 的,而且人家也解释了:有些虚拟机在数组中保留了一些头信息,我猜应该这就是为啥 减8的原因。另外人家说了,如果你尝试申请过大的数组的,可能会导致OutOfMemoryError 内存溢出 这种异常。
那么,到底最大的长度是多少呢?带着这个疑问,我做了以下的测试(本测试是基于jdk8,win7,64位系统的):
可以看出最大长度并不是像jdk8源码里面写的那样。既然是heep space 不足,我去查看了一下,运行是的参数-Xms128m -Xmx750m,也就是说最大堆内存是750M,按照这个内存去分配大小,依旧是这种问题。经过不断的测试,最终在我的机器上数值最大的长度是 524025852。这个还只是单类测试的,如果那种企业级应用的话,我猜数组的最大长度远远要比这个小。
以上就是我经过测试在我本机上的结果,对于不同的机器,不同的系统,这个数据可能不是固定的。如果大家有更好的答案或不同的见解,欢迎大家留言评论。如果对技术热爱的话,欢迎关注头条号:It界里一枚小学生。谢谢大家。
如何学习java?:[6]数组的定义及使用?
一维数组
1、数组是一组相关数据的集合,一个数组实际上就是一连串的变量,数组按照使用可以分为一维数组、二维数组、多维数组。目的是便于管理数据和方便声明。
2、数组声明的格式是:数据类型 数组名 。
3、数组的赋值方法有三种。第一种,直接赋值。第二种,new赋值第三种,赋空值。
二维数组
1、如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格。
2、静态初始化: 数据类型 数组名[][] ;第一种:数组名 = new 数据类型[行的个数][列的个数] ;第二种:数组名 = {一维数组;一位数组;。。。。};注意分号。
3、使用静态初始化声明一个二维数组。
多维数组
1、经过前面一、二维数组的练习后不难发现,想要提高数组的维数,只要在声明数组的时候将索引与中括号再加一组即可,所以三维数组的声明为int score[][][],而四维数组为int score[][][][] …,以此类推。
到此,以上就是小编对于数组java语言的问题就介绍到这了,希望介绍关于数组java语言的2点解答对大家有用。