我正在读一本书" Java:初学者指南(第5版)"作者Herbert Schildt和我一直注意到一种声明数组的特殊方法。
以下是我自己的例子来说明这种做法:
public int[] generateArray(int size) {
int[] x = new int[size+1];
return x;
}
int[] y = generateArray(3);
现在,作者正在做的是始终使用+1
创建大小的数组。我不明白为什么他会这样做。是否避免ArrayOutOfBounds
例外?此外,如果他已经将它增加1,为什么不直接发送4而不是3?
以下是他的书中的一个例子,用以澄清这个问题的含糊之处:
// A dynamic queue.
class DynQueue implements ICharQ {
private char q[];
private int putLoc, getLoc;
public DynQueue(int size) {
q = new char[size+1]; //allocate memory
putLoc = getLoc = 0;
}
}
答案 0 :(得分:4)
我不懂这本书,但这个例子完全是误导!基本上new int[3+1]
将初始化一个大小为4的int数组,而不是3.给定一个方法int[] generateArray(int size)
我绝对希望它会生成一个作为参数传递的大小数组,而不是一个大小为+的数组1.该方法可以理解的唯一方法是命名它: generateArrayThatHasLastIndex(int lastIndex)。任何其他方式都是错误的。
答案 1 :(得分:4)
习惯可能类似于C语言中的某些类型的数组,它使用空字节作为终止" sentinels"表示数组的结尾;一个示例是"C-strings",其格式为char[]
或char *
。
话虽如此,Java不是C,为什么作者选择这样做是为了逃避我。它具有误导性,绝对被视为不良行为。
您这样做以缓解ArrayOutOfBounds
异常的说法也可能是正确的,但是创建一个与预期不同的数组并不是正确的方法。
编辑:
根据您给出的示例,我会说这种习惯的应用会产生误导性的"误导性的"数组只不过是代码设计要解决的问题的函数。
例如,DynQueue
可能是以这种方式构造的,因为第一个或最后一个索引表示要以某种方式区分数组中其余数据的数据......也许q[0]
(队列的第一个元素)代表 char
,即下一个'在一些算法或处理中考虑(它在"线的前面"可以这么说),但尚未从阵列中清除。
(这仍然没有改变这样做的事实是值得怀疑的。)