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。现在让我们看看如何获取charint值。正如我们可能预期的那样,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上的教程仓库中找到。