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

Java 替换字符串中特定索引处的字符?,java,string,replace,indexing,character,Java,String,Replace,Indexing,Character,我试图替换字符串中特定索引处的字符 我正在做的是: String myName = "domanokz"; myName.charAt(4) = 'x'; 这是一个错误。有什么方法可以做到这一点吗?字符串在Java中是不可变的。你不能改变它们 您需要创建一个替换字符的新字符串 String myName = "domanokz"; String newName = myName.substring(0,4)+'x'+myName.substring(5); 也可以使用StringBuilde

我试图替换字符串中特定索引处的字符

我正在做的是:

String myName = "domanokz";
myName.charAt(4) = 'x';

这是一个错误。有什么方法可以做到这一点吗?

字符串在Java中是不可变的。你不能改变它们

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

String myName = "domanokz";
String newName = myName.substring(0,4)+'x'+myName.substring(5);
也可以使用StringBuilder:

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

System.out.println(myName);

String
在java中是一个不可变的类。任何似乎要修改它的方法总是返回一个经过修改的新字符串对象


如果您想操纵字符串,请考虑<代码> StringBuilder <代码>或<代码> StringBuffer >代码>以防线程安全。

< P>我同意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);       
}
publicstringreplace(stringstr,int-index,charreplace){
如果(str==null){
返回str;
}else if(index=str.length()){
返回str;
}
char[]chars=str.toCharArray();
字符[索引]=替换;
返回字符串.valueOf(字符);
}

我应该注意到的第一件事是,
charAt
是一种方法,使用等号给它赋值不会起任何作用。如果字符串是不可变的,
charAt
方法要更改字符串对象,必须接收包含新字符的参数。不幸的是,字符串是不可变的。要修改字符串,我需要按照Petar Ivanov先生的建议使用StringBuilder。

这将起作用

   String myName="domanokz";
   String p=myName.replace(myName.charAt(4),'x');
   System.out.println(p);

输出:domaxokz

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

String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);

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

String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);  
请注意,字符串
myName
出现在两行以及第二行的两侧


因此,即使字符串在技术上是不可变的,但在实践中,您可以通过覆盖字符串将其视为可编辑的。

正如前面的回答,
String
实例是不可变的<代码>StringBuffer和
StringBuilder
是可变的,无论您是否需要线程安全,都适用于此目的

但是,有一种方法可以修改字符串,但我永远不会推荐它,因为它不安全、不可靠,并且可能被视为作弊:您可以使用它修改字符串对象包含的内部
char
数组。允许您访问通常隐藏在当前作用域中的字段和方法(私有方法或其他类中的字段…)


啊,你的意思是像
replace
方法一样,它不会修改字符串,只会返回一个新字符串?这有点复杂,Petar先生。这是你做这件事的最好方法吗?啊,我以前听说过StringBuilder,这有什么区别吗?它会给我一个更简单的方法吗?是什么让你的解决方案更好呢?尽管我非常讨厌这种允许他人在这个StackOverFlow网站上工作的“可编辑性”的方法。完全不公平的语法错误。即使更正了,如果我想用“x”替换第一个“o”,第二个“o”也会被替换。这将替换所有与charAt 4相同的字符。问题:
myName.replace(myName.charAt(5),'x')
将为您提供
dxmanxkz
,这可能不是必需的。我意识到这已经被彻底解决了,但值得注意的是,在java中永远不允许分配函数调用的结果。没有引用C(+)和C++的引用。@ VB中的ValeCalkPoT,你使用括号访问数组的索引,这可能是我在java中开始时感到困惑的原因:D@ApproachingDarknessFish我不知道你所说的“决不允许在java中分配函数调用的结果”是什么意思。你肯定能做双r=Math.sin(3.14)?这与这个问题有什么关系?谢谢。@flow2k哦,天哪,我不能编辑的旧注释,但这是一个打字错误,应该说“在Java中,永远不允许将其分配给函数调用的结果”。也就是说,你可以写“foo=bar();”但不能写“bar()=foo;”。谢谢@ApproachingDarknessFish的澄清。我认为给函数的结果赋值是很奇怪的——有没有语言真的允许这样做?我想知道用例是什么。我没有否决你的答案,但我必须承认我对“覆盖”这个词有一个问题(尽管我认为我们在背后的概念上是一致的)。对象本身保持不变。您只需使变量引用另一个对象。顺便说一句,在示例中您至少创建了四个字符串实例,这很有趣。我喜欢这个解决方案。最后,我将第三行更改为myNameChars[index]=character.tocharray()[0];为了简化。很好的解决方案。它看起来比另一个更丑陋的
myName.substring(0,4)+'x'+myName.substring(5)要好得多请记住,这会复制字符串两次。使用字符串连接版本可能会更快。
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();
    }
}