为什么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会将char
为int
,因为char
是一个16位数字。
Java有很多隐含的类型转换规则在幕后进行。 对于原语,有一些特殊规则,这些规则在Sun的Java文档的一部分Conversions and Promotions文档中有所概述。 对于您的特定问题,将int转换为char是“缩小原始转换”。 见上文所述的5.1.3节。
话虽这么说,交换小的正整数和编码为整数的字符是一种常见的编程习惯。 这可以追溯到它们在C中的使用无法区分,当ASCII就是存在的时候。