唐磊的个人博客

再看java数据类型

在Java语言中,数据类型分为基本类型和对象类型。其中对象类型继承Object类,按照存储对象的内存模型进行数据存储。对象引用存储在内存栈上,而对象本身的值存储在内存堆上。这个概念上没有什么值得需要注意的地方。这里,我想说的主要还是java的基本数据类型。

一般来说也就是比较公认的java包括8中基本类型(有的人也说void是一种类型),从类型上又可分为:布尔型、字符型和数值型;其中数值型又可分为整数和实数2种。









































































































































































 




 




 




 













分类




基本类型




大小




最小值




最大值




包装器类型




默认值




布尔



boolean







Boolean

false


字符



char

16-bit

‘\u0000’

‘\uFFFF’

Character

‘\u0000’






 




数值



整数

byte

8bits

-128

+127

Byte



short

16bits

-215

+215-1

Short



int

32bits

-231

+231-1

Integer



long

64bits

-263

+263-1

Long

0L/0l

实数

float

32bits

IEEE754

IEEE754

Float

0.0F/0.0f

double

64bits

IEEE754

IEEE754

Double

0.0D/0.0f








需要说明的是boolean类型所占存储空间的大小没有明确指定,仅定义为能够取字面值true或false,它占用的空间取决于Java虚拟机(JVM)的实现,可能是1位也可能是1个字节。

而类型可以自动转化,但需要满足的规则是byte -> short(char) -> int -> long -> float -> double逐步提升。向下就得加强制转换符号。但有可能失去信息。默认的整数都是int,默认的小数都是double。要定义float以及long等类型时得加个后缀,F(小写也可以)或者L。否则编译不会通过。这也就是编译期间检查编译器会在编译期对byte、short、int、long、float、double、char型变量的值进行检查,如果超出了它们的取值范围就会报错。

byte bb = 1455;//编译过不了 eclipse会提示: Type mismatch: cannot convert from int to byte
byte bbb = 12;

并且当使用+、-、*、/、%运算符对基本类型进行运算时,遵循如下规则:

  • 只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;
  • 否则,只要两个操作数中有一个是float类型的,另一个将会被转换成float类型,并且结果也是float类型;
  • 否则,只要两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;
  • 否则,两个操作数(包括byte、short、int、char)都将会被转换成int类型,并且结果也是int类型。

当使用+=、-=、*=、/=、%=、运算符对基本类型进行运算时,遵循如下规则:运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符左边数值类型相同。这也是经常在某些面试题上出现的问题。

还需要说明的是从JDK5.0开始,Java基本数据类型及其对应包装类之间能实现自动装箱解箱操作。就是说int自动装箱成Integer等。另外,有的人可能会问,自动转型的时候,为什么占用8个字节的long还能转成4个字节的float呢?或者到底是Float的maxvalue大还是Long的maxvalue大呢?下面这段代码可以看出结果。

System.out.println(Long.MAX_VALUE > Float.MAX_VALUE);//false

居然是false。什么原因呢?

再看下面的。

float f1 = 10000000143242F;


float f2 = 10000000000000F;

System.out.println(f1 == f2); //true

System.out.println((f1-f2) > 0.01);//false

应该能看出原因了吧?结果就是进度不一致。


float使用ieee754格式存储。只有24位精度,两个float之间的距离可能很大。

举个简单的例子,10000000143242和10000000000000用float表示的话这两个数是相同的 。但是整数是精确表示的。这就是float为什么比long的范围广的原因了。

下面把测试代码贴出来

float f = 0f;
long l = Long.MAX_VALUE;
f = l;
//l = f;编译不能通过
System.out.println(f);//9.223372E18
System.out.println(l);//9223372036854775807
/**
* float使用ieee754格式存储。只有24位精度,两个float之间的距离可能很大。
*举个简单的例子,2000000000和2000000050用float表示的话这两个数是相同的 。
*整数是精确表示的。
*/
System.out.println(Long.MAX_VALUE > Float.MAX_VALUE);//false 精度不一致
float f1 = 10000000143242F;
float f2 = 10000000000000F;
javaSystem.out.println(f1 == f2); //true
System.out.println((f1-f2) > 0.01);//false
int i =255;
byte b = (byte) i; //强制转换 可能丢失信息
System.out.println(b); //-1
java char c = 'A';
System.out.println(c);//A
System.out.println(c+1);//66
System.out.println("char 默认类型:" +ch);
//byte bb = 1455;//编译过不了Type mismatch: cannot convert from int to byte
byte bbb = 12;
tanglei wechat
欢迎扫描二维码关注我的微信公众号