Saya menyadari ini telah dijawab sampai mati, tetapi perlu dicatat bahwa tidak pernah diizinkan untuk menetapkan hasil pemanggilan fungsi di java. Tidak ada yang namanya referensi C (?) Dan C ++.
ApproachingDarknessFish
1
@ValekHalfHeart di VB, Anda menggunakan tanda kurung untuk mengakses indeks array, yang mungkin menjadi alasan mengapa saya bingung ketika saya memulai di Jawa: D
dpp
@ApproachingDarknessFish Saya tidak yakin apa yang Anda maksud dengan itu "tidak pernah diizinkan untuk menetapkan hasil pemanggilan fungsi di java". Tentunya Anda bisa melakukannya double r = Math.sin(3.14)? Bagaimana hubungannya dengan pertanyaan ini? Terima kasih.
flow2k
1
@ flow2k Oh ya ampun, komentar tua jadi saya tidak bisa mengedit tapi itu salah ketik, itu harus mengatakan bahwa "itu tidak pernah diperbolehkan untuk menetapkan untuk hasil dari pemanggilan fungsi di Jawa". Yaitu Anda dapat menulis "foo = bar ();" tetapi tidak pernah "bar () = foo;".
ApproachingDarknessFish
Terima kasih atas klarifikasi @ApproachingDarknessFish. Saya pikir itu akan aneh untuk menetapkan sesuatu ke hasil fungsi - apakah ada bahasa yang sebenarnya mengizinkan ini? Saya ingin tahu seperti apa penggunaannya.
flow2k
Jawaban:
566
String tidak dapat diubah di Jawa. Anda tidak dapat mengubahnya.
Anda perlu membuat string baru dengan karakter diganti.
Ah, maksud Anda seperti replacemetode yang tidak akan mengubah string tetapi hanya akan mengembalikan string baru?
dpp
1
Mr.Petar agak rumit. Apakah itu cara terbaik Anda untuk melakukannya? Ah, saya pernah mendengar tentang StringBuilder sebelumnya, apakah itu ada bedanya? Apakah ini akan memberi saya metode yang lebih mudah?
dpp
158
Ubah String menjadi char [], ganti huruf dengan indeks, lalu ubah array kembali menjadi String.
Cintai solusi ini. Saya akhirnya mengubah baris ke-3 menjadi myNameChars [index] = character.toCharArray () [0]; untuk penyederhanaan. Solusi yang bagus.
Dale
2
terlihat jauh lebih baik daripada yang lebih jelek lainnyamyName.substring(0,4)+'x'+myName.substring(5);
user924
Ini jauh lebih sederhana
Shiva Acharjee
19
Stringadalah kelas yang tidak dapat diubah di java. Metode apa pun yang tampaknya memodifikasinya selalu mengembalikan objek string baru dengan modifikasi.
Jika Anda ingin memanipulasi string, pertimbangkan StringBuilderatau StringBufferjika Anda memerlukan keamanan utas.
Seperti yang dijawab sebelumnya di sini, Stringinstance tidak dapat diubah . StringBufferdan StringBuilderbisa berubah dan cocok untuk tujuan seperti itu apakah Anda perlu aman atau tidak.
Namun ada cara untuk memodifikasi sebuah String tetapi saya tidak akan merekomendasikannya karena itu tidak aman, tidak dapat diandalkan dan dapat dianggap sebagai kecurangan: Anda dapat menggunakan refleksi untuk memodifikasi chararray bagian dalam yang berisi objek String. Refleksi memungkinkan Anda untuk mengakses bidang dan metode yang biasanya disembunyikan dalam lingkup saat ini (metode atau bidang pribadi dari kelas lain ...).
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();}}
Perhatikan bahwa string myNameterjadi di kedua garis, dan di kedua sisi garis kedua.
Oleh karena itu, meskipun string secara teknis tidak dapat diubah, dalam praktiknya, Anda dapat memperlakukannya sebagai dapat diedit dengan menimpa mereka.
Saya belum menurunkan jawaban Anda, tetapi saya harus mengakui bahwa saya memiliki masalah dengan istilah "menimpa" (meskipun saya pikir kami setuju dengan konsep di balik). Objek itu sendiri tetap tidak berubah. Anda hanya membuat referensi variabel Anda objek lain. Ngomong-ngomong, Anda menarik untuk menyebutkan bahwa Anda membuat setidaknya empat instance String dalam contoh Anda.
C.Champagne
0
Hal pertama yang harus saya perhatikan adalah charAtmetode dan memberikan nilai padanya menggunakan tanda sama dengan tidak akan melakukan apa pun. Jika string tidak dapat diubah, charAtmetode, untuk membuat perubahan ke objek string harus menerima argumen yang berisi karakter baru. Sayangnya, string tidak dapat diubah. Untuk memodifikasi string, saya harus menggunakan StringBuilder seperti yang disarankan oleh Mr. Petar Ivanov.
double r = Math.sin(3.14)
? Bagaimana hubungannya dengan pertanyaan ini? Terima kasih.Jawaban:
String tidak dapat diubah di Jawa. Anda tidak dapat mengubahnya.
Anda perlu membuat string baru dengan karakter diganti.
Atau Anda dapat menggunakan StringBuilder:
sumber
replace
metode yang tidak akan mengubah string tetapi hanya akan mengembalikan string baru?Ubah String menjadi char [], ganti huruf dengan indeks, lalu ubah array kembali menjadi String.
sumber
myName.substring(0,4)+'x'+myName.substring(5);
String
adalah kelas yang tidak dapat diubah di java. Metode apa pun yang tampaknya memodifikasinya selalu mengembalikan objek string baru dengan modifikasi.Jika Anda ingin memanipulasi string, pertimbangkan
StringBuilder
atauStringBuffer
jika Anda memerlukan keamanan utas.sumber
Saya setuju dengan Petar Ivanov tetapi yang terbaik adalah jika kita menerapkan dengan cara berikut:
sumber
Seperti yang dijawab sebelumnya di sini,
String
instance tidak dapat diubah .StringBuffer
danStringBuilder
bisa berubah dan cocok untuk tujuan seperti itu apakah Anda perlu aman atau tidak.Namun ada cara untuk memodifikasi sebuah String tetapi saya tidak akan merekomendasikannya karena itu tidak aman, tidak dapat diandalkan dan dapat dianggap sebagai kecurangan: Anda dapat menggunakan refleksi untuk memodifikasi
char
array bagian dalam yang berisi objek String. Refleksi memungkinkan Anda untuk mengakses bidang dan metode yang biasanya disembunyikan dalam lingkup saat ini (metode atau bidang pribadi dari kelas lain ...).sumber
Anda dapat menimpa string, sebagai berikut:
Perhatikan bahwa string
myName
terjadi di kedua garis, dan di kedua sisi garis kedua.Oleh karena itu, meskipun string secara teknis tidak dapat diubah, dalam praktiknya, Anda dapat memperlakukannya sebagai dapat diedit dengan menimpa mereka.
sumber
Hal pertama yang harus saya perhatikan adalah
charAt
metode dan memberikan nilai padanya menggunakan tanda sama dengan tidak akan melakukan apa pun. Jika string tidak dapat diubah,charAt
metode, untuk membuat perubahan ke objek string harus menerima argumen yang berisi karakter baru. Sayangnya, string tidak dapat diubah. Untuk memodifikasi string, saya harus menggunakan StringBuilder seperti yang disarankan oleh Mr. Petar Ivanov.sumber
ini akan berhasil
Output: domaxokz
sumber
myName.replace(myName.charAt(5),'x')
akan memberi Andadxmanxkz
, yang mungkin bukan yang dibutuhkan.