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