我正在尝试比较两个char基元ch1和ch2。两者都被分配了值1,如下所示。
但是当使用"=="运算符返回false,我不明白幕后是如何发生的或发生了什么。
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个十六进制(。
CCD_ 2具有值1。
char
只是一个16位的整数。符号'x'
的意思是"字符x的字符代码",其中Java中使用的编码是Unicode,特别是UTF-16。
强制转换(char)
不会将表达式的值向右更改,只是将其从一个全尺寸整数截断为16位(对于值0到65535没有更改(。
基本上,您所做的是将数字1强制转换为char,因此ch1
现在等于unicode字符1(SOH或标头的开头(
因此,当你比较ch1(SOH(和ch2('1'(时,它将返回false同样,如果将ch1(SOH-\u0001(与"1"进行比较,则\u0031将返回错误
这就是返回false的主要原因,您期望的ch1的unicode值与您分配给的值不同
代码点
char
类型自Java2以来基本上已损坏,物理上无法表示大多数字符。
而是使用代码点整数。每个字符都被永久地分配了一个特定的数字,一个代码点。
int codePoint = "1".codePointAt( 0 ) ; // Annoying zero-based index counting.
结果是十进制49,十六进制31。
为每个代码点制作一个包含该单个字符的字符串。
String s = Character.toString( codePoint ) ;
或者更具体地说:
String latinDigitOneCharacter = Character.toString( 49 ) ;
正如其他人指出的那样,您的代码错误地将定义为拉丁数字"1"的字符与代码点1进行了比较。
分配给其中一个代码点的字符是控制代码SOH,标题开始。这在Unicode和US-ASCII中都是正确的(Unicode是US-ASCII的超集(。