日期:2014-05-20  浏览次数:20779 次

JAVA 大数组问题
以前一直做C++,刚开始学JAVA,请大家多多帮忙
想定义一个大的数组(大概600KB),数组只用来提供初始化数据,运行过程中不会更新数组中的内容,下面这样的定义编译器报“Too many constants, the constant pool for xxx would exceed 65536 entries”错误。
char g_MainData[] = {
0x81, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x06, 0x00, 0x04, 0x01, 0x85, 0x01, 0x01, 0x01, 0x7f, 0x00......};

不希望用new方式动态分配空间,因为数组目的是用来提供600KB的初始化数据,也不想用读文件的方式,因为读文件速度太慢,请大家帮忙看看怎么解决。

------解决方案--------------------
char g_MainData[] = {
0x81, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x06, 0x00, 0x04, 0x01, 0x85, 0x01, 0x01, 0x01, 0x7f, 0x00......};
改成
char[] g_MainData = {
0x81, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x06, 0x00, 0x04, 0x01, 0x85, 0x01, 0x01, 0x01, 0x7f, 0x00......};
然后看看报错不。
你那是给一个对象赋值,不是赋值给一个数组
java中char数组上限大约是上百万个,和内存有关。
------解决方案--------------------
这个是直接初始化数组时元素的数量限制 <=2^16 ,虽然还没找到官方出处。

这里可以参考:
http://www.aicas.com/jamaica/3.2/doc/html/limitations.html

但动态分配数组大小是不受此限制的。

不妨初始化n个这样的数组,然后动态分配给一个更大的数组。
------解决方案--------------------
你可以更改java虚拟机占用的内存,试试把java虚拟机的内存调整的大一点
------解决方案--------------------
引用:
char g_MainData[] = {
0x81, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x06, 0x00, 0x04, 0x01, 0x85, 0x01, 0x01, 0x01, 0x7f, 0x00......};
改成
char[] g_MainData = {
0x81, 0x00, 0x7f, 0x00, 0x7f, 0x0……

难道char g_MainData[]和char[] g_MainData不一样吗?
需要修改JVM的启动参数吧。
------解决方案--------------------
引用:
引用:char g_MainData[] = {
0x81, 0x00, 0x7f, 0x00, 0x7f, 0x00, 0x06, 0x00, 0x04, 0x01, 0x85, 0x01, 0x01, 0x01, 0x7f, 0x00......};
改成
char[] g_MainData = {
0x81, 0x00, 0……

嗯,是我错了。以前没用过
------解决方案--------------------
有没有new并无区别