Я понимаю, что на это ответили до смерти, но стоит отметить, что никогда не разрешается присваивать результат вызова функции в Java. Нет таких вещей, как ссылки на C (?) И C ++.
Приближается к
1
@ValekHalfHeart в VB, вы используете круглые скобки для доступа к индексу массива, что может быть причиной того, что я запутался, когда начинал в Java: D
dpp
@ApproachingDarknessFish Я не уверен, что вы подразумеваете под "никогда не разрешается присваивать результат вызова функции в Java". Конечно, вы можете сделать double r = Math.sin(3.14)? Как это связано с этим вопросом? Спасибо.
flow2k
1
@ flow2k О господи, старый комментарий , так что я не могу изменить , но это опечатка, он должен сказать , что «он никогда не разрешается назначать в результате вызова функции в Java». Т.е. вы можете написать "foo = bar ();" но никогда "bar () = foo;".
Приближается к
Спасибо за разъяснение @ApproachingDarknessFish. Я думаю, что было бы странно присваивать что-то результат функции - есть ли языки, которые на самом деле позволяют это? Интересно, какой будет вариант использования.
flow2k
Ответы:
566
Строка неизменна в Java. Вы не можете их изменить.
Вам нужно создать новую строку с замененным символом.
Ах, вы имеете в виду как replaceметод, который не будет изменять строку, а просто вернет новую строку?
ДПП
1
Это довольно сложно, мистер Петар. Это лучший способ сделать это? Ах, я слышал о StringBuilder раньше, это имеет какое-то значение? Это даст мне более простой метод?
ДПП
158
Превратите строку в символ [], замените букву на индекс, затем преобразуйте массив обратно в строку.
Как ранее ответили здесь, Stringслучаи являются неизменными . StringBufferи StringBuilderявляются изменяемыми и пригодными для таких целей, независимо от того, нужно ли вам использовать потокобезопасность или нет.
Однако есть способ изменить String, но я бы никогда не рекомендовал его, потому что это небезопасно, ненадежно и его можно рассматривать как мошенничество: вы можете использовать отражение, чтобы изменить внутренний charмассив, содержащийся в объекте String. Отражение позволяет получить доступ к полям и методам, которые обычно скрыты в текущей области (частные методы или поля из другого класса ...).
publicstaticvoid main(String[] args){String text ="This is a test";try{//String.value is the array of char (char[])//that contains the text of the StringField 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 usingchar[] 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 в вашем примере.
C.Champagne
0
Первое, на что я должен был charAtобратить внимание - это метод, и присвоение ему значения с помощью знака равенства ничего не даст. Если строка неизменна, charAtметод, чтобы внести изменения в строковый объект, должен получить аргумент, содержащий новый символ. К сожалению, строка неизменна. Чтобы изменить строку, мне нужно было использовать StringBuilder, как предложил г-н Петар Иванов.
double r = Math.sin(3.14)
? Как это связано с этим вопросом? Спасибо.Ответы:
Строка неизменна в Java. Вы не можете их изменить.
Вам нужно создать новую строку с замененным символом.
Или вы можете использовать StringBuilder:
источник
replace
метод, который не будет изменять строку, а просто вернет новую строку?Превратите строку в символ [], замените букву на индекс, затем преобразуйте массив обратно в строку.
источник
myName.substring(0,4)+'x'+myName.substring(5);
String
неизменный класс в Java. Любой метод, который, кажется, изменяет его, всегда возвращает новый строковый объект с модификацией.Если вы хотите манипулировать строкой, подумайте
StringBuilder
илиStringBuffer
в случае, если вам требуется безопасность потоков.источник
Я согласен с Петром Ивановым, но было бы лучше, если бы мы реализовали его следующим образом:
источник
Как ранее ответили здесь,
String
случаи являются неизменными .StringBuffer
иStringBuilder
являются изменяемыми и пригодными для таких целей, независимо от того, нужно ли вам использовать потокобезопасность или нет.Однако есть способ изменить String, но я бы никогда не рекомендовал его, потому что это небезопасно, ненадежно и его можно рассматривать как мошенничество: вы можете использовать отражение, чтобы изменить внутренний
char
массив, содержащийся в объекте String. Отражение позволяет получить доступ к полям и методам, которые обычно скрыты в текущей области (частные методы или поля из другого класса ...).источник
Вы можете перезаписать строку следующим образом:
Обратите внимание, что строка
myName
встречается на обеих строках и на обеих сторонах второй строки.Поэтому, хотя строки могут быть технически неизменными, на практике вы можете рассматривать их как редактируемые, перезаписывая их.
источник
Первое, на что я должен был
charAt
обратить внимание - это метод, и присвоение ему значения с помощью знака равенства ничего не даст. Если строка неизменна,charAt
метод, чтобы внести изменения в строковый объект, должен получить аргумент, содержащий новый символ. К сожалению, строка неизменна. Чтобы изменить строку, мне нужно было использовать StringBuilder, как предложил г-н Петар Иванов.источник
это будет работать
Выход: domaxokz
источник
myName.replace(myName.charAt(5),'x')
даст вамdxmanxkz
, что, вероятно, не то, что требуется.