Java面试题之基本数据类型

声明

题目来源于【每日一题】Java 基本数据类型基础面试题

本文目的在于写下自己的理解和补充,若没有更好的理解会写明原答案,欢迎大家补充和指正

1.如下赋值语句有什么问题吗?

	short i = 1;
  	i = i + 1;//1
    
    short j = 1;
    j += 1;//2

结果:1.编译器提示错误 2.正常

分析:这道题首先需要明白在java规范中:高位转低位需要显式强制转换 ,低位转高位会隐式的进行转换;byte short char 参与运算时,会先自动转换为int类型。

题目首先要在抓住赋值的操作,在1处[short]+[int]会得到[int]的结果,[short] = [int]赋值过程中缺少显式类型转换,正确的写法应该是i=(short) (i + 1);。而2处,这是一种复合赋值操作,它会自动地将所执行计算的结果转型为其左侧变量的类型,即j += 1等价于j=(short) (j + 1),所以能够正确执行。

需要注意的是,若赋值的数大于类型的范围将会报错,下面是几种基本数据类型的大小范围,当作复习下

名称 范围 字节大小
byte [-2^7 ,2^7-1] 即-128~127 1字节
short [-2^15, 2^15-1] 即-32,768~32,767 2字节
int [-2^31 ,2^31-1] 即-2,147,483,648‬~2,147,483,647 4字节
long [-2^63, 2^63-1] 8字节
char 字符型 2字节
float 单精度 [-3.403E38,3.403E38] 4字节
double 双精度 [-1.798E308,1.798E308] 8字节
boolean true/false 1字节

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

对于这个问题,首先我们需要知道一个问题就是,unicode编码仅仅只是规定了可以用0到100多万的编号来表示文字,几乎涵盖世界上的所有自然语言,每个区间都代表一种语言,但是unicode编码并未给出具体的映射关系,而使用UTF-8和UTF-16等UTF标准作为这些数值和字符的映射关系的编码方案。

在API文档中可以看到,

  • 合法代码点( code point)范围在 U+0000 to U+10FFFF , 这也就是Unicode标量值(Unicode scalar value).

  • 其中U+0000 to U+FFFF 有时也被称为 Basic Multilingual Plane (BMP)

  • 代码点大于U + FFFF的字符称为补充字符

  • Java平台在char数组和Stringand StringBuffer类中使用UTF-16表示形式,在此表示形式中,BMP表示为一个char值,而补充字符表示为一对char

结论:char字符存储的是Unicode编码的代码点,而大部分中文的代码点集中在[0x4E00, 0x9FBB]区间内,也就是在BMP的范围内,所以可以使用一个char字符表示,但是若部分中文是在补充字符的区间内则需要一对char才可以表示。

3.Java 的 Integer 和 int 有什么区别?

  • int是基本数据类型,存放在;而Integer是int的包装类,通常实例化后存放在中;
  • Integer变量必须实例化后才能使用;int变量不需要;
  • Integer是对象的引用,指向实例化的Integer对象;int是直接存储数据值 ;
  • Integer的默认值是null;int的默认值是0;
  • Integer 类内部提供了一些关于整数操作的方法;
  • Integer提供了保存有[-128,127] Integer类型的cache数组,若创建这个区间数值的Ingeger对象,则会引用cache数组内的实例。(详见Integer的内部类IntegerCache)

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

结论:现switch支持分支条件类型为: char, byte, short, int, Character, Byte, Short, Integer, String, enum

  • 在JAVA7之前,switch里只能判断Integer与enum,因为如题1所说,低位转高位会隐式的进行转换,而高位转低位需要显式强制转换,所以switch 语句能否作用在 byte 类型变量上,而不能作用在long类型
  • 在JAVA7后,switch可以使用String作为分支条件

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

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

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

结论:会返回false,因为在JAVA中计算3*0.1会输出0.30000000000000004 而非0.3,精度不同自然比较结果也不同。

该问题还可以是 4*0.1 == 0.4会返回的是什么?结果为true

至于为什么可以看看这篇文章:为什么java里面3x0.1=0.30000000000000004,而4x0.1=0.4?

文章里,@蓝色和@罗智勇两位答主把问题解释得很清楚了

以后有时间,我再切合源码把这个问题阐述一遍

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

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

你可能感兴趣的:(面试)