java数据类型分为两种,一种为基本数据类型(内置数据类型),一种为引用数据类型。
基本数据类型
Java中共有八大基本数据类型,分别为:
数据类型 | 大小(bit) | 最大值 | 最小值 | 默认值 | 包装类 |
---|---|---|---|---|---|
byte | 8 | 127(-2^7) | -128(2^7-1) | 0 | java.lang.Byte |
short | 16 | -2^15 | 2^15 | 0 | java.lang.Short |
int | 32 | -2^31 | 2^31 | 0 | java.lang.Integer |
long | 64 | -2^63 | 2^64 | 0L(必须加L | java.lang.Long |
float | 32 | - | - | 0.0f(必须加f) | Java.lang.Float |
double | 32 | - | - | 0.0d(d可省略) | java.lang.Double |
char | 16 | \u0000(0) | \uffff(65535) | - | Java.lang.Char |
boolean | 1 | - | - | false | - |
最好知道这些概念,在未来面试可能遇到一些关于 数据类型的概念,能简单描述总比什么都不知道的好 ^_^。
还有一种基本数据类型:void,他有对应的包装类为:java.lang.Void,我们无法对它进行任何操作,所以只需了解即可。
基础类型间的转换
自动类型转换
除了boolean类型外,其他七大数据类型之间可以混合运算,他们之间运算的原理是转换成相同的数据类型,让后进行运算,小位数的数据类型可直接转换成大数据类型(向上转型),如下所示:
byte a =1;
short b =a;//转换成功,a值赋给short类型的b,并且自动转换成short类型。
int a =1;
short b =a;//转换失败,报错。a的数据类型所占位数大于b,许进行强制类型转换
注意:char类型位数虽然比byte大,但不能将byte装换成char类型,char类型可以转换成int以及其他位数大于它的类型型。
byte a =1;
char b =a;//转换失败,
char a ='a';
int b =a;//转换成功,值为97,因为字符‘a’对应的ascll码为97,所以在转换时按照ascll码转换成97。
强制类型转换
若是想将基本数据类型大位数的强制转化为小类型数据类型(向下转型),需进行强制转换
格式:(need_type)value,need_type类型就是想转化成的类型。
int a =97;
char b =(char)a;//将整形a转化成位数比自己小的char类型,同样根据ascll码,b的值为'a'
缺点:强制转换原理其实就是大位数数据省略掉一部分位数强制变为小位数数据,这样会使得数据丢失,所以慎用!
经典面试题
现在有一个整形变量int a =130,在进行byte b =(byte)a操作后,得到的a是多少?
这是一个非常常见的题目,很多人会认为会是byte的最大值127(我之前一直这样认为的),但其实不是,具体运算过程如下:
这里需要掌握一些小知识:
java是采用补码的形式存储整数
- 源码:对于二进制数,最高位为符号位,0表示正数,1表示负数,剩余数值部分是真值。
- 反码:对于二进制数,正数的反码就是它本身,负数的反码除符号位外按位取反。
- 补码:对于二进制数,正数的补码就是它本身,负数的补码符号位取一,数值部分按位取反后末位加一。
正数(源码第一位为0):补码即原码
负数补码(源码第一位为1):源码按位取反,末位加一,前面加上符号。相当于再求一次补码。
//
//由于int型为32位,byte型为8位,那么a的值130在内存中表示形式为:00000000 00000000 00000000 10000010 ,而变为byte类型时,只能有8位,则变成了10000010。
//此时这个数代表了byte类型的源码,由于第一为1,则代表该值为负。
//所以该源码变为补码时,应该为-(01111101+1)=-(01111110)=-126
这样这节就算结束了,下一章节还会对数据类型的知识进行补充。这块的知识看似简单实则复杂,记得java存储数据是采用补码的形式。任何问题欢迎留言,相互学习,错误的地方也请指示出来^_^。