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