我正在尝试替换字符串中特定索引处的字符。
我正在做的是:
String myName = "domanokz";
myName.charAt(4) = 'x';
这给出了一个错误。有什么方法可以做到这一点吗?
double r = Math.sin(3.14)
吗?它与这个问题有什么关系?谢谢。
字符串在 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);
将字符串转换为 char[],按索引替换字母,然后将数组转换回字符串。
String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
myName.substring(0,4)+'x'+myName.substring(5);
好多了
String
是 java 中的不可变类。任何似乎修改它的方法总是返回一个带有修改的新字符串对象。
如果要操作字符串,请考虑 StringBuilder
或 StringBuffer
,以防您需要线程安全。
我同意 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);
}
null
字符串和越界索引。
如前所述,String
实例是不可变的。无论您是否需要线程安全,StringBuffer
和 StringBuilder
都是可变的并且适用于这样的目的。
然而,有一种方法可以修改字符串,但我永远不会推荐它,因为它不安全、不可靠并且可以被视为作弊:您可以使用 reflection 修改 String 对象包含的内部 char
数组。 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();
}
}
您可以覆盖字符串,如下所示:
String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);
请注意,字符串 myName
出现在两行以及第二行的两侧。
因此,即使字符串在技术上可能是不可变的,但实际上,您可以通过覆盖它们来将它们视为可编辑的。
我应该注意到的第一件事是 charAt
是一种方法,使用等号为其赋值不会做任何事情。如果字符串是不可变的,charAt
方法要对字符串对象进行更改,必须接收包含新字符的参数。不幸的是,字符串是不可变的。要修改字符串,我需要按照 Petar Ivanov 先生的建议使用 StringBuilder。
您可以像这样覆盖相同的字符串
String myName = "domanokz";
myName = myName.substring(0, index) + replacement + myName.substring(index+1);
其中 index = 要替换的 char 的索引。 index+1 添加字符串的其余部分
这会起作用
String myName="domanokz";
String p=myName.replace(myName.charAt(4),'x');
System.out.println(p);
输出:domaxokz
myName.replace(myName.charAt(5),'x')
会给您 dxmanxkz
,这可能不是您所需要的。
不定期副业成功案例分享
replace
方法不会修改字符串而只会返回一个新字符串?