Java基本数据类型

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。

 

 

 

 

 

 

 

posted @ 2017-09-14 20:11  傍晚的羔羊  阅读(192)  评论(0编辑  收藏  举报