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

我正在尝试替换字符串中特定下标处的一个字符。

我所做的是:

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

这将给出一个错误。有什么方法可以做到吗?

1106293 次浏览

字符串在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中的一个不可变类。任何似乎要修改它的方法总是返回一个经过修改的新字符串对象。

如果你想操作一个字符串,考虑StringBuilderStringBuffer以防你需要线程安全。

我同意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);
}

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

这是可行的

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

输出:domaxokz

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

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实例是不可变的StringBufferStringBuilder是可变的,适用于这样的目的,无论你是否需要线程安全。

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

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();
}
}

你可以像这样重写同一个字符串

String myName = "domanokz";
myName = myName.substring(0, index) + replacement + myName.substring(index+1);

where index =要替换的char的索引。 索引+1添加字符串