Apa cara paling efisien untuk membuat karakter pertama dari String
huruf kecil?
Saya dapat memikirkan sejumlah cara untuk melakukan ini:
Menggunakan charAt()
dengansubstring()
String input = "SomeInputString";
String output = Character.toLowerCase(input.charAt(0)) +
(input.length() > 1 ? input.substring(1) : "");
Atau menggunakan char
array
String input = "SomeInputString";
char c[] = input.toCharArray();
c[0] = Character.toLowerCase(c[0]);
String output = new String(c);
Saya yakin ada banyak cara hebat lainnya untuk mencapai ini. Apa yang kamu sarankan?
c[0] |= ' ';
Jawaban:
Saya menguji pendekatan yang menjanjikan menggunakan JMH . Kode benchmark lengkap .
Asumsi selama pengujian (untuk menghindari pemeriksaan kasus sudut setiap saat): panjang string input selalu lebih besar dari 1.
Hasil
Skornya adalah operasi per detik, semakin banyak semakin baik.
Tes
test1
adalah pendekatan Andy dan Hllink pertama:test2
adalah pendekatan Andy kedua. Ini jugaIntrospector.decapitalize()
dikemukakan oleh Daniel, tetapi tanpa duaif
pernyataan. Pertamaif
dihapus karena asumsi pengujian. Yang kedua telah dihapus, karena melanggar kebenaran (yaitu, masukan"HI"
akan kembali"HI"
). Ini hampir yang tercepat.test3
adalah modifikasi daritest2
, tetapi alih-alihCharacter.toLowerCase()
, saya menambahkan 32, yang berfungsi dengan benar jika dan hanya jika string ada dalam ASCII. Ini yang tercepat.c[0] |= ' '
dari komentar Mike memberikan penampilan yang sama.test4
bekasStringBuilder
.test5
menggunakan duasubstring()
panggilan.test6
menggunakan refleksi untuk mengubahchar value[]
secara langsung dalam String. Ini yang paling lambat.Kesimpulan
Jika panjang String selalu lebih besar dari 0, gunakan
test2
.Jika tidak, kami harus memeriksa kasus sudut:
Jika Anda yakin bahwa teks Anda akan selalu dalam ASCII dan Anda mencari kinerja ekstrim karena Anda menemukan kode ini di kemacetan, gunakan
test3
.sumber
Saya menemukan alternatif yang bagus jika Anda tidak ingin menggunakan perpustakaan pihak ketiga:
sumber
Untuk manipulasi string, lihat Jakarta Commons Lang StringUtils .
sumber
Jika Anda ingin menggunakan Apache Commons, Anda dapat melakukan hal berikut:
Hasil: someString
sumber
compile group: 'org.apache.commons', name: 'commons-text', version: '1.2'
Meskipun pendekatan berorientasi char saya akan menyarankan solusi berorientasi String. String.toLowerCase spesifik untuk Lokal, jadi saya akan mempertimbangkan masalah ini.
String.toLowerCase
adalah memilih huruf kecil menurut Character.toLowerCase . Juga solusi berorientasi karakter tidak kompatibel penuh unicode, karena Character.toLowerCase tidak dapat menangani karakter tambahan.UPDATE: Sebagai contoh betapa pentingnya pengaturan lokal mari kita huruf kecil
I
dalam bahasa Turki dan Jerman:akan menampilkan dua hasil berbeda:
sumber
String di Java tidak dapat diubah, jadi string baru akan dibuat.
Contoh pertama Anda mungkin akan sedikit lebih efisien karena hanya perlu membuat string baru dan bukan array karakter sementara.
sumber
Metode statis yang sangat singkat dan sederhana untuk mengarsipkan apa yang Anda inginkan:
sumber
Jika yang Anda butuhkan sangat sederhana (mis. Nama kelas java, tanpa bahasa lokal), Anda juga dapat menggunakan kelas CaseFormat di pustaka Google Guava .
Atau Anda dapat menyiapkan dan menggunakan kembali objek konverter, yang bisa lebih efisien.
Untuk lebih memahami filosofi manipulasi string Google Guava, lihat halaman wiki ini .
sumber
sumber
Saya telah menemukan ini hanya hari ini. Mencoba melakukannya sendiri dengan cara paling pejalan kaki. Itu butuh satu baris, terlalu gondrong. Ini dia
Memberikan:
Sebelum str = TaxoRanks
Setelah str = taxoRanks
sumber
Hasil:
sumber