Java中的更改字符串

Java中的更改字符串,java,string,Java,String,我想向一个方法发送一个字符串,并在那里更改该字符串。 该方法应返回void。 例如: 我如何用Java实现它? 不添加其他类就可以完成吗 谢谢! PB由于以下两个原因,您的方法无法与当前接口一起工作: 字符串是不可变的。一旦创建了字符串,以后就不能更改该字符串对象 Java使用按值传递,而不是按引用传递。在方法中将新值指定给s时,它只修改本地s,而不是调用代码中的原始s 要使您的方法工作,您需要更改接口。最简单的更改是返回一个新字符串: private String changeString

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

我如何用Java实现它? 不添加其他类就可以完成吗

谢谢!
PB

由于以下两个原因,您的方法无法与当前接口一起工作:

  • 字符串是不可变的。一旦创建了字符串,以后就不能更改该字符串对象
  • Java使用按值传递,而不是按引用传递。在方法中将新值指定给
    s
    时,它只修改本地
    s
    ,而不是调用代码中的原始
    s
要使您的方法工作,您需要更改接口。最简单的更改是返回一个新字符串:

private String changeString(String s){
    return s + "World";
}
那么就这样称呼它:

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

联机查看它的工作情况:

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


更进一步:字符串被声明为final,所以您不能扩展字符串以添加新行为

不,不能在返回
void
时执行

Java按值传递参数。字符串是不可变的,因此不能更改其值。你真倒霉

您可以这样做:

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

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

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

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"

使用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");
}
或者,如果您真的只需要使用字符串,那么下面是使用反射的解决方案:

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

看看你是否真的需要在一个返回void的方法中这样做,这是一个肮脏的黑客操作。->但这通常不是办法!似乎与[enter link description here][1][1]:私有字符串changeString(…)重复,返回类型不应为void。如何从返回void的方法返回值?它们是,是。但是有一些讨厌的黑客在某些情况下可以工作,这使得它们是可变的:)请删除所有“坏主意”建议,只建议使用具有可变成员变量的包装器类。我不认为任何新手都需要看到这些“建议”!)Java不是按值传递的。请删除不相关的原因。
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");
}
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();
    }
}