Java数组大小初始化
我正在读Herbert Schildt的一本书《Java:初学者指南(第5版)》,我一直注意到声明数组的一种特殊方法 下面是我自己的例子来说明这种做法:Java数组大小初始化,java,arrays,Java,Arrays,我正在读Herbert Schildt的一本书《Java:初学者指南(第5版)》,我一直注意到声明数组的一种特殊方法 下面是我自己的例子来说明这种做法: public int[] generateArray(int size) { int[] x = new int[size+1]; return x; } int[] y = generateArray(3); 现在,作者所做的是始终使用+1创建大小相同的数组。我不明白他为什么要这样做。它是否在避免边界排列异常?此外,如果他已
public int[] generateArray(int size) {
int[] x = new int[size+1];
return x;
}
int[] y = generateArray(3);
现在,作者所做的是始终使用+1
创建大小相同的数组。我不明白他为什么要这样做。它是否在避免边界排列
异常?此外,如果他已经准备增加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;
}
}
我不知道这本书,但这个例子完全是误导!基本上,
新的int[3+1]
将初始化大小为4而不是3的int数组。给定一个方法int[]generatarray(int-size)
我绝对希望它会生成一个作为参数传递的size数组,而不是size+1的数组。该方法唯一有意义的方法是将其命名为:generateArrayThatHasLastIndex(int-lastIndex)。任何其他方式都是错误的。这种习惯可能类似于C等语言中的某些类型的数组,它们使用空字节作为终止“哨兵”来指示数组的结束;例如,它的形式为char[]
或char*
也就是说,Java不是C,我不明白作者为什么选择这样做。这是一种误导,绝对会被视为坏习惯
您关于这样做以缓解ArrayOutOfBounds
异常的评论也可能是正确的,但是创建一个与预期大小不同的数组并不是正确的方法
编辑:
基于您给出的示例,我想说,创建“误导性大小”数组习惯的应用程序只不过是代码旨在解决的问题的函数
例如,DynQueue
可能是以这种方式构造的,因为第一个或最后一个索引表示要以某种方式与数组中其他数据区分的数据。。。也许q[0]
(队列的第一个元素)表示char
,它是某些算法或处理中要考虑的“下一个”(可以说它位于“行的前面”),但尚未从数组中清除
(这仍然不能改变这样一个事实,即它的做法值得怀疑。)你必须询问作者。这与你的例子中通过4(不使用+1)完全相同。如果你不同意,为什么不忽略他的想法?它是一个对象引用-四个字节。这不是一种可怕的浪费。我同意——我不会这样写的。@duffymo我从来没有说过我同意或不同意,我只是想理解。也许这在上下文中更有意义,用这种东西发布Schildt的一些代码。这就像他希望参数保存最后一个索引,而不是实际大小。首先,您必须正确理解该书中的示例,以了解为什么索引有+1。这是一个宽泛的问题,可能会吸引多个答案,大多数答案都是猜测。有人能把它关掉吗?托皮奇在书中加了一个例子。不要再误导了!