Java - public int indexOf(int ch)

3

我遇到了以下内容:

public int indexOf(int ch)

根据我在复习一些与字符串相关的Java概念时阅读的http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(int),方法indexOf()应该使用char参数。因此,我一直认为它应该是这样的。
public int indexOf(char ch)

所以,请解释一下为什么是 public int indexOf(int ch)

是因为它将该字符视为Unicode代码点,而Unicode代码点又是int或具有int数据类型吗? - Vikram
我的猜测是,由于它涉及Unicode代码点,所以它需要比char提供的范围更广。 char只有8位,而int有32位。 - Guildenstern
1
@Guildenstern char 是16位的。这对于最初的Unicode来说已经足够了,但现在不再足够了。 - ajb
向上滚动到String javadoc的顶部,您会看到:“字符串表示UTF-16格式中的字符串,其中补充字符由代理对表示(有关更多信息,请参见Character类中的Unicode字符表示部分)。索引值是char代码单元引用,因此补充字符在字符串中使用两个位置。” - ajb
@Vikram,请看我在这里的答案https://dev59.com/dYPba4cB1Zd3GeqPw8rO#26080888,希望它能够澄清你对字符和整数的概念 :) - Muhammad
2个回答

3
Unicode包含超过2^16个字符。Java中的'char'和'String'使用Unicode转换格式(UTF-16)来表示完整的字符集。基本多文种平面(BMP)中的字符被表示为单个16位'char'。其余的则由一对代理对表示:这是一组保留用于此目的的特殊16位值。
另一种表示方法是UTF-32。在这种表示中,每个字符都是一个单独的32位项目,没有例外。
例如,楔形文字就在BMP中;该块的第一个字符是U+12000。在UTF-32中,它只是0x12000。在UTF-16中,它是"\uD808\uDC00"这里有些图片。 CharacterString 等类提供了一些方便的操作UTF-32字符的方法。你问的是其中一个。当你看到一个字符的数据类型是 'int' 时,它包含的就是一个 UTF-32 值。可以很容易地看出使用单个 UTF-32 值进行某些操作比使用一对代理项更加方便。
注意,这与组合和非组合重音无关。á可以用Unicode表示为一个或两个UTF-16字符,但不涉及代理项。U+0061(a)、U+00E1(带预组合重音符的a)和U+0301(组合式尖角号)都是普通BMP字符。因此,即使在UTF-32中,您仍然可以拥有一个由两个项目组成的序列:U+0061,U+0301。
ICU4J库提供了一个更完整的UTF-32类和方法集。

1
每个字符都有一个整数值,可以使用该值获取该字符,同样地,也可以通过将字符分配给int变量来将字符转换为int。请尝试以下行。
char ch = 65;
System.out.println(ch);
int i = 'A';
System.out.println(i);

我在循环中使用char值,这是允许的,因为每个char都有一个int值。 尝试运行这段代码,它会打印出从A到Z的字母及其对应的int值。

    for(char j = 'A'; j <= 'Z'; j++){
        System.out.println("int "+((int) j)+" = "+j);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接