Java数组大小初始化

4

我正在阅读Herbert Schildt的《Java入门指南(第5版)》,发现了一种奇特的数组声明方法。

以下是我个人的示例:

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;
    }
}

1
你需要询问作者。这与在你的示例中传递4(而不使用+1)完全相同。 - Elliott Frisch
如果你不同意,为什么不忽略他的想法呢?这只是一个对象引用 - 四个字节。并不是很浪费。我同意 - 我也不会这样写。 - duffymo
2
@duffymo 我从未表示同意或不同意,我只是试图理解。 - Sterling Archer
1
也许在上下文中更有意义,发布一些Schildt的代码,使用这种方式可能会更好。就像他希望参数保存最后一个索引而不是实际大小一样。 - Nathan Hughes
1
首先,你必须正确理解书中的示例,才能明白为什么索引要加1。这是一个广泛的问题,可能会吸引多个答案,大多数都只是猜测。可以请有关人士关闭此问题或标记为离题。 - vikeng21
显示剩余10条评论
2个回答

5
这种习惯类似于C语言中使用空字节作为终止“哨兵”来指示数组结尾的某些类型的数组;例如“C-strings”,其形式为char []char *。 话虽如此,Java不是C,作者为什么要这样做我不明白。它具有误导性,并且绝对被认为是不好的实践。你关于通过这样做来减轻ArrayOutOfBounds异常的评论也可能是正确的,但是创建一个与预期大小不同的数组并不是正确的方法。根据你提供的例子,我认为创建“误导性大小”的数组的这种习惯的应用程序只是代码旨在解决的问题的一个方面。例如,可能以这种方式构建DynQueue,因为第一个或最后一个索引表示要从数组的其余数据区分的数据...也许q [0](队列的第一个元素)代表下一个在某个算法或处理中要考虑的char(就像站在队列“前线”一样),但尚未清除出数组。(这仍然不能改变这样做的可疑方式。)

4
我不知道这本书,但是这个例子是完全误导人的!基本上new int [3+1]将初始化一个大小为4的int数组,而不是3。给定一个方法int [] generateArray(int size),我绝对希望它生成一个大小与参数相同的数组,而不是大小为size + 1的数组。该方法唯一有意义的方式是将其命名为:generateArrayThatHasLastIndex(int lastIndex)。其他方式都是错误的。

我添加了一本书中的例子。不再误导! - Sterling Archer

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