java - 在java中,用空字符更改char数组的大小

标签 java arrays char variable-length null-character

以下代码(来自 Gaale Laakman 的“破解代码访谈”)展示了如何在不使用数组副本的情况下删除 char 数组中的重复字符,以避免使用额外的内存。它使用偏移量重写第一个数组中的最终字符。由于最终的数组比前一个数组小,因此在最后一个字符后面的位置设置了一个空字符,就好像数组在那里停止一样:

    str[tail] = 0;

我想知道这样做是否会改变数组的变量“长度”。如果没有,我不明白为什么这个例子有效。或者这只是一个示例,我们将检查空字符在哪里来查找数组的长度并且不使用有问题的长度变量?

这是完整的代码:

    public static void removeDuplicates(char[] str) {
        if (str == null) return;
        int len = str.length;
        if (len < 2) return;
        int tail = 1;
        for (int i = 1; i < len; ++i) {
            int j;
            for (j = 0; j < tail; ++j) {
                if (str[i] == str[j]) break;
            }
            if (j == tail) {
                str[tail] = str[i];
                ++tail;
            }
        }
        str[tail] = 0;
    }

最佳答案

这听起来像是一个从 C 或 C++ 翻译过来的问题。在这些语言中,您使用空字符作为字符串的末尾(字符串又是一个 char 数组)。在 Java 中这是行不通的;数组永远不会改变其长度。

如果调用者知道插入了这个空字符,他们当然可以使用该信息,并忽略空字符后面的字符。他们不能使用 len 变量,因为它只存在于方法内部,并且在方法返回时不存在。

在 Java 中你通常会这样做:

str = Arrays.copyOf(str, tail);

这将创建一个长度正确的新数组并复制所有字符(这是代码示例旨在避免的情况)。

顺便说一句,如果没有找到重复项,我最终会在 str[tail] = 0; 行中得到一个 ArrayIndexOutOfBoundsException 。在本例中,tail 等于数组的长度,因此超出最后一个元素 1 个位置。

关于java - 在java中,用空字符更改char数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42530092/

相关文章:

c - 尝试从 DataSet 扫描数组,但在 C 中继续出现总线错误

c - 如何从c字符串中提取地址

c++ - 无法将参数 1 从 'char *' 转换为 'LPCWSTR'

java - 无法使用新值重新加载 JGrid

java - 按日期分组,看看日期是不是今天?

java - 如何使用 wicket 生成表头

python - 如何从图像创建 4D numpy 数组?

java - 如何获取一个 ArrayList 中与另一个 ArrayList 相比额外的项目列表?

c++ - 通过 char* 返回本地字符串文字

java - 防止非贪心部分消费后面的可选部分