替换字符串中特定索引处的字符?

dpp*_*dpp 359 java string indexing replace character

我正在尝试替换字符串中特定索引处的字符.

我在做的是:

String myName = "domanokz";
myName.charAt(4) = 'x';
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误.有没有办法做到这一点?

Pet*_*nov 532

字符串在Java中是不可变的.你无法改变它们.

您需要创建一个替换字符的新字符串.

String myName = "domanokz";
String newName = myName.substring(0,4)+'x'+myName.substring(5);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用StringBuilder:

StringBuilder myName = new StringBuilder("domanokz");
myName.setCharAt(4, 'x');

System.out.println(myName);
Run Code Online (Sandbox Code Playgroud)

  • 啊,你的意思是像`replace`方法,它不会修改字符串但只会返回一个新的字符串? (3认同)

16d*_*ots 146

将String转换为char [],用索引替换字母,然后将数组转换回String.

String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
Run Code Online (Sandbox Code Playgroud)

  • 它看起来比另一个丑陋的`myName.substring(0,4)+'x'+ myName.substring(5);更好。 (2认同)
  • 请记住,这会复制字符串两次。使用字符串连接版本可能会更快。 (2认同)

no *_*ame 17

String是java中的不可变类,任何似乎修改它的方法总是返回一个带有修改的新字符串对象.如果你想操作一个字符串,请考虑StringBuilder或StringBuffer,以防你需要线程安全


Len*_*oju 11

我同意Petar Ivanov,但最好是按照以下方式实施:

public String replace(String str, int index, char replace){     
    if(str==null){
        return str;
    }else if(index<0 || index>=str.length()){
        return str;
    }
    char[] chars = str.toCharArray();
    chars[index] = replace;
    return String.valueOf(chars);       
}
Run Code Online (Sandbox Code Playgroud)

  • 是什么让你的解决方案更好? (20认同)

Cod*_*Med 7

您可以覆盖一个字符串,如下所示:

String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);  
Run Code Online (Sandbox Code Playgroud)

请注意,该字符串myName出现在两行以及第二行的两侧。

因此,即使字符串在技术上可能是不可变的,但实际上,您可以通过覆盖它们来将它们视为可编辑的。


C.C*_*gne 6

如前所述,String实例是不可变的.无论您是否需要线程安全StringBuffer,它StringBuilder都是可变的并且适合于此目的.

但是有一种方法可以修改String,但是我永远不会推荐它,因为它不安全,不可靠并且可以被认为是作弊:你可以使用反射来修改charString对象包含的内部数组.Reflection允许您访问通常隐藏在当前范围内的字段和方法(私有方法或来自另一个类的字段......).

public static void main(String[] args) {
    String text = "This is a test";
    try {
        //String.value is the array of char (char[])
        //that contains the text of the String
        Field valueField = String.class.getDeclaredField("value");
        //String.value is a private variable so it must be set as accessible 
        //to read and/or to modify its value
        valueField.setAccessible(true);
        //now we get the array the String instance is actually using
        char[] value = (char[])valueField.get(text);
        //The 13rd character is the "s" of the word "Test"
        value[12]='x';
        //We display the string which should be "This is a text"
        System.out.println(text);
    } catch (NoSuchFieldException | SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)