Saya sedang mengerjakan proyek di mana semua konversi dari int
ke String
dilakukan seperti ini:
int i = 5;
String strI = "" + i;
Saya tidak terbiasa dengan Java.
Apakah ini latihan yang biasa atau ada yang salah, seperti yang saya duga?
java
string
type-conversion
Denis Palnitsky
sumber
sumber
Integer.valueOf(i).toString()
. Dia pasti menyukai benda. Meskipun sangat jelas menyatakan niatnya, itu agak lama untuk seleraku.Jawaban:
Cara normal adalah
Integer.toString(i)
atauString.valueOf(i)
.Rangkaian akan bekerja, tetapi tidak konvensional dan bisa menjadi bau yang buruk karena menunjukkan penulis tidak tahu tentang dua metode di atas (apa lagi yang mungkin mereka tidak tahu?).
Java memiliki dukungan khusus untuk operator + ketika digunakan dengan string (lihat dokumentasi ) yang menerjemahkan kode yang Anda kirim ke:
pada waktu kompilasi. Ini sedikit kurang efisien (
sb.append()
akhirnya memanggilInteger.getChars()
, yang memangInteger.toString()
akan dilakukan), tetapi berhasil.Untuk menjawab komentar Grodriguez: ** Tidak, kompiler tidak mengoptimalkan string kosong dalam kasus ini - lihat:
Menginisialisasi StringBuilder:
Tambahkan string kosong:
Tambahkan bilangan bulat:
Ekstrak string terakhir:
Ada proposal dan pekerjaan berkelanjutan untuk mengubah perilaku ini, ditargetkan untuk JDK 9.
sumber
"" + 5
menjadi"5"
)."" + 5
bukan hanya"5"
?"" + integer
Pendekatan yang digunakan dalam salah satu tutorial oracle resmi .Itu bisa diterima, tetapi saya tidak pernah menulis hal seperti itu. Saya lebih suka ini:
sumber
NumberFormatter
. Anda dapat menggunakan format sepertiNumberFormat.getInstance(Locale.FRENCH)
.Itu bukan cara yang baik.
Saat melakukan konversi dari int ke string, ini harus digunakan:
sumber
int i
bisa kotak keInteger
sebelum ditambahkan keString strI
?StringBuilder.append(int)
(danStringBuilder
memilikiappend
metode untuk semua tipe primitif).Ini bukan hanya optimasi 1 . Saya tidak suka
karena tidak mengungkapkan apa yang ingin saya lakukan 2 .
Saya tidak ingin menambahkan integer ke string (kosong). Saya ingin mengonversi integer ke string:
Atau, bukan pilihan saya, tetapi masih lebih baik daripada penggabungan, dapatkan representasi string dari objek (integer):
1. Untuk kode yang disebut sangat sering, seperti dalam loop, optimisasi tentu juga merupakan titik untuk tidak menggunakan penggabungan .
2. ini tidak berlaku untuk penggunaan rangkaian nyata seperti dalam
System.out.println("Index: " + i);
atauString id = "ID" + i;
sumber
Banyak mata kuliah pengantar Universitas tampaknya mengajarkan gaya ini, karena dua alasan (menurut pengalaman saya):
Itu tidak membutuhkan pemahaman tentang kelas atau metode. Biasanya, ini diajarkan jauh sebelum kata "kelas" pernah disebutkan - atau bahkan metode panggilan. Jadi menggunakan sesuatu seperti
String.valueOf(…)
akan membingungkan siswa.Ini adalah sebuah ilustrasi dari “operator overloading” - pada kenyataannya, ini dijual kepada kita sebagai para operator yang kelebihan beban idiomatik (heran kecil di sini, karena Jawa tidak memungkinkan operator overloading kustom).
Jadi itu bisa lahir dari kebutuhan didaktik (walaupun saya berpendapat bahwa ini hanya pengajaran yang buruk) atau digunakan untuk menggambarkan sebuah prinsip yang sebaliknya cukup sulit untuk ditunjukkan di Jawa.
sumber
Ekspresi
mengarah ke string konversi dari
i
saat runtime. Jenis keseluruhan ekspresi adalahString
.i
pertama kali dikonversi keInteger
objek (new Integer(i)
), kemudianString.valueOf(Object obj)
dipanggil. Jadi itu setara denganJelas, ini sedikit kurang berkinerja daripada hanya menelepon
String.valueOf(new Integer(i))
yang akan menghasilkan hasil yang sama.Keuntungan dari
""+i
mengetik adalah lebih mudah / lebih cepat dan beberapa orang mungkin berpikir, bahwa itu lebih mudah dibaca. Ini bukan bau kode karena tidak menunjukkan masalah yang lebih dalam.(Referensi: JLS 15.8.1 )
sumber
String.valueOf
tinju yang diperlukani
(tidak, karena ada kelebihan yang menerimaint
), itu tidak akan digunakannew Integer(i)
, itu akan digunakanInteger.valueOf(i)
. Tapi itu benar-benar tidak melakukan semua ini. Yanew StringBuilder().append("").append(i).toString()
, seperti yang dicatat oleh SimonJ. StringBuilder memiliki logikanya sendiri untuk mengubah int primitifi
menjadi sebuah String.Secara pribadi, saya tidak melihat hal buruk dalam kode ini.
Ini cukup berguna ketika Anda ingin mencatat nilai int, dan logger hanya menerima sebuah string. Saya akan mengatakan konversi seperti itu nyaman ketika Anda perlu memanggil metode menerima String, tetapi Anda memiliki nilai int.
Adapun pilihan antara
Integer.toString
atauString.valueOf
, itu semua masalah selera.... Dan secara internal,
String.valueOf
panggilanInteger.toString
metode dengan cara. :)sumber
Cara lain yang saya sadari adalah dari
Integer
kelas:Contoh nyata (meskipun saya tidak berpikir Anda membutuhkan):
Ini juga berfungsi untuk jenis primitif lainnya, misalnya
Double.toString
.Lihat di sini untuk detail lebih lanjut.
sumber
Teknik ini diajarkan di pengantar tingkat sarjana ke Jawa yang saya ikuti lebih dari satu dekade yang lalu. Namun, saya harus mencatat bahwa, IIRC, kami belum sampai ke metode kelas String dan Integer.
Tekniknya sederhana dan cepat untuk mengetik. Jika semua yang saya lakukan adalah mencetak sesuatu, saya akan menggunakannya (misalnya
System.out.println("" + i);
,. Namun, saya pikir itu bukan cara terbaik untuk melakukan konversi, karena perlu berpikir sejenak untuk menyadari apa yang terjadi ketika sedang digunakan dengan cara ini.Juga, jika kinerja menjadi perhatian, tampaknya lebih lambat (lebih banyak di bawah, dan juga dalam jawaban lain).Secara pribadi, saya lebih suka Integer.toString (), karena sudah jelas apa yang terjadi. String.valueOf () akan menjadi pilihan kedua saya, karena tampaknya membingungkan (saksikan komentar setelah jawaban darioo).
Hanya untuk nyengir :) Saya menulis kelas untuk menguji tiga teknik: "" + i, Integer.toString, dan String.ValueOf. Setiap tes baru saja mengkonversi int dari 1 ke 10.000 ke Strings. Saya kemudian menjalankan masing-masing melalui perintah waktu Linux lima kali. Integer.toString () sedikit lebih cepat dari String.valueOf () sekali, mereka terikat tiga kali, dan String.valueOf () lebih cepat sekali; Namun, perbedaannya tidak lebih dari beberapa milidetik.
Teknik "" + i lebih lambat dari keduanya pada setiap tes kecuali satu, ketika itu 1 milidetik lebih cepat dari Integer.toString () dan 1 milidetik lebih lambat dari String.valueOf () (jelas pada tes yang sama di mana String.valueOf () lebih cepat dari Integer.toString ()). Meskipun biasanya hanya beberapa milidetik lebih lambat, ada satu tes di mana itu sekitar 50 milidetik lebih lambat. YMMV .
sumber
Ada berbagai cara mengonversi ke Strings:
sumber
Itu tergantung pada bagaimana Anda ingin menggunakan String Anda. Ini dapat membantu:
sumber
Kebanyakan ditto pada SimonJ. Saya sangat tidak suka idiom + "" saya. Jika Anda mengatakan String.valueOf (i), Java mengubah integer menjadi string dan mengembalikan hasilnya. Jika Anda mengatakan "" + i, Java membuat objek StringBuilder, menambahkan string kosong ke dalamnya, mengubah integer menjadi string, menambahkan ini ke StringBuilder, lalu mengonversi StringBuilder ke String. Itu banyak langkah ekstra. Saya kira jika Anda melakukannya sekali dalam program besar, itu bukan masalah besar. Tetapi jika Anda melakukan ini sepanjang waktu, Anda membuat komputer melakukan banyak pekerjaan tambahan dan membuat semua objek tambahan ini yang kemudian harus dibersihkan. Saya tidak ingin menjadi fanatik tentang optimasi mikro, tetapi saya tidak ingin sia-sia sia-sia juga.
sumber
Kedua cara itu benar.
sumber
Ada banyak cara untuk mengonversi bilangan bulat menjadi string:
1)
2)
3)
4)
sumber
Ada tiga cara konversi ke Strings
String string = "" + i;
String string = String.valueOf(i);
String string = Integer.toString(i);
sumber
String.format("%d", i)
.Menggunakan "" + i adalah cara terpendek dan termudah untuk mengubah angka menjadi string. Ini bukan yang paling efisien, tetapi itu adalah IMHO paling jelas dan itu biasanya lebih penting. Semakin sederhana kodenya, semakin kecil kemungkinan Anda melakukan kesalahan.
sumber
""+i
Secara pribadi saya berpikir bahwa "" + saya memang terlihat sebagai poster pertanyaan asli menyatakan "bau". Saya telah menggunakan banyak bahasa OO selain Java. Jika sintaks itu dimaksudkan tepat maka Java hanya akan menginterpretasikan saya sendiri tanpa membutuhkan "" yang diinginkan untuk dikonversi ke string dan melakukannya karena tipe tujuan tidak ambigu dan hanya satu nilai tunggal akan diberikan di sebelah kanan. . Yang lain tampak seperti 'trik' untuk mengelabui kompiler, mojo buruk ketika versi Javac berbeda yang dibuat oleh produsen lain atau dari platform lain dipertimbangkan jika kode perlu porting. Heck untuk uang saya itu harus seperti banyak OOL lainnya saja ambil Typecast: (String) I. mengedipkan mata
Mengingat cara saya belajar dan untuk kemudahan memahami konstruksi seperti itu ketika membaca kode orang lain dengan cepat saya memilih metode Integer.toString (i). Melupakan satu atau dua dalam bagaimana Java mengimplementasikan hal-hal di latar belakang vs. String.valueOf (i) metode ini terasa benar bagi saya dan mengatakan dengan tepat apa yang terjadi: Saya memiliki dan Integer dan saya berharap itu dikonversi menjadi String.
Poin bagus yang dibuat beberapa kali mungkin hanya menggunakan StringBuilder di muka adalah jawaban yang baik untuk membangun String yang dicampur teks dan int atau objek lain karena itu yang akan digunakan di latar belakang, kan?
Hanya dua sen saya dilemparkan ke kucing jawaban yang sudah dibayar dari jawaban untuk pertanyaan Mans ... tersenyum
EDIT KE JAWABAN SAYA SENDIRI SETELAH BEBERAPA PERUBAHAN
Ok, Ok, saya memikirkan ini lagi dan String.valueOf (i) juga sangat bagus, katanya: Saya ingin sebuah String yang mewakili nilai Integer. lol, Bahasa Inggris jauh lebih sulit diurai daripada Jawa! Tapi, saya meninggalkan sisa jawaban / komentar saya ... Saya selalu diajarkan untuk menggunakan level terendah dari metode / fungsi rantai jika memungkinkan dan masih mempertahankan keterbacaan jadi jika String.valueOf memanggil Integer.toString lalu Mengapa menggunakan oranye utuh jika Anda hanya akan mengupasnya, Hmmm?
Untuk mengklarifikasi komentar saya tentang StringBuilder, saya membangun banyak string dengan kombo yang sebagian besar teks dan int literal dan mereka akhirnya menjadi panjang dan jelek dengan panggilan ke rutinitas yang disebutkan di atas tertanam di antara +, jadi menurut saya jika itu menjadi SB objek anyways dan metode append memiliki kelebihan mungkin lebih bersih untuk terus maju dan menggunakannya ... Jadi saya kira saya hingga 5 sen yang satu ini sekarang, eh? lol ...
sumber
menggunakan
Integer.toString(tmpInt).trim();
sumber
trim()
akan ada gunanya di sini.Coba tipecast sederhana
sumber
char c = (char) (i + 48);