Java基本数据类型

时间:2021-08-11 23:14:52

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。