有没有办法将String传递给方法可变?

时间:2014-08-13 19:45:23

标签: java string immutability

我知道默认情况下,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“嘿,特别是这个字符串,将其视为可变的”?

6 个答案:

答案 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数组的可变副本。
  • 使用内部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 );

当然,有三个类更适合这种字符串修改。