Java基本数据类型详解

Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在Java中,一共有8种基本类型(primitive type),其中有4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型。

整型

整型用于表示没有小数部分的数值,它允许是负数。Java提供了4种整型,具体内容如下表所示。

类型 存储需求 取值范围
int 4字节 -2 147 483 648 ~ 2 147 483 648(正好超过20亿)
short 2字节 -32 768 ~ 32 768
long 8字节 -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807
byte 1字节 -128 ~ 127

由于Java程序必须保证在所有机器上都能够得到相同的运行结果,所以各种数据类型的取值范围必须固定。

长整型数值有一个后缀L或l(如4000000000L)。十六进制数值有一个前缀0x或0X(如0xCAFE)。八进制有i一个前缀0,例如010对应八进制中的8。

从Java7开始,加上前缀0b或0B就可以直接写二进制数。例如0b1001就是9.另外,同样是从Java7开始,还可以为数字字面量加下划线,如用1_000_000(或0b1111_0100_0010_0100_0000)表示一百万。这些下划线只是为了让人更易读。Java编译器会去除这些下划线。

package PrimitiveType;

public class PrimitiveType {
    
    public static void main(String[] args) {
        int num1 = 0b1001;
        int num2 = 1_000_000;
        int num3 = 0b1111_0100_0010_0100_0000;
        
        System.out.println(num1);
        System.out.println(num2);
        System.out.println(num3);
    }
}

运行程序输出:

9
1000000
1000000

\color{red}{注意,Java没有任何无符号(unsigned)形式的int、long、short或byte类型。}

浮点类型

浮点类型用于表示有小数部分的数值。在Java中有两种浮点类型,具体内容如下表所示。

类型 存储需求 取值范围
float 4字节 大约 ± 3.402 823 47E + 38F(有效位数为6~7位)
double 8字节 大约 ± 1.797 693 134 862 315 70E + 308(有效位数为15位)

float类型的数值有一个后缀F或f(例如,3.14F)。没有后缀F的浮点数值(如3.14)默认为double类型。当然,也可以在浮点数值后面添加后缀D或d(例如3.14D)。

\color{red}{所有的浮点数值计算都遵循IEEE 754 规范。}

具体来说,下面是用于表示溢出和出错情况的三个特殊的浮点数值:

  • 正无穷大 Double.POSITIVE_INFINITY
  • 负无穷大 Double.NEGATIVE_INFINITY
  • 不是一个数字 Double.NaN
    特别需要说明的是,不能使用 == 来检测一个特定值是否等于Double.NaN,应使用Double.isNAN方法。
package PrimitiveType;

public class PrimitiveType {
    
    public static void main(String[] args) {
        boolean bool1 = 1.0 / 0 == Double.POSITIVE_INFINITY;
        boolean bool2 = -1.0 / 0 == Double.NEGATIVE_INFINITY;
        boolean bool3 = Double.isNaN(0.0 / 0);
        
        System.out.println(bool1);
        System.out.println(bool2);
        System.out.println(bool3);
    }
}

运行程序输出:

true
true
true

char类型

char类型原本用于表示单个字符。不过,现在的情况已经有所变化。如今,有些Unicode字符可以用一个char值描述,另外一些Unicode字符则需要两个char值。

char类型的字面量值要用单引号括起来。例如:'A' 是编码值为65所对应的字符常量。它与 "A" 不同,"A" 是包含一个字符A的字符串。char类型的值可以表示为十六进制值,范围从 \u0000 到 \Uffff 。例如:\u2122 表示注册符号(™)。常用特殊字符的转义序列如下表。

转义序列 名称 Unicode值
\b 退格 \u0008
\t 制表 \u0009
\n 换行 \u000a
\r 回车 \u000d
\" 双引号 \u0022
\' 单引号 \u0027
\\ 反斜杠 \u005c

\color{red}{注意,Unicode转义序列会在解析代码之前得到处理。}

例如,"\u0022 + \u0022" 并不是一个由引号包围加号构成的字符串("+")。实际上,\u0022 会在代码解析之前转换为 " ,这会得到( ""+"" ),也就是一个空串。

package PrimitiveType;

public class PrimitiveType {
    
    public static void main(String[] args) {
        String str = "\u0022 + \u0022";
        
        System.out.println(str);
        System.out.println("************************");
        System.out.println(str.equals(""));
    }
}

程序运行输出:


************************
true

boolean类型

boolean(布尔)类型有两个值:falsetrue ,用来判定逻辑条件。

\color{red}{注意,整型值和布尔值之间不能进行相互转换。}

在C++中,数值甚至指针可以替代boolean值。值 0 相当于布尔值 false,非 0 值相当于布尔值 true。在Java中不是这样!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容