Mir ist klar, dass dies zu Tode beantwortet wurde, aber es ist erwähnenswert, dass es niemals erlaubt ist, das Ergebnis eines Funktionsaufrufs in Java zuzuweisen. Es gibt keine Referenzen wie C (?) Und C ++.
Annäherung an
1
@ValekHalfHeart in VB verwenden Sie Klammern, um auf den Index eines Arrays zuzugreifen. Dies kann der Grund sein, warum ich verwirrt bin, als ich in Java angefangen habe: D
dpp
@ApproachingDarknessFish Ich bin mir nicht sicher, was Sie damit meinen, dass es "niemals erlaubt ist, das Ergebnis eines Funktionsaufrufs in Java zuzuweisen". Sicher können Sie tun double r = Math.sin(3.14)? Wie hängt es mit dieser Frage zusammen? Vielen Dank.
flow2k
1
@ flow2k Oh jeez, alter Kommentar so kann ich nicht bearbeiten , sondern dass ein Tippfehler ist, sollte es sagen , dass „es nie zuweisen darf auf das Ergebnis eines Funktionsaufruf in Java“. Dh du kannst schreiben "foo = bar ();" aber niemals "bar () = foo;".
Annäherung an
Vielen Dank für die Klarstellung @ApproachingDarknessFish. Ich denke, es wäre seltsam, dem Ergebnis einer Funktion etwas zuzuweisen - gibt es Sprachen, die dies tatsächlich zulassen? Ich frage mich, was der Anwendungsfall wäre.
flow2k
Antworten:
566
Zeichenfolgen sind in Java unveränderlich. Sie können sie nicht ändern.
Sie müssen eine neue Zeichenfolge erstellen, wobei das Zeichen ersetzt wird.
Ah, du meinst wie die replaceMethode, die den String nicht ändert, sondern nur einen neuen String zurückgibt?
dpp
1
Das ist ein bisschen kompliziert, Mr. Petar. Ist das der beste Weg, es zu tun? Ah, ich habe schon mal von StringBuilder gehört, macht das einen Unterschied? Wird es mir eine einfachere Methode geben?
dpp
158
Verwandeln Sie den String in ein Zeichen [], ersetzen Sie den Buchstaben durch einen Index und konvertieren Sie das Array zurück in einen String.
Ich liebe diese Lösung. Am Ende habe ich die 3. Zeile in myNameChars [index] = character.toCharArray () [0] geändert. zur Vereinfachung. Schöne Lösung.
Dale
2
es sieht viel besser aus als das andere hässlicheremyName.substring(0,4)+'x'+myName.substring(5);
user924
Es ist viel einfacher
Shiva Acharjee
19
Stringist eine unveränderliche Klasse in Java. Jede Methode, die sie zu ändern scheint, gibt immer ein neues Zeichenfolgenobjekt mit Änderung zurück.
Wenn Sie eine Zeichenfolge manipulieren möchten, ziehen Sie dies in Betracht StringBuilderoder StringBufferfalls Sie Thread-Sicherheit benötigen.
Wie hier bereits beantwortet, sind StringInstanzen unveränderlich . StringBufferund StringBuildersind veränderlich und für einen solchen Zweck geeignet, unabhängig davon, ob Sie threadsicher sein müssen oder nicht.
Es gibt jedoch eine Möglichkeit, einen String zu ändern, aber ich würde ihn niemals empfehlen, da er unsicher und unzuverlässig ist und als Betrug angesehen werden kann: Sie können Reflektion verwenden , um das innere charArray zu ändern, das das String-Objekt enthält. Mit Reflection können Sie auf Felder und Methoden zugreifen, die normalerweise im aktuellen Bereich verborgen sind (private Methoden oder Felder einer anderen Klasse ...).
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();}}
Ich habe Ihre Antwort nicht abgelehnt, aber ich muss zugeben, dass ich ein Problem mit dem Begriff "Überschreiben" habe (obwohl ich denke, dass wir uns über das dahinter stehende Konzept einig sind). Das Objekt selbst bleibt unverändert. Sie lassen Ihre Variable einfach auf ein anderes Objekt verweisen. Übrigens ist es interessant zu erwähnen, dass Sie in Ihrem Beispiel mindestens vier String-Instanzen erstellen.
C.Champagne
0
Das erste, was ich hätte bemerken müssen, ist, dass charAtes sich um eine Methode handelt und das Zuweisen eines Werts mit Gleichheitszeichen nichts bewirkt. Wenn eine Zeichenfolge unveränderlich ist, muss die charAtMethode zum Ändern des Zeichenfolgenobjekts ein Argument erhalten, das das neue Zeichen enthält. Leider ist die Zeichenfolge unveränderlich. Um die Zeichenfolge zu ändern, musste ich StringBuilder verwenden, wie von Herrn Petar Ivanov vorgeschlagen.
double r = Math.sin(3.14)
? Wie hängt es mit dieser Frage zusammen? Vielen Dank.Antworten:
Zeichenfolgen sind in Java unveränderlich. Sie können sie nicht ändern.
Sie müssen eine neue Zeichenfolge erstellen, wobei das Zeichen ersetzt wird.
Oder Sie können einen StringBuilder verwenden:
quelle
replace
Methode, die den String nicht ändert, sondern nur einen neuen String zurückgibt?Verwandeln Sie den String in ein Zeichen [], ersetzen Sie den Buchstaben durch einen Index und konvertieren Sie das Array zurück in einen String.
quelle
myName.substring(0,4)+'x'+myName.substring(5);
String
ist eine unveränderliche Klasse in Java. Jede Methode, die sie zu ändern scheint, gibt immer ein neues Zeichenfolgenobjekt mit Änderung zurück.Wenn Sie eine Zeichenfolge manipulieren möchten, ziehen Sie dies in Betracht
StringBuilder
oderStringBuffer
falls Sie Thread-Sicherheit benötigen.quelle
Ich stimme Petar Ivanov zu, aber es ist am besten, wenn wir Folgendes umsetzen:
quelle
Wie hier bereits beantwortet, sind
String
Instanzen unveränderlich .StringBuffer
undStringBuilder
sind veränderlich und für einen solchen Zweck geeignet, unabhängig davon, ob Sie threadsicher sein müssen oder nicht.Es gibt jedoch eine Möglichkeit, einen String zu ändern, aber ich würde ihn niemals empfehlen, da er unsicher und unzuverlässig ist und als Betrug angesehen werden kann: Sie können Reflektion verwenden , um das innere
char
Array zu ändern, das das String-Objekt enthält. Mit Reflection können Sie auf Felder und Methoden zugreifen, die normalerweise im aktuellen Bereich verborgen sind (private Methoden oder Felder einer anderen Klasse ...).quelle
Sie können eine Zeichenfolge wie folgt überschreiben:
Beachten Sie, dass die Zeichenfolge
myName
in beiden Zeilen und auf beiden Seiten der zweiten Zeile vorkommt.Obwohl Zeichenfolgen technisch unveränderlich sein können, können Sie sie in der Praxis als bearbeitbar behandeln, indem Sie sie überschreiben.
quelle
Das erste, was ich hätte bemerken müssen, ist, dass
charAt
es sich um eine Methode handelt und das Zuweisen eines Werts mit Gleichheitszeichen nichts bewirkt. Wenn eine Zeichenfolge unveränderlich ist, muss diecharAt
Methode zum Ändern des Zeichenfolgenobjekts ein Argument erhalten, das das neue Zeichen enthält. Leider ist die Zeichenfolge unveränderlich. Um die Zeichenfolge zu ändern, musste ich StringBuilder verwenden, wie von Herrn Petar Ivanov vorgeschlagen.quelle
das wird funktionieren
Ausgabe: domaxokz
quelle
myName.replace(myName.charAt(5),'x')
wird Ihnen gebendxmanxkz
, was wahrscheinlich nicht das ist, was benötigt wird.