美文网首页
Java基本数据类型及装箱拆箱面试题

Java基本数据类型及装箱拆箱面试题

作者: JTravler | 来源:发表于2020-02-29 17:10 被阅读0次

    1、如下程序语句有什么问题吗?

    short s1 = 1;
    s1 = s1 + 1;    //1
    
    short s2 = 1;
    s2 += 1;    //2
    
    1. 对于注释1来说,在 s1+1 运算时会自动提升表达式的类型为 int,所以将 int类型 赋值给 short 类型的变量 s1 会出现类型转换错误(编译失败,IDEA爆红),除非主动加上强转——s1 = (short)s1 + 1;
    2. 对于注释 2 来说 += 是 java 语法规定的运算符,所以 java 编译器会对它进行自动强转处理,故可以正确编译执行。

    2、java 中 char 类型变量能不能储存一个中文的汉字,为什么?

    1. java 的 char 类型变量是用来储存 Unicode 编码字符的,Unicode 字符集包含了汉字,所以 char 类型自然就能存储汉字。
    2. 但是在某些特殊情况下某个生僻汉字可能没有包含在 Unicode 编码字符集中,这种情况下 char 类型就不能存储该生僻汉字了。

    3、java 的 Integer 和 int 有什么区别?

    1. int 是 java 内置基本数据类型之一,java 为每个基本类型都提供了一个封装类,Integer 就是 int 的封装类(也叫包装类型);
    2. int 变量的默认值为 0,Integer 变量的默认值为 null,所以 Integer 可以区分出未赋值和值为 0 的区别;
    3. Integer 类内部提供了一些关于整数操作的方法,例如上文用到的表示整数的最大值和最小值。

    4、java 的 switch 语句能否作用在 byte 类型变量上,能否作用在 long 类型变量上,能否作用在 String 类型变量上?

    1. switch 对应的 JVM 字节码 lookupswitch、tableswitch 指令只支持 int 类型。
    2. 由于 byte 的存储范围小于 int,可以向 int 类型进行隐式转换,所以 switch 可以作用在 byte 类型变量上;
    3. 由于 long 的存储范围大于 int,不能向 int 进行隐式转换,只能强制转换,所以 switch 不可以作用在 long 类型变量上;
    4. 对于 String 类型变量在 Java 1.7 版本之前不可以,1.7 版本之后是可以的。

    5、能否在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量?

    不行。

    1. 我们不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量。
    2. 因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。

    6、java 中 3*0.1 == 0.3 将会返回什么?true 还是 false?

    false。

    1. 因为浮点数不能完全精确的表示出来,一般都会损失精度。

    7、java 中 float f = 3.4; 是否正确?

    不正确。

    1. 3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型(down-casting,也称为窄化)会造成精度损失。
    2. 需要强制类型转换 float f = (float)3.4; 或者写成 float f = 3.4F; 才可以。

    8、问:如下程序运行结果是什么?

    public static void main(String[] args) {
        Long l1 = 128L;
        Long l2 = 128L;
        System.out.println(l1 == l2);       //1
        System.out.println(l1 == 128L);     //2
    
        Long l3 = 127L;
        Long l4 = 127L;
        System.out.println(l3 == l4);       //3
        System.out.println(l3 == 127L);     //4
    }
    
    1. 对于注释 1 的语句,Long 包装类型常量 cache 为 -128 到 127 之间,所以 l1 和 l2 变量是两个对象,
      == 比较的是对象的地址,所以打印为 false。
    2. 对于注释 2 的语句,如果表达式中只要有一个不是包装类型,就会自动拆箱为基本类型比较,所以数值比较为 true。
    3. 对于注释 3 的语句,Long 包装类型 -128 到 127 之间的值维护在一个常量池中,所以 l3 和 l4 引用同一个对象,故打印 true。
    4. 对于注释 4 的语句类似注释 2 语句,所以打印为 true。

    9、java 是否存在使得语句 i > j || i <= j 结果为 false 的 i、j 值?

    存在。

    1. java 的数值 NaN 代表 not a number,无法用于比较,例如使 i = Double.NaN; j = i; 最后 i == j 的结果依旧为 false,这是一道非常变态的题,巨坑,谁特么会这么用。

    10、java 1.5 的自动装箱拆箱机制是编译特性还是虚拟机运行时特性?分别是怎么实现的?

    1.java1.5开始的自动装箱拆箱机制其实是编译时自动完成替换的,装箱阶段自动替换为了valueOf方法,拆箱阶段自动替换为了 xxxValue方法。

    1. 对于 Integer 类型的 valueOf 方法参数如果是-128~127之间的值会直接返回内部缓存池中已经存在对象的引用,参数是其他范围值则返回新建对象;
    2. Double 类型与 Integer 类型类似,一样会调用 Double 的 valueOf 方法,但是 Double 的区别在于不管传入的参数值是多少都会 new 一个对象来表达该数值(因为在指定范围内浮点型数据个数是不确定的,整型等个数是确定的,所以可以 Cache)。
      注意:
    3. Integer、Short、Byte、Character、Long 的 valueOf 方法实现类似。
    4. 而 Double 和 Float 比较特殊,每次返回新包装对象。
    5. 对于两边都是包装类型的比较 ==比较的是引用,equals比较的是值。
    6. 对于两边有一边是表达式(包含算数运算),== 比较的是数值(自动触发拆箱过程)。
    7. 对于包装类型 equals 方法不会进行类型转换。

    11、java 语句 Integer i = 1; i += 1; 做了哪些事情?

    1. 首先 Integer i = 1; 做了自动装箱(使用 valueOf() 方法将 1(int类型) 装箱为 Integer 类型)。
    2. 接着 i += 1; 先将 Integer 类型的 i 自动拆箱成 int(使用 intValue() 方法将 Integer 拆箱为 int)
    3. 完成加法运行之后的 i 再装箱成 Integer 类型。

    相关文章

      网友评论

          本文标题:Java基本数据类型及装箱拆箱面试题

          本文链接:https://www.haomeiwen.com/subject/zbcmhhtx.html