为什么string.indexOf方法的参数是Java中的int

cod*_*ver 9 java primitive-types data-structures

我想知道为什么indexOf方法的参数为int,当描述为char时.

public int indexOf(int ch)

Returns the index within this string of the first occurrence of the specified **character**
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

a]基本上,我很困惑的是java中的int是32位,而unicode字符是16位.

b]为什么不使用字符本身而不是使用int.这是任何性能优化吗?字符难以表示而不是整数吗?怎么样 ?

我认为这应该是一个简单的推理,这让我更加了解它!

谢谢!

Ste*_*n C 14

真正原因是,indexOf(int)预计一个Unicode码点,而不是16位UTF-16"字符".Unicode代码点的长度实际上最多为21位.

(较长代码点的UTF-16表示实际上是2个16位"字符"值.这些值分别称为前导和尾随代理; D800 16到DBFF 16,DC00 16到DFFF 16 ;请参阅Unicode FAQ - UTF -8,UTF-16,UTF-32和BOM为血淋淋的细节.)

如果你给indexOf(int)一个代码点> 65535它将搜索的一双那编码码点UTF-16字符.

这是由javadoc声明的(尽管不是很清楚),并且对代码的检查表明这确实是该方法的实现方式.


为什么不使用16位字符?

这很明显.如果他们这样做,就没有一种简单的方法可以在字符串中找到大于65535的代码点.对于开发国际化应用程序的人来说,这将是一个主要问题,其中文本可能包含这样的代码点.(许多所谓的国际化应用程序会做出错误的假设,即a char代表一个代码点.通常它并不重要,但它越来越经常发生.)

但它不应该对你有任何影响.如果您的字符串仅由16位代码组成,或者就此而言仅包含ASCII代码,则该方法仍然有效.