目录

  • 一、基本数据类型
  • 二、类型转换
  • 三、面试陷阱


一、基本数据类型

1、整数型
byte属于Java中的整型,长度为1字节8bit,取值10000000(-128)到 01111111(127),变量初始化默认值为0,包装类Byte;

short属于Java中的整型,长度为2字节16bit,取值10000000 00000000(-32768)到 01111111 11111111(32767),变量初始化默认值为0,包装类Short;

int属于Java中的整型,长度为4字节32bit,取值-2^31 (-2,147,483,648)到 2^31-1(2,147,483,647),变量初始化默认值为0,包装类Integer;
java中整数类型默认的int类型;

long属于Java中的整型,长度为8字节64bit,取值-2^63 (-9,223,372,036,854,775,808‬)到 2^63-1(9,223,372,036,854,775,8087),变量初始化默认值为0或0L,包装类Long;

虽然byte、short、int、long 数据类型都是表示整数的,但是它们的取值范围可不一样。由上可以看出 byte、short 的取值范围比较小,而long的取值范围时最大的,所以占用的空间也是最多的。int 取值范围基本上可以满足我们的日常计算需求了,所以 int 也是我们使用的最多的一个整型类型。

2、浮点型
float属于Java中的浮点型,也叫单精度浮点型,长度为4字节32bit,变量初始化默认值0.0f,包装类Float;
小数类型默认的double类型;

double属于Java中的浮点型,也叫双精度浮点型,长度为8字节64bit,变量初始化默认值0.0d,包装类Double;
float 和 double 都是表示浮点型的数据类型,它们之间的区别在于精确度的不同。double 类型比float 类型存储范围更大,精度更高。通常的浮点型数据在不声明的情况下都是double型的,如果要表示一个数据时float 型的,可以在数据后面加上 “F” 。浮点型的数据是不能完全精确的,有时候在计算时可能出现小数点最后几位出现浮动,这时正常的。

3、字符型
char属于java中的字符型,占2字节16bit,可以赋值单字符以及整型数值, 变量初始化无默认值,包装类Character;

4、布尔型

boolean属于java中的布尔型,占1bit,1/8字节,仅有两个值true, false,变量初始化默认值false,包装类Boolean;

java 赋值double_包装类

二、类型转换

将一种类型的值赋值给另一种类型是很常见的。在Java中,boolean 类型与其他7中类型的数据都不能进行转换,这一点很明确。但对于其他7种数据类型,它们之间都可以进行转换,只是可能会存在精度损失或其他一些变化。

转换分为自动转换和强制转换:

自动转换(隐式):无需任何操作。

强制转换(显式):需使用转换操作符(type)。

将6种数据类型按下面顺序排列一下:

double > float > long > int > short > byte

如果从小转换到大,那么可以直接转换,而从大到小,或char 和其他6种数据类型转换,则必须使用强制转换。

1、自动转换

自动转换时发生扩宽(widening conversion)。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。如果将字面值保存到byte、short、char、long的时候,也会自动进行类型转换。注意区别,此时从int(没有带L的整型字面值为int)到byte/short/char也是自动完成的,虽然它们都比int小。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。

》int–> float

》long–> float

》long–> double

》float -->double

除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。

2、强制类型转换

如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。严格地说,将byte转为char不属于narrowing conversion),因为从byte到char的过程其实是byte–>int–>char,所以widening和narrowing都有。强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。强制转换格式如下:

(target-type) value;

如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如a=256超出了byte的[-128,127]的范围,所以将257除以byte的范围(256)取余数得到b=1;需要注意的是,当a=200时,此时除了256取余数应该为-56,而不是200。

将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。

拓展知识点:Java是面向对象语言,其概念为一切皆为对象,但基本数据类型算是个例外哦,基本数据类型大多是面向机器底层的类型,它是 “值” 而不是一个对象,它存放于“栈”中而不是存放于“堆”中,但Java一切皆为对象的概念不是说说而已,它为每一个基本数据类型都做了相应的包装类,我们日常使用中大多情况下都会使用着这些包装类

三、面试陷阱

(1)问:如下程序语句有什么问题吗?

short s1 = 1;
              s1 = s1 + 1;//1

        short s2 = 1;
              s2 += 1;//2

答:对于注释 1 来说,在 s1+1 运算时会自动提升表达式的类型为 int,所以将 int 赋予给 short 类型的变量 s1 会出现类型转换错误(无法编译,IDE 提示错误),除非主动加上强转。对于注释 2 来说 += 是 java 语法规定的运算符,所以 java 编译器会对它进行转换特殊处理,故可以正确编译执行。

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

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

(3)问:java 的 Integer 和 int 有什么区别?

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

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

答:由于 byte 的存储范围小于 int,可以向 int 类型进行隐式转换,所以 switch 可以作用在 byte 类型变量上;由于 long 的存储范围大于 int,不能向 int 进行隐式转换,只能强制转换,所以 switch 不可以作用在 long 类型变量上;对于 String 类型变量在 Java 1.7 版本之前不可以,1.7 版本之后是可以的。

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

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

(6)问:java 中 3*0.1 == 0.3 将会返回什么?true 还是 false?

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

(7)问:java 中 float f = 3.4; 是否正确?

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