Java Stringはいくつの文字を持つことができますか?


157

百万桁までの整数の回文を検索する必要がある、Sphere Online Judge(SPOJ)のThe Next Palindrome問題を試しています。文字列を逆にするためにJavaの関数を使用することを考えましたが、文字列をこれだけ長くすることはできますか?


パリンドロームを生成する関数を作成する必要があると言っていますか?そのサイズはユーザー指定で、長さは最大100万文字です。
ロバート

3
問題(SPOJからは)100Gigabyteファイルを含んでいてもよく、一度に文字列にそれをロードしますか?マジで...スキャナーを使ってください!
グリム

回答:


242

長さの文字列を取得できるはずです

  1. Integer.MAX_VALUE常に2,147,483,647(2 31 - 1)
    (Java仕様、アレイの最大サイズ、内部ストレージの文字列クラス用途によって定義される)
    OR

  2. Half your maximum heap size(各文字は2バイトであるため)どちらか小さい方


43
...またはあなたの最大ヒープサイズは2で割った...文字は2バイトであるため、
ChssPly76

2
@ ChssPly76:はい、そうです。回答を編集しました、ありがとうございます。
リザードを請求する

2
最大ヒープサイズを確認するにはどうすればよいですか?また、裁判官が私の問題をテストするために使用しているJava仮想マシンが、JVM依存の仕様のInteger.MAX_VALUE部分であるかどうかもわかりません。
andandandand 2009

6
Integer.MAX_VALUEは常に 2147483647(2 ^ 31-1)であり、これはJava仕様の一部です。
cd1 2009

4
64ビットJVMを想定すると、その長さの文字列を格納するには8 GBの仮想メモリが必要になるためです。
Robert Fraser、

21

それらは内部配列によって保持され、配列はJavaの整数によってインデックスが付けられるため、最大2 ^ 31-1文字になると思います。


内部実装は無関係です。たとえば、文字データをlongの配列に格納できなかった理由はありません。問題は、インターフェイスがintを長さに使用していることです。getBytes非常に大きな文字列を使用しようとすると、同様の問題が発生する場合があります。
トム・ホーティン-タックライン2009

それは本当です-私はその事実を暗示していました。私の悪い。
アパーキンス2009

15

理論的には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億文字しか取得できません


2
Java 9のコンパクト文字列は、Latin-1またはUTF-16エンコーディングを使用します。可変長エンコーディング、つまり3バイト文字はありません。
apangin 16

@apangin「UTF-8などの代替エンコーディングを使用することは目的ではありません」修正ありがとうございます。
Peter Lawrey、2016

5

BigDecimal代わりにStringを使用することを検討しましたか?


1
これは、アプリケーションが数値をどう処理するかによって異なります。パリンドロームの検索、桁数(10進)のカウントなど、テキストで行う場合は、文字列の方が適しています。演算を行う場合は、BigDecimal(またはBigInteger)の方が適しています。
スティーブンC

問題は、「各Kについて、Kより大きい最小のパリンドロームを出力すること」です。(Kは与えられた数です)。Kより小さい最初の回文を出力するのは簡単です。Kより大きいものを見つけるには算術が必要です。例:999999999999より大きい次の回文、または12922より大きい次の回文を見つけます。
ThorbjørnRavn Andersen

4

Integer.MAX_VALUEは文字列の最大サイズ+メモリサイズに依存しますが、球のオンライン裁判官の問題では、これらの関数を使用する必要はありません


3

Java9はbyte。]を使用してString.valueを格納するため、Java9では約1GBの文字列しか取得できません。一方、Java8は2GBの文字列を持つことができます。

文字とは「char」を意味します。一部の文字は(一部の絵文字のように)BMPで表現できないため、より多く(現在は2)の文字が必要になります。


4
Java-9のリファレンスを添付して、文字列のサイズを2 GBから1 GBに制限できますか
Aditya Gupta

-1

ヒープの部分はさらに悪化します、私の友人たち。UTF-16は16ビットに制限されるとは保証されておらず、32に拡張できます


2
Javaのchar型が正確に16ビットであることを除いて、UTF-16が使用するビット数はそれほど重要ではありません...
awksp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.