为什么参数是 string.indexOf 方法在 Java 中是一个 int

2022-09-04 08:37:57

我想知道为什么参数 indexOf 方法 a int ,当描述说一个字符。

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。这是任何性能优化吗?字符比 int 更难表示吗?如何?

我认为这应该是对此的简单推理,这使我对它更加了解!

谢谢!


答案 1

真正的原因是需要一个Unicode代码点,而不是一个16位UTF-16“字符”。Unicode 码位实际上长达 21 位。indexOf(int)

(较长代码点的 UTF-16 表示形式实际上是 2 个 16 位“字符”值。这些值称为前导和尾随代理项;D80016 至 DBFF16 和 DC0016 至 DFFF16;请参阅 Unicode FAQ - UTF-8、UTF-16、UTF-32 和 BOM 了解血腥的细节。

如果给出一个码位> 65535,它将搜索编码码位的 UTF-16 字符indexOf(int)

javadoc对此进行了说明(尽管不是很清楚),对代码的检查表明这确实是该方法的实现方式。


为什么不只使用16位字符?

这是显而易见的。如果他们这样做,就不会有一种简单的方法可以在字符串中定位大于65535的代码点。对于开发文本可能包含此类代码点的国际化应用程序的人来说,这将是一个主要问题。(许多所谓的国际化应用程序错误地假设 a 表示代码点。通常这并不重要,但越来越频繁地这样做。char

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


答案 2

Java 中的字符以 Unicode 整数表示形式存储。字符类文档包含有关此格式的更多详细信息。

从该页面上的文档:

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


推荐