java有8中数据类型:
数据类型 | 大小 | 表示的范围 |
boolean | 1字节或4字节 | 0或1 |
byte | 1字节 | -128~127 |
short | 2字节 | -32768~32767 |
char | 2字节 | Unicode0~Unicode2^16-1 |
int | 4字节 | -2^31~2^31-1 |
long | 8字节 | -2^63~2^63-1 |
float | 4字节 | |
double | 8字节 |
关于float和double的范围和精度问题可以参看这篇文章以及这篇文章
为什么boolean的长度既可以是1字节也可以是4字节呢?
理由来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。
数据类型的转换:
8种数据类型,我们可以将它们分为3个大类别:整数,浮点数和布尔值。
整数有5种,它们都是按照补码来编码的,分别是byte、short、char、int、long五种类型。
浮点数有两种,float和double。
布尔值就只有boolean一种了。
同一大类别之间的转换规则其实很简单。范围小的可以自动转换为范围大。范围的大小肯定是数据类型的位数有关了。范围最小的肯定是byte,范围最大的是long。所以把byte转化成long,那是一点问题都没有。可以直接用等号连接起来,也叫做隐式转换。如果你想将范围大的转换为范围小的,则必须强转。
下面写代码举例:
public class Main{ public static void main(String[] args) { byte b1 = 100; short s1= 200; int i1 = 300; long l1 = 400L; char ch = 'a'; i1 = b1; b1 = (byte) i1; l1 = i1; i1 = (int) l1; s1 = (short) ch; ch = (char) s1; i1 = ch; ch = (char) (i1+1); System.out.println(i1);//输出97 System.out.println(ch);//输出b System.out.println(ch+0);//输出98 } }
int的是java默认的运算数据类型,定义long类型时数据后面加L。
因为java的运算都是int类型的,所以:
char a= 'a';
char b= a+1;
编译报错,必须这样写:char b= (char)(a+1);
public class Main{ public static void main(String[] args) { int i1 = 300; long l1 = 400L; float f1 = 23.7f; double d1 = 28.99; f1 = i1; i1 = (int) f1; f1 = l1; l1 = (long) f1; } }
虽然float和int都是4字节,但是float表示的范围更大,更广,所以int到float可以,float到int必须强转,甚至long到flaot都是强转。
不知道大家有没有这样的疑问?
int i=1;
flaot f1=1f;
float f2 = 1.0f;
这三个数是否相等呢?
public class Main{ public static void main(String[] args) { int i=1; long l = 1; float f1=1f; float f2 = 1.0f; double d1 = 1; double d2 = 1.0; //以下输出全为true System.out.println(i==f1); System.out.println(i==f2); System.out.println(l==f1); System.out.println(l==f2); System.out.println(f1==f2); System.out.println(i==d1); System.out.println(i==d2); System.out.println(f1==d1); System.out.println(f1==d2); } }
补充一点:
public class Main{ public static void main(String[] args) { String s= "1"; char ch = '1'; System.out.println(s.equals(ch)); //以下语句报异常,不可将对象和基本数据类型用==比较 System.out.println(s==ch); } }
char和String是没有可比性了,不可能相等的。当我们去看String的equals()方法原码时,方法的参数虽然是Object但是,方法内部会判断Object instanceof String。