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

在java中,使用空字符更改字符数组的大小,java,arrays,char,variable-length,null-character,Java,Arrays,Char,Variable Length,Null Character,下面的代码(来自Gaale Laakman的“破解代码访谈”),展示了如何在不使用数组副本的情况下删除字符数组中的重复字符,以避免额外的内存使用。它使用偏移量在第一个数组中重新写入最后的字符。由于最后一个数组比前一个数组小,因此在最后一个字符后面的位置设置了一个空字符,好像说数组停止在那里: str[tail] = 0; 我想知道这样做是否会改变数组的变量“长度”。如果不是,我不明白这个例子为什么有效。或者,这只是一个示例,在这个示例中,我们将检查空字符的位置以查找数组的长度,而不使用

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

    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;
    }
publicstaticvoidremoveduplices(char[]str){
if(str==null)返回;
int len=str.length;
如果(len<2)返回;
int-tail=1;
对于(int i=1;i
数组在创建时具有固定长度。 在本例中,他们希望通过每次迭代都重复使用相同的数组来节省一些时间。
由于不可能收缩数组(因为长度在创建时确定),因此他们使用一种变通方法,在数组应该结束的位置放置一个零。当它们的循环达到零时,它知道它在数组的概念“末端”。

一个数组在创建时有一个固定的长度。 在本例中,他们希望通过每次迭代都重复使用相同的数组来节省一些时间。
由于不可能收缩数组(因为长度在创建时确定),因此他们使用一种变通方法,在数组应该结束的位置放置一个零。当它们的循环达到零时,它知道它位于数组的概念“末端”。

数组是不可变的,因此长度不会改变,空空间中填充了空值

public class MainClass {

public static void main(String[] args) {
char[] org={'a','b','b','c'};
System.out.println(org.length);
System.out.println(org);
removeDuplicate(org);
System.out.println(org.length);
   System.out.println(org);

}
public static void removeDuplicate(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;
  }
 }

**Results**
   4
  abbc
   4
  abc
public类MainClass{
公共静态void main(字符串[]args){
char[]org={'a','b','b','c'};
System.out.println(组织长度);
System.out.println(org);
移除副本(组织);
System.out.println(组织长度);
System.out.println(org);
}
移除的公共静态无效副本(char[]str){
if(str==null)返回;
int len=str.length;

如果(len数组是不可变的,因此长度不会更改,则空空间将填充空值

public class MainClass {

public static void main(String[] args) {
char[] org={'a','b','b','c'};
System.out.println(org.length);
System.out.println(org);
removeDuplicate(org);
System.out.println(org.length);
   System.out.println(org);

}
public static void removeDuplicate(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;
  }
 }

**Results**
   4
  abbc
   4
  abc
public类MainClass{
公共静态void main(字符串[]args){
char[]org={'a','b','b','c'};
System.out.println(组织长度);
System.out.println(org);
移除副本(组织);
System.out.println(组织长度);
System.out.println(org);
}
移除的公共静态无效副本(char[]str){
if(str==null)返回;
int len=str.length;

如果(Le< p>它听起来像是从C或C++中翻译出来的问题。在这些语言中,你使用一个空字符作为字符串的结尾(这又是一个代码> char < /Cord>数组)。在爪哇中,这个函数不起作用;数组永远不会改变它的长度。

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

在Java中,您通常会执行以下操作:

str = Arrays.copyOf(str, tail);
这将创建一个长度正确的新数组,并复制所有字符(这是代码示例旨在避免的)


顺便说一下,我在
str[tail]行中得到了一个
ArrayIndexOutOfBoundsException
=0;如果没有发现重复的数据。在这种情况下,<代码>尾部>代码>等于数组的长度,因此超出了最后一个元素的1个位置。

< P>这听起来像是从C或C++中翻译的问题。(这又是一个
char
数组)。在Java中,这不起作用;数组从不改变其长度

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

在Java中,您通常会执行以下操作:

str = Arrays.copyOf(str, tail);
这将创建一个长度正确的新数组,并复制所有字符(这是代码示例旨在避免的)


顺便说一下,我在
str[tail]行中得到了一个
ArrayIndexOutOfBoundsException
=0;
如果没有找到重复项,则最后执行。在这种情况下,
尾部
等于数组的长度,因此超出最后一个元素1个位置。

谢谢,这是我的想法,但我想确定!谢谢,这是我的想法,但我想确定!请将代码作为文本而不是图像发布。我们希望能够全部或部分复制它。我投了反对票。我认为这是一些“学术知识分子”的想法,来自编程“洞穴时代”(C或甚至更早)…绝对没有用的练习(特别是在Java中)对Ole V.V来说,谢谢你在编辑中的评论。对Vodem来说,代码对java来说确实不正确。我想这个练习的目的是考虑内存优化,因为如果字符串很长……但你是对的,它不是真的现实。请将代码作为文本而不是图像发布。我们希望能够复制它的全部或部分。我投了反对票。我认为这是一个来自编程“洞穴时代”(C或甚至更早)的“学术书呆子”的想法……绝对没有用的练习(特别是在Java中)对于OLEV.V,感谢您在编辑中所做的评论。对于Vodem,代码对于java来说似乎确实不正确