为什么 ch1 == ch2 是假的,它不是拥有相同的字符值吗?



我正在尝试比较两个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的超集(。

相关内容

  • 没有找到相关文章

最新更新