java中初始化字符串的大小
显然,javac中初始化字符串的大小是有限制的。有人能帮我确定最高限额是多少吗 多谢各位 编辑: 我们正在构建一个初始化字符串,它看起来像“{1,2,3,4,5,6,7,8……”,但理想情况下是10000个数字。当我们对1000执行此操作时,10000会抛出一个错误,表示代码对于try语句来说太大 为了实现这一点,我们使用一个stringbuilder并在附加值的数组上循环。显然,这是javac中的一个限制。我们被告知,如果我们将数组分块传递,我们可以用调用的方法重建数组。但是,这是不可能的,因为我们无法控制正在调用的用户方法 我想发布代码,但不能,因为这是一个大学项目。我不是在寻找代码解决方案,只是在理解这里的实际问题时寻求一些帮助 这是犯规的人java中初始化字符串的大小,java,compiler-construction,javac,Java,Compiler Construction,Javac,显然,javac中初始化字符串的大小是有限制的。有人能帮我确定最高限额是多少吗 多谢各位 编辑: 我们正在构建一个初始化字符串,它看起来像“{1,2,3,4,5,6,7,8……”,但理想情况下是10000个数字。当我们对1000执行此操作时,10000会抛出一个错误,表示代码对于try语句来说太大 为了实现这一点,我们使用一个stringbuilder并在附加值的数组上循环。显然,这是javac中的一个限制。我们被告知,如果我们将数组分块传递,我们可以用调用的方法重建数组。但是,这是不可能的,因
Object o = new Object()
{
public String toString()
{
StringBuilder s = new StringBuilder();
int length = MainInterfaceProcessor.this.valuesFromData.length;
Object[] arrayToProcess = MainInterfaceProcessor.this.valuesFromData;
if(length == 0)
{
//throw exception to do
}
else if(length == 1)
{
s.append("{" + Integer.toString((Integer)arrayToProcess[0])+"}");
}
else
{
s.append("{" + Integer.toString((Integer)arrayToProcess[0])+","); //opening statement
for(int i = 1; i < length; i++)
{
if(i == (length - 1))
{
//last element in the array so dont add comma at the end
s.append(getArrayItemAsString(arrayToProcess, i)+"}");
break;
}
//append each array value at position i, followed
//by a comma to seperate the values
s.append(getArrayItemAsString(arrayToProcess, i)+ ",");
}
}
return s.toString();
}
};
try
{
Object result = method.invoke(obj, new Object[] { o });
Object o=新对象()
{
公共字符串toString()
{
StringBuilder s=新的StringBuilder();
int length=main接口处理器.this.values fromdata.length;
对象[]arrayToProcess=MainInterfaceProcessor.this.valuesFromData;
如果(长度==0)
{
//抛出异常来做什么
}
else if(长度==1)
{
s、 追加(“{Integer.toString((Integer)arrayToProcess[0])+”}”);
}
其他的
{
s、 追加(“{”+整数.toString((整数)arrayToProcess[0])+”,”;//开始语句
for(int i=1;i
}如果类型是number max length=Integer.max_VALUE,如果类型是char max length=65536字符串长度受限制字符串文本的长度(即
“…”
)受类文件格式的结构限制,该结构由常量字符串信息结构引用
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
这里的限制因素是length
属性,它只有2个字节大,即最大值为65535。
此数字对应于字符串的修改UTF-8表示形式中的字节数(实际上几乎是,但0字符也以双字节形式表示)
因此,纯ASCII字符串文字最多可以包含65535个字符,而由U+0800…U+FFFF范围内的字符组成的字符串只能包含其中的三分之一。在UTF-8中编码为代理项对的那些(即U+10000到U+10FFFF)每个占用6字节
(标识符也有相同的限制,即类、方法和变量名,以及它们的类型描述符,因为它们使用相同的结构。)
Java语言规范未提及以下方面的任何限制:
字符串文字由零个或多个用双引号括起来的字符组成
因此,原则上,编译器可以将较长的字符串文本拆分为多个常量字符串\u info
结构,并在运行时通过串联(和.intern()
-ing结果)对其进行重构。我不知道是否有编译器真的在这样做
它表明问题与字符串文字无关,而是与数组初始值设定项有关
将对象传递给(类似于BConstructor.newInstance)时,它可以是一个对象(即,围绕现有对象的包装器,然后它将传递包装对象)、一个字符串(将按原样传递)或其他任何内容。在最后一种情况下,对象将转换为字符串(通过toString()
),然后将该字符串解释为Java表达式
为此,BlueJ将把这个表达式包装在一个类/方法中并编译这个方法。在该方法中,数组初始值设定项被简单地转换为一长串数组赋值。。。这最终使该方法比Java方法的长度更长:
代码长度项的值必须小于65536
这就是为什么它会中断较长的阵列
因此,要传递更大的数组,我们必须找到其他方法将它们传递给BMethod.invoke。BlueJ扩展API无法创建或访问封装在BOObject中的数组
我们在聊天中发现的一个想法是:
在项目内部(或者在新项目中,如果可以互操作的话)创建一个新类,如下所示:
public class IntArrayBuilder {
private ArrayList<Integer> list;
public void addElement(int el) {
list.add(el);
}
public int[] makeArray() {
int[] array = new int[list.size()];
for(int i = 0; i < array.length; i++) {
array[i] = list.get(i);
}
return array;
}
}
(为了提高效率,BClass/BMethod对象实际上可以检索一次并缓存,而不是每次数组转换一次。)
如果通过某种算法生成数组内容,则可以在此处生成,而不是首先创建另一个包装对象
在我们的扩展中,调用我们实际想要用长数组调用的方法,传递我们的包装数组:
Object result = method.invoke(obj, new Object[] { bArray });
你到底是什么意思,命令行的长度?命令行参数?字符串的最大大小?这又有什么关系呢?因为我正在为一个名为bluej的软件(基于学生的ide)开发一个插件。对于远程调用方法,您必须构建一个初始化字符串,然后由我试图使用数组调用的方法解析该字符串。大型阵列失败,因为初始值为
Object result = method.invoke(obj, new Object[] { bArray });