2011-06-02 15 views
7

説明がcharと表示されたときに、なぜindexOfメソッドのパラメータがintであるのだろうと思います。string.indexOfメソッドのパラメータがJavaのintである理由

公共int型のindexOf(int型CH)

Returns the index within this string of the first occurrence of the specified **character** 

http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html#indexOf%28int%29

Also, both of these compiles fine: 
char c = 'p'; 
str.indexOf(2147483647); 
str.indexOf(c); 

]基本的に、私は混乱していますが、ユニコード文字が16ビットである一方で、Javaのintは、32ビットです。

b] intを使用するのではなく、文字自体を使用しないでください。これはパフォーマンスの最適化ですか? charよりintを表現するのは難しいですか?どうやって ?

これは簡単な推論だと思っています。それで私はそれについてもっと知りました!

ありがとうございます!

答えて

12

リアの理由は、indexOf(int)は、16ビットのUTF-16文字ではなく、Unicodeコードポイントが必要であるということです。 Unicodeコードポイントは実際には最大21ビットの長さです。 DBFF へD800 、およびDC00 ;

(長いコードポイントのUTF-16表現は、実際に2 16ビットの "文字" の値であるこれらの値は、サロゲートを先頭と末尾として知られています。 DFFF にそれぞれ、血みどろの詳細についてはUnicode FAQ - UTF-8, UTF-16, UTF-32 & BOMを参照)

を使用すると、コードにポイント> 65535をindexOf(int)与える場合は、コードポイントをエンコードUTF-16文字のペアを検索します。

これのJavadocによって規定(いえない非常に明確)、およびコードの検査では、このメソッドの実装方法確かであることを示しています。


理由だけではなく、16ビット文字を使わないのでしょうか?かなり明白だ

。彼らがそうした場合、文字列で65535を超えるコードポイントを見つける簡単な方法はありません。テキストがそのようなコードポイントを含む可能性のある国際化されたアプリケーションを開発する人にとっては、それは大きな不便です。 (おそらくそれは問題ではありませんが、時にはそれがあります。)

しかし、それはあなたに何も影響を与えるべきではありません。文字列が16ビットコードのみで構成されている場合、またはASCIIコードのみで構成されている場合でも、このメソッドは機能します。

+0

答えはThnxです。さて、私はindexOf(int)がUnicodeコードポイントを期待しているのを見て、私の他の質問は..それはなぜですか? 。なぜ16ビット文字を使用しないのですか? – codeObserver

+1

ユニコードのcharecterは実際には22ビットであり、16ではないので、java charには格納できない 'chars/letters'(コードポイント)があります。これは、Java文字列が2つの文字を使用して1つの 'コードポイント/文字'を格納する理由です(実際に知りたい場合は、utf-16の代理ペアを参照してください)。 – MTilsted

3

Javaの文字は、Unicodeの整数表現で格納されます。 Characterクラスのドキュメントには、この形式の詳細があります。そのページのドキュメントから

int型の値のサポートに補助文字を含むすべてのUnicode文字を、受け入れる方法。たとえば、Character.isLetter(0x2F81A)は、コードポイント値が文字(CJKの表意文字)を表すため、trueを返します。

+0

のthnx。 DOCから2文: INTの(最下位の)下位21ビットは、Unicodeコードポイントを表すために使用され、(最も重要な)上位11ビットはゼロでなければなりません。したがって、固定幅16ビットエンティティとして文字を定義 Unicode仕様、 Unicodeは16ビットである場合、なぜそれらを表現するために21ビットを使用しますか? – codeObserver

+0

はい、しかし、文字列はUTF-8としてエンコードされた表紙の下のバイト[]です。標準文字(0-255)は、1バイトのみを占有します(2バイトではなく、全角文字が占有します)。 255を超える文字は複数のバイトをとり、時には2バイトを超えます。それは、P1のUnicode @ – Bohemian

+0

ためのindexOf()検索は非常に長い時間のために16ビットされていないものです - エンコードされた文字は、整数(32ビット)相当しています。 Unicode 2.0は16ビットの制限を取り除きましたが、これは5年前です(私は古いと感じています)。技術的には、ISO-10646は31ビットのアドレス空間であり、Unicodeは理論上そのいずれかを表すことができます。実際には、UTF-16は21ビットに制限されており、Unicodeはこれらの21ビットのみをサポートすることに事実上尽力しています。 ISO-10646がUTF-16を壊すような方法でUnicodeとの同期が外れることはほとんどありえないので、21ビットは事実上ハードコーディングされた制限です。 – Cowan

0

str.indexOf(int)はintをとります。 charを渡した場合、charは16ビットの数値なので、charintにキャストします。

+0

はい、しかしintはjavaの32ビットであり、それは私を混乱させる!! – codeObserver

+1

@ p1の場合、コードポイントは32ビットで、それが検索対象となります。 –

0

Javaは、ボンネットの下で実行されている暗黙の型キャストの規則を全面的に持っています。プリミティブについては、特別な規則があります。これらの規則はすべて、SunのJavaドキュメントの一部であるConversions and Promotions文書に記載されています。あなたの特定の質問のために、intのcharへの変換は「狭いプリミティブ変換」です。上記のドキュメントのセクション5.1.3を参照してください。

言われているように、小さな正の整数と整数を符号化した文字を交換するのは一般的なプログラミングです。これは、ASCIIがすべて存在していたときに、Cでの使用を区別できない使い方に戻ります。

関連する問題