字节数组的最大容量是多少?

5
我创建了一个JavaClass,用于进行加减乘除等操作。
数字的格式为(155^199 [+,-,,/] 555^669 [+,-,,/] ..... [+,-,*,/] x^n);
每个数字都存储在字节数组中,而字节数组最多可以包含66,442个元素。
例如:
(byte) array = [1][0] + [9][0] = [1][0][0]
(byte) array = [9][0] * [9][0] = [1][8][0][0]
如果数字太大(例如:999^999),我的类文件将无法正常工作。
我该如何解决这个问题以便在更大的数字之间进行加法运算?
当字节数组达到66,443个值时,VM会给出以下错误:
Caused by: java.lang.ClassNotFoundException。这实际上不是正确的错误描述。
这意味着如果我有一个包含66,443个值的字节数组,则该类无法正确读取。
解决方案:
使用多维字节数组来解决这个问题。
array{array, ... nth-array} [+, -, /] nth-array{array, ... nth-array}
只需要几秒钟就可以在大数字之间进行加法运算。
谢谢!

BigInteger出了什么问题吗?还是你只是为了教育目的而这样做的?:\ - amit
2
“它崩溃了”是什么意思?你是否收到了 OutOfMemoryError 或其他错误? - Jesper
1
请解释一下 crashing ClassNotFoundException ??? VB (Visual Basic) ??? - Andreas Dolk
抱歉,VB(笔误)=> VM,虚拟机。 - Racooon
哦,听起来像是一个可怕的变通方法 ;( - Andreas Dolk
5个回答

5

Java中的一个方法仅限于64KB的字节码。当您在代码中初始化数组时,它使用字节码来执行此操作。这将限制您定义数组的最大大小约为此大小。

如果您有一个大的值字节数组,建议您将其存储在外部文件中,并在运行时加载它。这样,您可以拥有高达2 GB的字节数组。如果需要更多,则需要具有数组的数组。


3

你的实际代码是什么样子?你遇到了什么错误?

如果有足够的连续内存,Java字节数组最多可以容纳2^31-1个值。


2

每个数组最多可以容纳Integer.MAX_VALUE个值。如果它发生了崩溃,你可能会看到一个OutOfMemoryError错误。通过使用更多的堆空间启动您的Java虚拟机来解决这个问题:

 java -Xmx1024M  <...>

(例如给出1024 MByte堆空间)


java.lang.ClassNotFoundException是在虚拟机需要一个类但无法加载它时抛出的异常 - 通常是因为它不在类路径上(有时候我们只是忘记编译Java源文件...)。此异常与Java数组操作完全无关

继续评论部分的讨论:

缺失类的名称非常重要。在抛出异常的代码行处,VM尝试首次加载类ClassBigMath并失败。类加载器无法在类路径上找到文件ClassBigMath.class

首先仔细检查已编译的Java文件是否真正存在,并仔细检查您的源代码中是否存在拼写错误。此错误的典型原因:

  • 我们只是忘记编译源文件
  • 在编译时类文件存在于类路径上,但在执行时不存在
  • 我们执行Class.forName("MyClass")并在类名中拼写错误

可能误解了问题 - 无论如何留下答案,一旦问题变得清晰,将删除或更改它.. 崩溃 - Andreas Dolk
能否在NetBeans中设置它? - Racooon
@Vural Acar - 绝对是这样 - 但这不会解决问题,因为您会看到 ClassNotFoundException - 这与低内存无关 - Andreas Dolk
@Andreas_D,当我在数组中有66.442个值时,它不会出错,但是当我有66.443个值时,它会给出错误,例如ClassNotFoundException。我认为,我将通过创建多维字节数组来解决这个问题。 - Racooon
@Vural Acar - 哪个类找不到?请告诉我们名称,因为这太奇怪了。 - Andreas Dolk
类名不重要,否则我会给出。类名:ClassBigMath(); 只有一个类。 - Racooon

1

java.math.BigInteger 是处理大数的更好解决方案。你选择使用字节数组的原因是什么?


0
在Java中,数组的最大大小由Integer.MAX_VALUE给出。这是2^31-1个元素。如果没有足够的空闲内存,即使少于此数量,您可能会遇到OOM异常。除此之外,根据您所做的事情,您可能需要查看BigInteger类。看起来您正在使用某种十进制表示形式进行数学计算,这不是非常内存高效的方式。

请参阅Java数组是否有最大大小限制 - Hollis Waite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接