我对Java如何处理转换感到困惑。
我的char数组由0(不是'0')
组成char[] bar = {0, 'a', 'b'};
System.out.println(String.valueOf(bar));
当发生这种情况时,println方法不会输出任何内容。但是当我把零视为角色时:
char[] bar = {'0', 'a', 'b'};
System.out.println(String.valueOf(bar));
然后按预期输出“0ab”。
我的理解是,如果您声明具有空值的基本类型数组,如:
char [] foo = new char [10];
这些空单元格在Java中的默认值为0,所以我认为在char数组中有0可以,但似乎没有。任何人都可以解释为什么打印方法甚至不输出'a'和'b'?
答案 0 :(得分:2)
正如您所发现的,整数0
和字符文字'0'
的字符值是不同的。要将数字转换为十进制数字的字符表示,您需要执行以下操作:
int digit = ... // some value between 0 and 9
char ch = (char)(digit + '0');
你也可以这样做:
int digit = ...
char ch = Character.forDigit(digit, radix);
其中radix
的值介于Character.MIN_RADIX
和Character.MAX_RADIX
之间。 10
的基数给出一个十进制数字。请参阅Character.forDigit(int,int)
。
字符值零是Unicode代码点NULL(0x0000)。这是一个不可显示的“控制角色”。如果你试图显示它,你可能会看到任何一个(你正在获得)或一个特殊的字形,意思是“我不能显示这个字符”。
答案 1 :(得分:2)
你的困惑比标题所暗示的更基本,它与数组无关,也与打印有关,而与Java中的char
数据类型无关(在许多语言中,与C相关)。
试试这个:
char c1 = 0;
char c2 = '0';
System.out.println(c1 == c2); // false
进一步说:
char c1 = 48; // unicode code-point of character '0' = 0x30 = 48
char c2 = '0';
System.out.println(c1 == c2); // true
c1 = 97; // unicode code-point of character 'a' = 0x61 = 97
c2 = 'a';
System.out.println(c1 == c2); // true
请参阅,char数据类型实际上是一个整数值(通常)表示代码点,即分配给Unicode中文本字符的数值
(假设我们在BMP内部)(并且回想一下,对于ASCII字符,即低于128的代码点,ASCII和Unicode具有相同的代码点)。所以,char c1='a'
是一种快捷方式,可以说“为c1分配对应于字符'a'的代码点的整数值