写点什么

char+char=number

用户头像
喵叔
关注
发布于: 5 小时前

在面试中面试官往往会考察 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.format和 printf方法进行处理.

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”);}





复制代码


用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
char+char=number