2009-07-24 4 views
119

私は最大100万桁の整数のために回文を見つける必要があるSphere Online Judge(SPOJ)の問題The Next Palindromeを試しています。私は文字列を逆転させるためにJavaの関数を使うことを考えましたが、これはStringの長さを許すでしょうか?Java Stringにはいくつの文字を含めることができますか?

+0

あなたは、あなたが指定したサイズで、最大100万文字までの長さの回文を生成する関数を書く必要があると言っていますか? – Robert

+3

*問題*(SPOJから)に100ギガバイトのファイルが含まれていて、一度に文字列にロードするのが好きですか?真剣に...スキャナを使用してください! –

+0

可能な重複[Javaで文字列の最大長 - 長さ()メソッドの呼び出し](https://stackoverflow.com/questions/816142/strings-maximum-length-in-java-calling-length-method) – Bergi

答えて

175

- あなたの(いつも2147483647(2 Java仕様、Stringクラスは、内部ストレージのために使用する配列の最大サイズにより、1))またはハーフ最大ヒープサイズ(各文字は2バイトなので)のいずれか小さい方。

+31

...または最大ヒープサイズを2で割った...文字は2バイトです – ChssPly76

+2

@ ChssPly76:はい、正しいです。私は私の答えを編集しました、ありがとう。 –

+2

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

16

私は、彼らが内部配列によって保持され、そして配列は、Javaの整数でインデックス化されるよう、彼らは、最大2^31-1文字にすることができると信じて。

あなたは長さ Integer.MAX_VALUEの文字列を取得することができるはず
+0

内部実装無関係です。文字データをlong型の配列に格納できない理由はありません。問題は、インターフェイスがintを長さに使用することです。 'getBytes'などは、非常に大きな文字列を入力しようとすると問題が発生することがあります。 –

+0

それは本当です - 私はその事実を暗示していました。私の悪い。 – aperkins

3

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

5

あなたの番号を保持するためにBigDecimal代わりStringの使用を検討しています?

+1

これは、アプリケーションが数字を使って何をするかによって異なります。回文を見つけたり、(10進)桁を数えたりといった文字列の処理を行う場合は、文字列を使用する方が良いでしょう。算術演算を行う場合、BigDecimal(またはBigInteger)が優れています。 –

+0

問題は「各Kに対して、Kよりも大きな最小の回文を出力します。 (Kは与えられた数です)。例:999999999999より大きい次のパリンドローム、または12922より大きい次のパリンドロームを見つけます。 –

0

ヒープ部分が悪化し、私の友人。 UTF-16は、16ビットに制限されることを保証するものではありません、あなたは、Googleのアプリケーションエンジンを使用する場合は、com.google.appengine.api.datastore.Textは助けることができる32

+1

Javaの 'char'型は例外です16ビットを正確に使用するので、UTF-16のビット数は実際には問題になりません。 – awksp

-3

に拡張することができます。 1つの文字列に最大1メガバイトを格納できます。あなたは文字Integer.MAX_VALUEで理論的には、JVMは、それが使用できる配列のサイズに制限されていますが

+9

文字列はすでに2GBまで格納できるため、1MBまで格納できるクラスはここでは役に立ちません。 –

+1

これを詳しく説明したWebページへのリンクを含めると答えが広がります –

10

オラクルのJava 8更新に
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); 
     } 
    } 
} 

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 

:ジャワ9において、文字列が使用するマルチバイト文字が複数のバイトを使用して減少させることを意味するバイト[]さらに最大。 4バイトのコードポイントがすべてある場合絵文字、あなただけの約500万字

+1

Javaコンパックの[Compact Strings](http://openjdk.java.net/jeps/254)は、 Latin-1またはUTF-16エンコーディング可変長符号化はありません。つまり、3バイト文字はありません。 – apangin

+0

@apangin「UTF-8などの代替エンコーディングを使用することは目標ではありません」という訂正をお願いします。 –

1

Java9がString.valueを保存するために[]バイトを使用していますので、あなただけJava9で1ギガバイトの文字列について取得することができます取得します。一方、Java8は2GBの文字列を持つことができます。私は「文字」の意味の文字で

、一部の文字は、それがより多くの(現在は2)文字がかかりますので、(絵文字の一部のように)BMPで表現ではありません。

関連する問題