Saya mencoba masalah The Next Palindrome dari Sphere Online Judge (SPOJ) di mana saya perlu menemukan palindrome untuk bilangan bulat hingga satu juta digit. Saya berpikir tentang menggunakan fungsi Java untuk membalikkan Strings, tetapi apakah mereka mengizinkan String menjadi selama ini?
157
Jawaban:
Anda harus bisa mendapatkan String of length
Integer.MAX_VALUE
selalu 2.147.483.647 (2 31 - 1)(Didefinisikan oleh spesifikasi Java, ukuran maksimum array, yang digunakan kelas String untuk penyimpanan internal)
ATAU
Half your maximum heap size
(karena setiap karakter adalah dua byte) yang lebih kecil .sumber
Saya percaya mereka bisa sampai 2 ^ 31-1 karakter, karena mereka dipegang oleh array internal, dan array diindeks oleh bilangan bulat di Jawa.
sumber
getBytes
dan yang serupa mungkin memiliki masalah jika Anda mencoba untuk string yang sangat besar.Meskipun Anda bisa dalam teori Integer.MAX_VALUE karakter, JVM terbatas dalam ukuran array yang dapat digunakan.
pada Oracle Java 8 perbarui 92 cetakan
Catatan: di Java 9, Strings akan menggunakan byte [] yang berarti bahwa karakter multi-byte akan menggunakan lebih dari satu byte dan mengurangi maksimum lebih lanjut. Jika Anda memiliki keempat titik kode byte misalnya emoji, Anda hanya akan mendapatkan sekitar 500 juta karakter
sumber
Sudahkah Anda mempertimbangkan untuk menggunakan
BigDecimal
alih-alihString
memegang nomor Anda?sumber
Integer.MAX_VALUE adalah ukuran maksimum string + tergantung dari ukuran memori Anda, tetapi Masalah pada sphere online menilai Anda tidak harus menggunakan fungsi-fungsi tersebut
sumber
Java9 menggunakan byte [] untuk menyimpan String.value, jadi Anda hanya bisa mendapatkan sekitar 1GB Strings di Java9. Java8 di sisi lain dapat memiliki 2GB Strings.
Dengan karakter yang saya maksud "char", beberapa karakter tidak dapat diwakili dalam BMP (seperti beberapa emoji), sehingga akan membutuhkan lebih banyak (saat ini 2) karakter.
sumber
Bagian tumpukan semakin parah, teman-teman saya. UTF-16 tidak dijamin terbatas pada 16 bit dan dapat diperluas hingga 32 bit
sumber
char
tipe Java sebenarnya 16 bit, jadi jumlah bit yang digunakan UTF-16 tidak terlalu masalah ...