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