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

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

public 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); 

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

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

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

谢谢!

真正的原因是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的代码点。 对于开发国际化应用程序的人来说,这将是一个主要问题,其中文本可能包含这样的代码点。 (许多所谓的国际化应用程序会做出错误的假设,即char代表一个代码点。通常它并不重要,但它越来越经常发生。)

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

Java中的字符存储在它们的unicode整数表示中。 Character类文档包含有关此格式的更多详细信息。

从该页面上的文档:

接受int值的方法支持所有Unicode字符,包括补充字符。 例如,Character.isLetter(0x2F81A)返回true,因为代码点值表示一个字母(CJK表意文字)。

方法str.indexOf(int)采用int。 如果将char传递给它,java会将charint ,因为char是一个16位数字。

Java有很多隐含的类型转换规则在幕后进行。 对于原语,有一些特殊规则,这些规则在Sun的Java文档的一部分Conversions and Promotions文档中有所概述。 对于您的特定问题,将int转换为char是“缩小原始转换”。 见上文所述的5.1.3节。

话虽这么说,交换小的正整数和编码为整数的字符是一种常见的编程习惯。 这可以追溯到它们在C中的使用无法区分,当ASCII就是存在的时候。