replacestring中特定索引处的字符?
我试图replacestring中特定索引处的字符。
我正在做的是:
String myName = "domanokz"; myName.charAt(4) = 'x';
这给了一个错误。 有没有办法做到这一点?
string在Java中是不可变的。 你不能改变它们。
您需要创build一个replace字符的新string。
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转换为char [],按索引replace该字母,然后将该数组转换回string。
String myName = "domanokz"; char[] myNameChars = myName.toCharArray(); myNameChars[4] = 'x'; myName = String.valueOf(myNameChars);
string是一个在Java中的不可变类,任何似乎修改它的方法总是返回一个新的string对象的修改。 如果你想操纵一个string,请考虑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); }
正如以前在这里回答的那样, String
实例是不可变的 。 StringBuffer
和StringBuilder
是可变的,适合这样的目的,不pipe你是否需要线程安全。
然而,有一种方法来修改一个string,但我永远不会推荐它,因为它是不安全的,不可靠的,它可以被认为是作弊:你可以使用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,如下所示:
String myName = "halftime"; myName = myName.substring(0,4)+'x'+myName.substring(5);
请注意,stringmyName
出现在两行,并在第二行的两侧。
因此,即使string在技术上可能是不可改变的,但在实践中,可以通过覆盖它们来将它们视为可编辑的。
首先我应该注意的是, charAt
是一种方法,使用等号给它赋值并不会做任何事情。 如果一个string是不可变的, charAt
方法,要改变string对象,必须接收一个包含新字符的参数。 不幸的是,string是不可变的。 为了修改string,我需要像Petar Ivanov先生build议的那样使用StringBuilder。
这将工作
String myName="domanokz"; String p=myName.replace(myName.charAt(4),'x'); System.out.println(p);
输出:domaxokz