2011-06-02 88 views
7

我想知道爲什麼參數indexOf方法一個int,當描述說char時。爲什麼參數string.indexOf方法是一個int在Java

公衆詮釋的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); 

一]基本上,我感到困惑的是int類型的Java是32位,而Unicode字符爲16位。

b]爲什麼不使用字符本身而不是使用int。這是任何性能優化?難以表達的字符比int更難嗎?怎麼樣 ?

我認爲這應該是簡單的推理,這讓我更瞭解它!

謝謝!

回答

12

real原因是indexOf(int)需要一個Unicode代碼點,而不是一個16位的UTF-16「字符」。 Unicode代碼點實際上長達21位。

(更長的碼點的UTF-16表示實際上是2個16位 「字符」 的值,這些值被稱爲前導和尾隨替代物; D800 到DBFF ,和DC00 到DFFF 分別;參見Unicode FAQ - UTF-8, UTF-16, UTF-32 & BOM爲山的詳細信息)

如果給indexOf(int)代碼點> 65535它將搜索的編碼碼點UTF-16字符

這是由javadoc(儘管不是很清楚)所述,並且對代碼的檢查表明這實際上是如何實現該方法的。


爲什麼不直接使用16位字符?

這很明顯。如果他們這樣做了,那麼在Strings中找不到大於65535的代碼點是一種簡單的方法。對於開發國際化應用程序的人來說,這可能是一個很大的不便之處,因爲在這些應用程序中,文本可能包含這些代碼點(很多據稱是國際化的應用程序都會錯誤地假設char代表一個代碼點,通常這並不重要,但有時它確實如此)。

但它對您沒有任何影響。如果你的字符串只包含16位代碼......或者只有ASCII代碼,該方法仍然可以工作。

+0

Thnx爲答案。好吧,所以現在我看到indexOf(int)需要一個Unicode代碼點,我的另一個問題是......爲什麼是這樣? 。爲什麼不使用16位字符? – codeObserver 2011-06-03 04:41:24

+1

因爲一個unicode結構實際上是22位,而不是16.所以有'字符/字母'(代碼點)不能存儲在一個Java字符。這就是爲什麼一個Java字符串可能使用2個字符來存儲一個'codepoint/letter'(如果你真的想知道的話,請參見utf-16代理對)。 – MTilsted 2014-07-16 13:56:56

3

Java中的字符以unicode整數表示形式存儲。 Character類文檔有關於此格式的更多詳細信息。

從該網頁上的文檔:

接受一個int值支持所有Unicode字符,包括增補字符的方法。例如,Character.isLetter(0x2F81A)返回true,因爲代碼點值代表一個字母(CJK表意文字)。

+0

Thnx。來自文檔的2條語句: int的低位(最低位)21位用於表示Unicode碼位,而高位(最高位)的11位必須爲零。 Unicode規範,它將字符定義爲固定寬度的16位實體 因此,如果unicode是16位,爲什麼使用21位來表示它們呢? – codeObserver 2011-06-02 04:14:09

+0

是的,但字符串在封面下是byte [],編碼爲UTF-8。標準字符(0-255)僅佔用一個字節(不是佔用全寬字符的兩個字節)。超過255個字符需要多個字節,有時超過2個字節。編碼字符具有相等的整數(32位) - 這就是indexOf()搜索的 – Bohemian 2011-06-02 04:16:41

+0

@ p1很長一段時間,Unicode並非16位。 Unicode 2.0刪除了16位的限制,那是十多年前的FIFTEEN(我感覺很老舊)。從技術上講,ISO-10646是一個31位地址空間,理論上Unicode可以代表任何一種。實際上,UTF-16限制在21位,而Unicode已經有效地承諾只支持這21位。 ISO-10646很可能不會被允許與UTF-16不同步,因此21位現在已經成爲一種硬編碼限制。 – Cowan 2011-06-02 06:28:11

0

方法str.indexOf(int)取int。如果您將char傳入其中,java將會將char轉換爲int,因爲char是一個16位數字。

+0

是的,但是int在java中是32位的並且讓我困惑! – codeObserver 2011-06-02 04:10:02

+1

@ p1,碼點是32位,這就是它搜索的內容。 – 2011-06-02 08:16:16

0

Java有一整套隱式類型轉換規則正在進行。對於原語,也有特殊的規則,這些規則的文檔Conversions and Promotions中的所有概述,Sun公司的Java文檔的一部分。對於你的具體問題,int轉換爲char是一個「縮小原始轉換」。見上述文件第5.1.3節。這就是說,交換小正整數和編碼爲整數的字符是一種常見的編程習慣。這返回到它們在C中的區別使用,當ASCII是所有存在的時候。

相關問題