导航:首页 > 编程语言 > java数组内存

java数组内存

发布时间:2023-07-19 05:48:49

java如何在内存有限的情况下实现一个超大数组

C语言支持定义一个不显式定义长度的数组,即通过初始化数据来分配数组长度。
比如int a[] = {1,2,3,4,5}; 数组a的长度没有显式给出,由于有5个初始化数据,所以分配空间长度为5个int型。
但是无论如何定义,数组的长度都是固定的,在定义的时候就已经分配好空间,从这个角度上C语言无法定义无限长的数组。但很多实际应用中又事先无法确定数组的长度,对于这类情况,一般有两种方法可以使用。

1 由malloc和realloc两个函数,分配动态空间,随时按需改变数组的最大长度。
通过下面例子来理解该方法:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int size=100;//最初为100个元素空间。
int *a = NULL;
int i = 0;

a = malloc(sizeof(int) * size);
if(a == NULL) return -1;
while(scanf("%d", a+i) == 1)//循环向a中输入数据,直到输入非数值字符为止
{
i++;
if(i == size)//数组空间不足
{
size *=2; //将数组空间扩大二倍, 也可以改用size+=100;之类的操作,使size每次增加固定值。
a=realloc(a,size);//分配新的空间
if(a==NULL)
{
return -1;//这种情况下运行载体(如PC)内存不足以提供,中断程序
}
}
}

if(a) free(a);//对申请的内存进行释放。
return 0;
}

从以上程序可以看到,这种方式的原理就是每当数组空间不足时,利用函数realloc分配一段新的内存空间以增大数组长度。 直到占满所有剩余空间。

如果到占满所有空间还是无法存下数据,那么是硬件无法支持了。
所以这种方法可以做到软件意义上的无限大数组空间。

但是这种方法代码量比较大,而且需要频繁的进行内存的分配,如果实现知道数据的最大可能规模,那么可以用另一个方法。

2 事先知道数据的最大规模,比如统计一个班的分数时,一个班最多不超过百人,那么可以直接定义一个长度为100的数组,或者保险起见,定义一个长度为1000的数组,并对其操作。这样在操作范围内,这个就是一个“无限长”的数组了。

⑵ 在Java中定义数组时必须分配内存,这句话是错的还是对的呢

Java中的数组你可以看到一个特殊的对象,声明时是放在栈中的,分配的空间存储在堆中
如:内
1. int[] arr = null;
此时只容是在栈中声明了一个 arr 数组,但并未对其分配空间,所以它没有指向
2. int[] arr = new int[6];
此时在栈中声明了一个arr数组,并且在堆中开辟了一块空间,此时 arr 已经分配内存了
看具体的情况吧,定义数组应该是声明吧,在需要的时候再开辟空间也可以

⑶ Java数组是存储在内存中的什么地方

因为我也不清楚你理解的内存指啥,说我的理解,猜测一下,但愿符合你的理解:
对程序而言,内存分为:
a、静态区块或叫全局区块,指程序加载的时候就分配的固定存储区;
b、栈内存,代码块执行的时候动态分配的内存块,代码运行完后,操作系统或运行平台负责自动回收这部分使用的内存。
c、堆内存块,由操作系统提供api程序自由分配管理的内存块。
java的内存管理机制,我个人认为是黑盒的,写java也很少有人去关心,但是如果看虚拟机的实现源码还是能知道的。(楼主懂c由兴趣自己看)。那么从逆向工程的角度我们可以猜测到:
静态类,静态变量,存储在,静态区块中。
类本身代码需要时再加载到内存中,java的动态代理实现的根本。既然是动态加载肯定是在堆中,不过加载进来的类代码可能永不会销毁(虚拟机运行区间内,可以加快运行平台的处理速度,java属于半编译半解释的一门语言,要解释执行的是预先编译好的指令,就是class类文件)。
我们创建的任何对象,时间是随机的,创建的时候才会分配内存,必然在堆上。虚拟机的垃圾回收机制要管理的刚好是这部分内存。
类中的方法,或静态代码块必定运行在占上,代码运行完,内存立即回收。此处有个例外,不同于c语言或操作系统实现。在方法中返回的任何对象:c需要动态分配存储空间,兵自行管理,或者申明为全局局部静态存储,代码运行完,对象才能保留下来。java可以直接保留下来。说明虚拟机自动给我们申请了动态内存保存对象。此处分配的内存也需要垃圾回收机制管理。没门语言都有原始类型,方法或函数中返回的原始类型不需要从堆上分配内存,直接复制给接收变量,或代码运行的形参所分配的空间中即可。
从操作系统理解,内存分为内核使用的内存与程序使用的内存,java运行在虚拟机上,虚拟机运行在操作系统上,内核内存属于操作系统自用内存,由操作系统负责管理,运用程序不能直接管理分配内核内存。应用程序可管理的是分配给自己的运行空间。因此java使用内存属于应用程序内存。内核内存管理方式windows与unix实现管理方式不一样,最大差别windows的每一个程序,内核需要使用掉一部分地址空间,余下的留给应用程序。如32位系统,总共可以使用的地址空间是4G内核要用掉其中1G或者2G。但是unix实现的系统应用程序可以直接使用4G地址空间。有兴趣请参考操作系统内核相关书籍。

⑷ java:普通数组和对象数组都是连续的内存空间吗

是的,不但在java里,在其他编程语言里,数组都占用连续的内存空间,这样在索引时能够快速地通过偏移来进行下标定位索引数据

阅读全文

与java数组内存相关的资料

热点内容
如何从数控编程小白到大师 浏览:183
更改微信共享实时位置信息 浏览:13
js姓名正则 浏览:843
如何利用串口传输文件夹 浏览:346
jca文件怎么用word打开 浏览:965
U盘文件木马隐藏exe工具 浏览:152
下载优酷app视频播放器安装 浏览:38
两个excel文件不同 浏览:585
如何更新网站内容 浏览:953
什么网站下载广场舞是免费的 浏览:307
西门子编程软件怎么变成中文 浏览:984
居客来wifi密码 浏览:604
文件为何为空linux 浏览:630
美剧鸟app安装包在手机哪里 浏览:985
苹果5s16g升级ios103 浏览:850
word红头文件中怎么加双线 浏览:825
切割机用什么编程 浏览:787
文件修订题目 浏览:572
魅族pro5自带浏览器怎么升级 浏览:342
为什么用数据还是加载慢 浏览:171

友情链接