Заменить символ в определенном индексе в строке?

Я пытаюсь заменить символ в определенном индексе в строке.

что я делаю это:

String myName = "domanokz";
myName.charAt(4) = 'x';

Это дает ошибку. Есть ли способ сделать это?

8 ответов


String неизменяемы в 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);

String является неизменяемым классом в java любые методы, которые, кажется, изменяют его, всегда возвращают новый объект string с модификацией. если вы хотите управлять строкой, рассмотрите StringBuilder или StringBuffer в случае, если вам требуется безопасность потока


Я согласен с Петаром Ивановым, но лучше всего, если мы реализуем следующим образом:

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 изменчивы и подходят для такой цели, независимо от того, нужно ли вам быть потокобезопасным или нет.

однако есть способ изменить строку, но я бы никогда не рекомендовал ее, потому что она небезопасна, ненадежна, и ее можно рассматривать как обман : вы можете использовать отражение изменить внутренние 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();
    }
}

вы можете перезаписать строку следующим образом:

String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);  

обратите внимание, что строка myName происходит на обеих строках и по обе стороны от второй строки.

поэтому, хотя строки могут быть технически неизменяемыми, на практике вы можете рассматривать их как редактируемые, перезаписывая их.


Первое, что я должен был заметить, что charAt метод и присвоить значение с помощью знака равенства ничего не сделает. Если строка неизменяема,charAt метод, чтобы внести изменения в объект string должен получить аргумент, содержащий новый символ. К сожалению, строка неизменна. Чтобы изменить строку, мне нужно было использовать StringBuilder, как предложил г-н Петар Иванов.


это будет работать

   String myName="domanokz";
   String p=myName.replace(myName.charAt(4),'x');
   System.out.println(p);

вывод: domaxokz