我知道默认情况下,String变量在Java中是不可变的。但有没有办法设置一个String变量,或一些特殊的方式(传递所述String变量时)使其变为可变?
或者至少暂时允许改变Stirng?
我意识到我可以通过将修改后的不可变变量分配给原始变量来改变String的值,如show:
String A = "Test";
A.toUpperCase(); //will make A upper case, but not save the new upper case string to a variable
Sring A = A.toUpperCase; //will give me TEST and save it to A, replacing A
有没有办法告诉Java“嘿,特别是这个字符串,将其视为可变的”?
答案 0 :(得分:8)
没有。字符串是不可变的。
如果需要,您应该创建自己的可变结构来包装字符串或char数组,或者如果符合您的需要,可以使用StringBuilder
之类的内容。
答案 1 :(得分:4)
不,类String
在java中是不可变的。为此,您可以创建类:
public class MutableString {
private String str;
public MutableString(String str) {
this.str = str;
}
public void toUpperCase() {
str = str.toUpperCase();
}
public String toString() {
return str;
}
}
此技术的可行性取决于String
所需的方法数量。
答案 2 :(得分:4)
字符串变量在Java中是可变的。字符串对象不可变。
但是,方法参数是按值传递的,而不是通过引用传递的。因此,您无法通过引用参数返回String的值。
例如,您可以这样做,因为a
是一个可变变量 - 首先指向一个不可变的String对象,然后指向另一个。
String a = "Test";
a = a.toUpperCase();
你可以这样做:
public void myfunction( String a ) {
a = a.toUppercase
}
但是这个调用者不会观察到对自己变量的更改,因为实际和形式的参数是两个不同的变量。
public void mycaller() {
String actual = "test";
myfunction( actual );
System.out.println( actual ); // Prints "test"
}
你能做的是:
MyMutableString
,其中包含对String的可变引用。String[]
数组。如果要返回多个值,请考虑第二个选项 - 返回封装方法结果的对象。如果您要返回一个值,只需返回即可。其他选项不太常用。
答案 3 :(得分:2)
不,没有办法让Java中的String
可变。该类不公开其内部字符数组,并且不提供可以改变它的方法。如果你想要可变的字符串,你可以选择一些选项:
StringBuilder
及其同步变体StringBuffer
本质上是可变字符串,但在代码中稍微麻烦一些。char
数组是可变的 - 例如,您可以使用toCharArray()
来获取String的内部char数组的可变副本。toString()
允许您按预期使用它。答案 4 :(得分:1)
简短的回答是否,你不能改变java.lang.String
个对象。
为了使Java更强内存效率,JVM会留出一个特殊的内存区域,称为" String常量池。"当。。。的时候 编译器遇到一个String文字,它检查池是否有相同的String 已经存在。
如果找到匹配项,则对新文字的引用将定向到 现有的String,并且不会创建新的String文字对象。 (现有的String简单 还有一个参考。)现在我们可以开始了解为什么要创建String对象 不可变的是一个好主意。如果多个引用变量引用相同的String 甚至不知道它,如果它们中的任何一个可以改变它将是非常糟糕的 字符串的价值。
你可能会说,"嗯,这一切都很好,但如果有人凌驾于 字符串类功能;这不会导致游泳池出现问题吗?"这是其中之一 String类标记为final的主要原因。
没有人可以覆盖任何String方法的行为,因此您可以放心使用String 你指望不可改变的对象实际上是不可变的。
参考:SCJP Sun认证Java 6程序员 - 学习指南考试(310-065) - Kathy Sierra&伯特贝茨
答案 5 :(得分:0)
您可以根据需要随时将引用(!)替换为String:
String A = "Test";
A = A.toUpperCase(); //will make A upper case
A = A.substring( 1 );
等等。过度使用这可能不是最好的方法 - 它取决于上下文。
因为有些人似乎认为通过方法传递的字符串不能完成:
String modify( String x ){
x = x.toLowerCasae();
x = x.substring( 1 );
return x;
}
并且调用当然必须替换原始的String引用。
String tomod = "abc";
tomod = modify( tomod );
当然,有三个类更适合这种字符串修改。