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