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。