char+char=number

133 阅读3分钟

「这是我参与2022首次更文挑战的第30天,活动详情查看:2022首次更文挑战

在面试中面试官往往会考察 char 类型的知识和随机数的知识,部分开发人员很容易就掉入了坑中,下面我们通过两个例子来讲解一下 char 和随机数中的坑。

零、char

我们先来看一下面试题: 请写出下面代码段的输出值,

System.out.println('a'+'b');

针对上面的这段代码,部分程序员一定会给出答案是:ab,答案真的是这样吗?我们不妨把这段代码运行起来看一下。 在这里插入图片描述

程序输出的结果很出乎意料,竟然是 195。那么为什么是这个结果呢?这是因为编译器在计算表达式的时候进行了拓宽原始类型转换,首先将两个 char 类型的操作数转变为了 int 类型,然后再进行求和计算,针对上题编译器会先将 a 和 b 分别转换为 97 和 98 ,然后再进行求和,最终结果就是 195 。如果我们必须要输出 ab 的话我们该如何解决呢?一般来说我们会用三种方法解决。

  1. 方法一 这种方法是最简单的方法,我们只需要在 char 类型的数据前面拼接上一个 String 类型的空字符串即可。
System.out.println(""+'a'+'b');
  1. 方法二 这种方法利用 String.formatprintf方法进行处理.
System.out.println(String.format("%c%c", 'a','b'));
System.out.printf("%c%c",'a','b');
  1. 方法三 最后一种方法是利用 API 进行处理,调用 StringBuffer 即可。
StringBuffer sb = new StringBuffer();
sb.append('a');
sb.append('b');
System.out.println(sb);

一、随机数

下面我们再来看一个随机数的面试题: 下面的代码是否能输出 aBC 、bBC、cBC 。

import java.util.Random;

public class test {
    private static Random random = new Random();

    public static void main(String[] args) {
        StringBuffer stringBuffer = null;
        switch (random.nextInt(2)) {
            case 1:
                stringBuffer = new StringBuffer('a');
                break;
            case 2:
                stringBuffer = new StringBuffer('b');
                break;
            default:
                stringBuffer = new StringBuffer('c');
                break;
        }
        stringBuffer.append('A');
        stringBuffer.append('B');
        stringBuffer.append('C');
        System.out.println(stringBuffer);
    }
}

代码看上去一定会输出 aBC 、bBC、cBC,但是实际上我们运行这段代码不管多少次输出的值永远是 ABC ,这时为什么呢?首先 random.nextInt(2)返回一个伪随机的、均等分布在从 0 到 2 之间半开半闭区间的 int 类型的数值,也就是说返回的值就只有 0 和 1 ,因此永远执行不到 case 2 分支,因此 bBC 是不可能输出的。我们在对 stringBuffer 进行初始化的时候传入了一个 char 类型的参数,编译器会通过拓宽原始类型转换把 char 类型的参数值转变为 int 类型的值,然后调用 StringBuffer int 类型的构造函数,这一点我们可以通过查看 StringBuffer 源码看到。 在这里插入图片描述

这样就相当于给 stringBuffer 指定了一个初始容量为指定数值大小的缓冲区,因此也不会输出 aBC 和 cBC 。同样,如果我们喜欢输出 aBC 、bBC、cBC 的话我们可以将代码修改成这样:

private static Random random = new Random();
public static void main(String[] args) {
    System.out.println("abc".charAt(random.nextInt(3)) + "ABC");
}

System.out.println("abc".charAt(random.nextInt(3)) + "ABC"); }