为什么 ch1 == ch2 是假的,它不持有相同的 char 值吗?

why ch1 == ch2 is false, doesn't it hold the same char values?

我正在尝试比较两个 char 原语 ch1 和 ch2。两者都被分配了值 1,如下所示。

但是当使用“==”运算符进行比较时,它 returns 错误,我不明白幕后发生了什么。

char ch1 = (char)1;
char ch2 = '1';
System.out.println(ch1==ch2); //false

//further comparisions
System.out.println(ch1 == 1);       //true
System.out.println(ch1 == '\u0031'); //false

System.out.println(ch2 == 1);       //false
System.out.println(ch2 == '\u0031'); //true

'1' 的值为 49(31 十六进制)。

(char)1 的值为 1。

A char 只是一个 16 位整数。符号 'x' 表示 'the character code for the character x',其中 Java 中使用的编码是 Unicode,特别是 UTF-16。

强制转换 (char) 不会更改其右侧表达式的值,只是它将其从 full-size 整数截断为 16 位(对于值 0 到 65535 没有变化).

基本上您所做的是将数字 1 转换为字符,因此 ch1 现在等于 unicode 字符 1(SOH 或 Header 的开始)

因此,当您将 ch1 (SOH) 与 ch2 ('1') 进行比较时,它会 return false 同样,如果您将 ch1 (SOH - \u0001) 与“1”进行比较 - \u0031 将变为 return false

这就是为什么 return 为假的主要原因,您期望的 ch1 的 unicode 值与您分配的不同

代码点

char 类型自 Java 2 以来基本上已损坏,物理上无法表示大多数字符。

改为使用代码点整数。每个字符都永久分配了一个特定的数字,一个代码点。

int codePoint = "1".codePointAt( 0 ) ;  // Annoying zero-based index counting. 

结果为十进制49,十六进制31。

根据代码点将单个字符组成一个字符串。

String s = Character.toString( codePoint ) ;

或者更具体地说:

String latinDigitOneCharacter = Character.toString( 49 ) ;

正如其他人所指出的,您的代码错误地将定义为拉丁数字“1”的字符与代码点 1 进行了比较。

分配给 1 代码点的字符是 control code SOH,标题开始。在 Unicode 和 US-ASCII 中都是如此(Unicode 是 US-ASCII 的超集)。