2010-07-10 78 views
1

我对Java处理转换的方式有点困惑。java - 如果数组有int值,print()不会输出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 [10];

在Java中,这些空单元格的默认值为0,所以我认为可以在char数组中使用0,但似乎不是。任何人都可以解释为什么打印方法甚至不输出'a'和'b'?

+1

这是确定在你赢得意义上的字符数组有0”不要被捕。但为什么你会期望输出是字符“0”?如果酒吧的第一个元素是48,那么就会得到这个结果。0对应于nul字符,也许您的显示设备在获取该字符时会做一些“有趣”的事情。 – 2010-07-10 02:08:36

+0

当我在Eclipse中运行这个时,我得到'ab',所以我打赌@GregS是正确的。 – 2010-07-10 02:12:49

+0

嗯我也使用Eclipse .. – 2010-07-10 02:28:50

回答

2

正如您所发现的,整数0和字符文字'0'的字符值不同。要将数字转换为十进制数字的字符表示,你需要做的是这样的:

int digit = ... // some value between 0 and 9 
char ch = (char)(digit + '0'); 

你也可以这样做,因为:

int digit = ... 
char ch = Character.forDigit(digit, radix); 

其中radixCharacter.MIN_RADIX之间的值Character.MAX_RADIX10的基数为您提供了一个十进制数字。见Character.forDigit(int,int)

字符值零是Unicode代码点NULL(0x0000)。这是一个不可显示的“控制字符”。如果你尝试显示它,你很可能看不到任何东西(如你所得到的),或者一个特殊的字形,意思是“我不能显示这个字符”。

2

您的困惑比标题暗示的更为基本,它与阵列或打印无关,但与Java(以及许多语言中的C)中的char数据类型无关。 尝试此:

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数据类型是真的,其中(常规)表示码点,即assignated为文本的数值的整数值字符在Unicode (假设我们在BMP里面)(并且回想起对于ASCII字符,即低于128的码点,ASCII和Unicode具有相同的码点)。所以,char c1='a'是那种快捷地说“分配C1对应于字符‘A’的码点的整数值”

+0

thx的提示!不知道它被视为unicode – 2010-07-10 02:37:08