8

我想将一个字符串发送到一个方法并在那里更改字符串。该方法应返回 void。例子:

String s = "Hello";
ChangeString(s);

String res = s;
//res = "HelloWorld"
-------------------------------------------

private void ChageString(String s){
s = s + "World";
}

我怎样才能在Java中做到这一点?可以在不添加另一个类的情况下完成吗?

谢谢!铅

4

6 回答 6

14

由于两个原因,您的方法无法使用当前界面:

  • 字符串是不可变的。一旦您创建了一个字符串,您以后就不能再更改该字符串对象。
  • Java 使用按值传递,而不是按引用传递。当您在方法中分配新值时s,它只会修改 local ,而不是调用代码中s的原始值。s

要使您的方法有效,您需要更改界面。最简单的更改是返回一个新字符串:

private String changeString(String s){
    return s + "World";
}

然后像这样调用它:

String s = "Hello";
String res = changeString(s);

在线查看它:ideone

于 2012-08-12T18:31:31.810 回答
2

使用 StringBuffer 而不是 String 它将解决您的问题。

public static void main(String[] args) {
    StringBuffer s = new StringBuffer("Hello");
    changeString(s);
    String res = s.toString();
    //res = "HelloWorld"
}

private static void changeString(StringBuffer s){
    s.append("World");
}

或者,如果您真的只需要使用 String,那么这里是使用反射的解决方案:

public static void main(String[] args) {
    String s = "Hello";
    changeString(s);
    String res = s;
    //res = "HelloWorld"
}

private static void changeString(String s){
    char[] result = (s+"World").toCharArray();
    try {
        Field field = s.getClass().getDeclaredField("value");
        field.setAccessible(true);
        field.set(s, result);

    } catch (NoSuchFieldException | SecurityException | IllegalArgumentException |
            IllegalAccessException  e1) {
        e1.printStackTrace();
    }
}
于 2014-03-20T16:53:54.020 回答
1

您可以将字符串包装在一个对象中:

public class StringWrapper {
    String _str;
    public StringWrapper(String str) { set(str); }
    public void set(String str) { _str = str; }
    public String toString() { return _str; }
}

允许您执行以下操作:

StringWrapper s = new StringWrapper("Hello");
ChangeString(s);

String res = s + "";
//res = "HelloWorld"
private void ChageString(StringWrapper s) {
    s.set(s + "World");
}
于 2012-08-12T18:44:49.847 回答
1

不,不能在返回时完成void

Java 按值传递参数。字符串是不可变的,所以你不能改变它的值。你运气不好。

你可以这样做:

private String changeString(String original) {
    return original + " World";
}
于 2012-08-12T18:32:24.207 回答
0

不,Java 字符串是不可变的,不能更改。您可以只返回一个新字符串并将其分配给同一个变量。

更进一步:String 被声明为 final,所以你不能扩展 String 来添加新的行为

于 2012-08-12T18:31:54.043 回答
0

使用 StringBuffer/StringBuilder 更改字符串。java中的字符串是不可变的,这意味着一旦它们被赋值,它们就不能被改变,看起来改变字符串的代码实际上是创建一个新对象。是关于字符串缓冲区的内容,希望对您有所帮助。:)

于 2012-08-12T18:34:08.870 回答