百万桁までの整数の回文を検索する必要がある、Sphere Online Judge(SPOJ)のThe Next Palindrome問題を試しています。文字列を逆にするためにJavaの関数を使用することを考えましたが、文字列をこれだけ長くすることはできますか?
百万桁までの整数の回文を検索する必要がある、Sphere Online Judge(SPOJ)のThe Next Palindrome問題を試しています。文字列を逆にするためにJavaの関数を使用することを考えましたが、文字列をこれだけ長くすることはできますか?
回答:
長さの文字列を取得できるはずです
Integer.MAX_VALUE
常に2,147,483,647(2 31 - 1)
(Java仕様、アレイの最大サイズ、内部ストレージの文字列クラス用途によって定義される)
OR
Half your maximum heap size
(各文字は2バイトであるため)どちらか小さい方。
それらは内部配列によって保持され、配列はJavaの整数によってインデックスが付けられるため、最大2 ^ 31-1文字になると思います。
getBytes
非常に大きな文字列を使用しようとすると、同様の問題が発生する場合があります。
理論的にはInteger.MAX_VALUE文字を使用できますが、JVMは使用できる配列のサイズに制限があります。
public static void main(String... args) {
for (int i = 0; i < 4; i++) {
int len = Integer.MAX_VALUE - i;
try {
char[] ch = new char[len];
System.out.println("len: " + len + " OK");
} catch (Error e) {
System.out.println("len: " + len + " " + e);
}
}
}
Oracle Java 8 update 92での印刷
len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483645 OK
len: 2147483644 OK
注:Java 9では、文字列はbyte []を使用します。これは、マルチバイト文字が複数のバイトを使用し、最大値をさらに減らすことを意味します。絵文字など、4バイトのコードポイントがすべてある場合は、約5億文字しか取得できません
のBigDecimal
代わりにString
を使用することを検討しましたか?
Java9はbyte。]を使用してString.valueを格納するため、Java9では約1GBの文字列しか取得できません。一方、Java8は2GBの文字列を持つことができます。
文字とは「char」を意味します。一部の文字は(一部の絵文字のように)BMPで表現できないため、より多く(現在は2)の文字が必要になります。