Как ранее ответили здесь, String
случаи являются неизменными . StringBuffer
и StringBuilder
являются изменяемыми и пригодными для таких целей, независимо от того, нужно ли вам использовать потокобезопасность или нет.
Однако есть способ изменить String, но я бы никогда не рекомендовал его, потому что это небезопасно, ненадежно и его можно рассматривать как мошенничество: вы можете использовать отражение, чтобы изменить внутренний char
массив, содержащийся в объекте String. Отражение позволяет получить доступ к полям и методам, которые обычно скрыты в текущей области (частные методы или поля из другого класса ...).
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();
}
}