2011-06-02 81 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是所有存在的时候。

相关问题