Java的字符串连接并不适用于'对于'环

时间:2014-08-13 18:51:43

标签: java arrays string

是的,我知道Java的字符串是不可改变的,但是,仅凭这一点并不能解释为什么这对我不起作用...
当我尝试将字符串数组(String[])转换为格式为('String[0]','String[1]',...,'String[n]')的字符串时,我遇到了这个问题。
例如,给定以下数组:

String[] array=new String[3];
array[0]="Jake";
array[1]="Mishel";
array[2]="Dan";

我想创建字符串:('Jake','Mishel','Dan')
但是,这样做的方式不是这篇文章的目的...... 我有兴趣知道的是,为什么这样做:

    String[] array=new String[3];

    array[0]="Jake";
    array[1]="Mishel";
    array[2]="Dan";

    for (int i=0; i<array.length; i++) {
        array[i]=array[i]+"'";
        array[i]="'"+array[i];
    }

    String str=Arrays.toString(array);
    str=str.replace('[','(');
    str=str.replace(']',')');

    System.out.println(str);  //produces ('Jake','Mishel','Dan'), as desired

但这不是:

    String[] array=new String[3];

    array[0]="Jake";
    array[1]="Mishel";
    array[2]="Dan";


    for (String str: array) {
        str=str+"'";
        str="'"+str;
    }

    String str=Arrays.toString(array);
    str=str.replace('[','(');
    str=str.replace(']',')');

    System.out.println(str); //produces wrong output: (Jake,Mishel,Dan)

6 个答案:

答案 0 :(得分:4)

它不起作用,因为在第二个中,您将数组中每个索引的字符串值提取为str,然后更改str,而不是字符串在数组中(技术上没有变化,替换将是一个更好的词)。在第一个中,您使用新值重写数组的索引。

实际上,在for循环中,您正在使用与全局变量具有相同值的局部变量。但是,这是一个新变量,因此它没有在循环之外的范围。在常规for循环中,您显式更新位于数组的每个索引处的项目。

答案 1 :(得分:3)

此代码

for (String str: array) {
    str = str+"'";
    str = "'"+str;
}

相当于

for (int i=0; i<array.length; i++) {
    //Temporary local variable named str which holds value from array
    String str = array[i];
    str = str+"'";
    str = "'"+str;
}

所以通过str=str+"'";重新分配不影响数组的局部变量,而array[i]=array[i]+"'";实际更新数组中的值。


BTW:Java 8添加了StringJoiner类,可以像

一样使用
StringJoiner sj = new StringJoiner("','", "'", "'");//delimite, prefix, suffix
for (String str : array)
    sj.add(str);
System.out.println(sj);

生成'Jake','Mishel','Dan'


我们还可以使用添加到join的{​​{1}}方法创建单行解决方案

String

答案 2 :(得分:1)

for (String str: array) { // read as for each string str in Array array. str contains same value as arr[i] 
        str=str+"'"; 
        str="'"+str;
    }

你的问题。您正在处理数组实际字符串的副本。你在数组上工作。

答案 3 :(得分:1)

在你的循环中str实际上是一个局部变量;它不是对数组元素的引用,而是一个新的String,它是该元素的副本。因此,对str的更改不会更改数组的元素。

答案 4 :(得分:1)

这个原因

for (String str: array) {
    str=str+"'";
    str="'"+str;
}

不起作用是因为您正在修改引用String str(它与作为本地副本的数组无关)。

首先,您可以使用

声明并初始化数组
String[] array = { "Jake", "Mishel", "Dan" };

然后

for (int i = 0; i < array.length; i++) {
    array[i] = array[i] + "'";
    array[i] = "'" + array[i];
}

应该是

for (int i = 0; i < array.length; i++) {
    array[i] = "'" + array[i] + "'";
}

最后,你可以写

str=str.replace('[','(');
str=str.replace(']',')');

作为

str = str.replace('[', '(').replace(']', ')');

把它放在一起

String[] array = { "Jake", "Mishel", "Dan" };
for (int i = 0; i < array.length; i++) {
    array[i] = "'" + array[i] + "'";
}
String str = Arrays.toString(array);
str = str.replace('[', '(').replace(']', ')');
System.out.println(str);

输出

('Jake', 'Mishel', 'Dan')

答案 5 :(得分:0)

它不起作用,因为str 数组中的String,它是一个局部变量,具有与&#34;真实&#相同的特征34;数组中的String /数组中String的副本。