龙空技术网

Java面试题之数据类型详解

传道程序猿 86

前言:

当前看官们对“java 数字类型判断”大约比较关怀,咱们都需要学习一些“java 数字类型判断”的相关文章。那么小编在网摘上搜集了一些对于“java 数字类型判断””的相关知识,希望同学们能喜欢,朋友们快快来了解一下吧!

1. 8种基本数据类型

Java有 8 种基本数据类型,分别为:

6 种数字类型 (四个整数形,两个浮点型):byte、short、int、long、float、double1 种字符类型:char1 种布尔型:boolean。

byte:

byte 数据类型是8位、有符号的,以二进制补码表示的整数;最小值是 -128(-2^7)最大值是 127(2^7-1)默认值是 0byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;例子:byte a = 100,byte b = -50。

short:

short 数据类型是 16 位、有符号的以二进制补码表示的整数最小值是 -32768(-2^15)最大值是 32767(2^15 - 1)Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;默认值是 0例子:short s = 1000,short r = -20000。

int:

int 数据类型是32位、有符号的以二进制补码表示的整数;最小值是 -2,147,483,648(-2^31)最大值是 2,147,483,647(2^31 - 1)一般的整型变量默认为 int 类型;默认值是 0例子:int a = 100000, int b = -200000。

long:

注意:Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析long 数据类型是 64 位、有符号的以二进制补码表示的整数;最小值是 -9,223,372,036,854,775,808(-2^63)最大值是 9,223,372,036,854,775,807(2^63 -1)这种类型主要使用在需要比较大整数的系统上;默认值是 0L例子: long a = 100000L,Long b = -200000L。

"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辨。所以最好大写。

float:

float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;float 在储存大型浮点数组的时候可节省内存空间;默认值是 0.0f浮点数不能用来表示精确的值,如货币;例子:float f1 = 234.5f。

double:

double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;浮点数的默认类型为double类型;double类型同样不能表示精确的值,如货币;默认值是 0.0d例子:double d1 = 123.4。

char:

char类型是一个单一的 16 位 Unicode 字符;最小值是 \u0000(即为 0);最大值是 \uffff(即为 65535);char 数据类型可以储存任何字符;例子:char letter = 'A';(单引号

boolean:

boolean数据类型表示一位的信息;只有两个取值:true 和 false;这种类型只作为一种标志来记录 true/false 情况;默认值是 false例子:boolean one = true。

2.基本类型之间的转换

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

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

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

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

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

double > float > long > int > short > byte

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

①自动转换

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

》int--> float

》long--> float

》long--> double

》float -->double without strictfp

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

②强制类型转换

如果要把大的转成小的,或者在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)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。

7种基本类型转换总结如下图:

③赋值及表达式中的类型转换

字面值赋值

在使用字面值对整数赋值的过程中,可以将int literal赋值给byte short char int,只要不超出范围。这个过程中的类型转换时自动完成的,但是如果你试图将long literal赋给byte,即使没有超出范围,也必须进行强制类型转换。例如 byte b = 10L;是错的,要进行强制转换。

表达式中的自动类型提升

除了赋值以外,表达式计算过程中也可能发生一些类型转换。在表达式中,类型提升规则如下:

· 所有byte/short/char都被提升为int。

· 如果有一个操作数为long,整个表达式提升为long。float和double情况也一样。

3.拓展知识点:

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

boolean Boolean

char Character

byte Byte

short Short

int Integer

long Long

float Float

double Double

String(字符串)

包装类就是一个对象,它存放于“堆”中。

标签: #java 数字类型判断