3

Java で CodeChef の問題を解決しようとしていますが、長さが 100 万文字を超える文字列を作成できないことがわかりました (少なくとも私のコンパイラでは)。Pi の最初の 100 万桁の文字列 (たとえば、String PI = "3.1415926535...151") を Java ファイルに貼り付けたところ、コンパイルに失敗しました。Pi を取り出して "dog" のような短い文字列に置き換えると、コードがコンパイルされます。これが実際にJavaの制限であるかどうかを確認できますか?

ありがとう。

4

2 に答える 2

15

これが実際にJavaの制限であるかどうかを確認できますか?

はい。文字列リテラル1の長さには 65535 の制限があります。JLS には記載されていませんが、クラス ファイルの構造によって暗示されています。JVM Spec 4.4.7を参照してください。文字列の長さフィールドは 'u2' であることに注意してください。これは 16 ビットの符号なし整数を意味します。

String オブジェクトには最大 2^31 - 1 文字を含めることができることに注意してください。2^16 -1 の制限は文字列リテラル用です。たとえば、Java プログラムのソース コードに埋め込まれた文字列定数です。

1 - この制限は、実際には文字列の (変更された) UTF-8 表現のバイト数にあります。文字列が 0x01 から 0x7f の範囲の文字で構成されている場合、各バイトは 1 文字を表します。それ以外の場合、文字には最大 6 バイトが必要になる場合があります。


Pi の最初の 100 万桁を表す文字列が必要な場合は、ファイル システム内のファイルまたはクラスパス上のリソースから文字を読み取ることをお勧めします。

于 2013-08-21T15:14:44.747 に答える
-1

この問題は文字列リテラルではなく、メソッド サイズに関連していると思います: http://chrononsystems.com/blog/method-size-limit-in-java。それによると、メソッドのサイズは 64k を超えることはできません。

于 2013-08-21T15:26:53.387 に答える