1. 概述
在这个教程中,我们将探讨如何在Java中将int
类型转换为char
类型,以及反过来。
2. Java中的char
我们首先简要讨论字符在Java中的表示方式,以便更好地理解后续文章中的代码。
在内部,Java将每个char
存储为一个16位的Unicode编码值:
字符 | 2字节 | 十进制(10进制) | 十六进制(16进制) |
---|---|---|---|
A | 00000000 01000001 | 65 | 41 |
a | 00000000 01100001 | 61 | 97 |
1 | 00000000 00110001 | 49 | 31 |
Z | 00000000 01011010 | 90 | 5A |
我们可以通过将char
值转换为int
来轻松验证这一点:
assertEquals(65, (int)'A');
ASCII码是Unicode编码的一个子集,主要用于表示英语字母。
3. 将int
转换为char
假设我们有一个int
变量,其值为7,我们想要将其转换为其对应的字符'7'。有几种方法可以实现这个目标。
直接将其转换为char
不会工作,因为这会将其转换为二进制表示为0111的字符,对应于UTF-16中的U+0007,即"BELL"字符。
3.1. 通过添加'0'
UTF-16中的字符按顺序排列。因此,我们只需将字符'0'向后偏移7个位置,即可得到字符'7':
@Test
public void givenAnInt_whenAdding0_thenExpectedCharType() {
int num = 7;
char c = (char)('0' + num);
assertEquals('7', c);
}
3.2. 使用Character.forDigit()
方法
直接添加'0'可行,但看起来有点不优雅。幸运的是,我们有一个更简洁的方法,即使用Character.forDigit()
方法:
@Test
public void givenAnInt_whenUsingForDigit_thenExpectedCharType() {
int num = 7;
char c = Character.forDigit(num , 10);
assertEquals('7', c);
}
我们可以注意到forDigit()
方法接受第二个参数radix
,它代表我们想要转换的数字的基数表示。在我们的例子中,它是10。
3.3. 使用Integer.toString()
方法
我们可以使用Integer
包装类,它具有toString()
方法,可以将给定的int
转换为字符串表示。当然,这种方法可用于转换包含多个数字的数值。但是,我们也可以通过链式调用charAt()
方法并获取第一个字符来将单个数字转换为char
:
@Test
public void givenAnInt_whenUsingToString_thenExpectedCharType() {
int num = 7;
char c = Integer.toString(num).charAt(0);
assertEquals('7', c);
}
4. 将char
转换为int
之前我们已经了解了如何将int
转换为char
。现在让我们看看如何获取char
的int
值。正如我们可能预期的那样,将char
转换为int
不会工作,因为这会给我们字符的UTF-16编码的十进制表示:
@Test
public void givenAChar_whenCastingFromCharToInt_thenExpectedUnicodeRepresentation() {
char c = '7';
assertEquals(55, (int) c);
}
4.1. 减去'0'
如果当我们添加'0'时,我们得到char
,那么相反地,通过减去'0'的十进制值,我们应该得到int
:
@Test
public void givenAChar_whenSubtracting0_thenExpectedNumericType() {
char c = '7';
int n = c - '0';
assertEquals(7, n);
}
这确实有效,但有更好的、更简单的方法。
4.2. 使用Character.getNumericValue()
方法
Character
类再次提供了另一个辅助方法getNumericValue()
,它基本上如其名称所示:
@Test
public void givenAChar_whenUsingGetNumericValue_thenExpectedNumericType() {
char c = '7';
int n = Character.getNumericValue(c);
assertEquals(7, n);
}
4.3. 使用Integer.parseInt()
方法
我们可以使用Integer.parseInt()
将字符串转换为数值表示。就像之前一样,虽然我们可以使用此方法将包含多个数字的完整数值转换为int
表示,但对于单个数字,我们也可以使用它:
@Test
public void givenAChar_whenUsingParseInt_thenExpectedNumericType() {
char c = '7';
int n = Integer.parseInt(String.valueOf(c));
assertEquals(7, n);
}
确实,语法有些复杂,主要是因为它涉及多次转换,但它按预期工作。
5. 总结
在这篇文章中,我们学习了Java中字符的内部表示方式,以及如何在两种类型之间进行转换。
如往常一样,本文的所有完整代码示例可在GitHub上的教程仓库中找到。