原始类型

原始类型

Java语言提供了八种原始类型。六种数字类型(四个整数型,两个浮点型,一种字符类型,还有一种布尔型。Java的基础类型包含了如下几种:

// boolean (true|false)
var result = true;
var anotherResult = false;

// char (character)
var firstLetter = 'j';

// int (signed 32 bits integer)
var numberOfLegs = 2;

// double (64 bits floating point)
var cost = 3.78;

// long and float
// 一些更特殊的类型,它们需要后缀(L或f)长(64位整数)并浮点(32位浮点数)
var longValue = 123L;
var floatValue = 123.5f;

// byte and short
// 还有字节(带符号的8位整数)和短(带符号的16位短整数),它们仅在定义对象时占用较少的内存
record CompactHeader(byte tag, short version) {}
short value = 12;
var result = value + value;

实际上,Java中还存在另外一种基本类型void,它也有对应的包装类java.lang.Void,不过我们无法直接对它们进行操作。

整型

Java定义了四种整数类型:byte、short、intlong。所有这些类型都是有符号的、正值和负值。Java不支持无符号、只支持正值的整数。许多其他计算机语言同时支持有符号和无符号整数。然而,Java的设计者认为无符号整数是不必要的。具体来说,他们认为无符号的概念主要用于指定高阶位的行为,高阶位定义了整数值的符号。Java通过添加一个特殊的无符号右移操作符,以不同的方式管理高阶位的含义。这样,就消除了对无符号整数类型的需求。

byte

byte数据类型是8位、有符号的,以二进制补码表示的整数;最小值是-128(-2^7,最大值是127(2^7-1;默认值是0byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一。

byte a = 100byte b = -50

计算机是用二进制来表示数据的,一个字节也就是8个比特位,其中最高位表示符号位(01,故byte的取值范围为1000 00000111 1111。在Java中,是采用补码来表示数据的,正数的补码和原码相同,负数的补码是在原码的基础上各位取反然后加11000 000是补码,减一然后按位取反得到其原码1000 0000(减一得0111 1111,再按位取反得1000 0000。因为是负数,所以最小的byte值为-2^7=-1280111 1111的十进制为2^7-1=127(等比序列求和byte是一个字节,共有2^8=256种可能性,也就是-128~127

其他基本数据类型同理,char没有负值,占两个字节,所以取值范围是0~2^16-1(65535

short

short数据类型是16位、有符号的以二进制补码表示的整数,最小值是-32768(-2^15;最大值是32767(2^15 - 1short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一;默认值是0

short s = 1000short r = -20000

int

int数据类型是32位、有符号的以二进制补码表示的整数;最小值是-2,147,483,648(-2^31;最大值是2,147,483,647(2^31 - 1;默认值是0

一般地整型变量默认为int类型,除了其他用途之外,int类型的变量通常被用来控制循环和索引数组。虽然您可能认为在不需要int的较大范围的情况下,使用字节或short会比使用int更有效,但事实可能并非如此。原因是,当在表达式中使用字节和短值时,当表达式执行时,它们会被提升为int。因此,当需要使用整数时,int通常是最佳选择。

int a = 100000, int b = -200000

long

long数据类型是64位、有符号的以二进制补码表示的整数;最小值是-9,223,372,036,854,775,808(-2^63;最大值是9,223,372,036,854,775,807(2^63 -1;默认值是0L

long a = 100000LLong b = -200000L

L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。这种类型主要使用在需要比较大整数的系统上;

public class Light {

    public static void main(String[] args) {
        int lightspeed;
        long days;
        long seconds;
        long distance;

        lightspeed = 186000;

        days = 1000;

        seconds = days * 24 * 60 * 60;

        distance = lightspeed * seconds;

        System.out.print("In " + days);
        System.out.print(" days light will travel about ");
        System.out.println(distance + " miles.");
    }
}

浮点型

浮点数,也称为实数,用于评估需要分数精度的表达式。例如,诸如平方根,或正弦和余弦等超常数的计算,其值的精度需要使用浮点类型。Java实现了标准的(IEEE-754)浮点类型和运算符集。浮点类型有两种,floatdouble,分别表示单精度和双精度的数字。

float

float数据类型是单精度、32位、符合IEEE 754标准的浮点数,默认值是0.0ffloat在储存大型浮点数组的时候可节省内存空间;单精度在某些处理器上速度更快,占用的空间是双精度的一半,但当值非常大或非常小时,会变得不精确。当你需要一个分数部分,但不需要很大程度的精度时,float类型的变量是有用的。例如,当表示美元和美分时,float可以很有用。

float f1 = 234.5f

double

double数据类型是双精度、64位、符合IEEE 754标准的浮点数;浮点数的默认类型为double类型;默认值是0.0d。双精度,正如双关键字所表示的那样,使用64位来存储一个值。在一些为高速数学计算而优化的现代处理器上,双精度实际上比单精度快。所有的超越数学函数,如sin( )cos( )sqrt( ),都会返回double类型。当你需要在多次迭代计算中保持精度,或者要处理大值数字时,double是最佳选择。

double d1 = 123.4

public class Area {

    public static void main(String[] args) {
        double pi, r, a;

        r = 10.8;
        pi = 3.1416;
        a = pi * r * r;

        System.out.println("Area of circle is " + a);
    }
}

char

Java中,用于存储字符的数据类型是char。需要理解的一个关键点是,Java使用Unicode来表示字符。Unicode定义了一个完全国际化的字符集,可以代表所有人类语言中的所有字符。它是拉丁文、希腊文、阿拉伯文、西里尔文、希伯来文、片假名、汉字等几十个字符集的统一。在Java创建的时候,Unicode要求16位。因此,在Javachar是一个16位的类型。char的范围是065,536。没有负数的char。被称为ASCII的标准字符集仍然一如既往地从0127,而扩展的8位字符集ISO-Latin-1的范围是0255。由于Java的设计是为了让程序能够被编写为全球使用,所以使用Unicode来表示字符是有道理的。当然,对于英语、德语、西班牙语或法语等语言来说,使用Unicode的效率有些低,因为这些语言的字符可以很容易地包含在8位之内。但这就是全球可移植性必须付出的代价。

char类型是一个单一的16Unicode字符;最小值是\u0000(即为0;最大值是\uffff(即为65,535char数据类型可以储存任何字符;

char letter = 'A';

public class CharDemo {

    public static void main(String[] args) {
        char ch1, ch2;

        ch1 = 88;
        ch2 = 'Y';

        System.out.print("ch1 and ch2: ");
        System.out.println(ch1 + " " + ch2);
    }
}

请注意,ch1被分配的值是88,这是对应于字母XASCII(和Unicode)值,如前所述,ASCII字符集占据了Unicode字符集的前127个值。出于这个原因,所有在其他语言中使用过的字符的老把戏在Java中也能用。虽然char被设计成用来存放Unicode字符,但它也可以被用作整数类型,你可以在上面进行算术运算。例如,您可以将两个字符相加,或者递增一个字符变量的值。

public class CharDemo2 {

    public static void main(String[] args) {
        char ch1;

        ch1 = 'X';
        System.out.println("ch1 contains " + ch1);

        ch1++;
        System.out.println("ch1 is now " + ch1);
    }
}

在程序中,首先给ch1赋值X,然后,ch1被递增,结果ch1包含Y,即ASCII(和Unicode)序列中的下一个字符。这将导致ch1包含Y,即ASCII(和Unicode)序列中的下一个字符。

boolean

boolean数据类型表示一位的信息;只有两个取值:truefalse;默认值是false

类型默认值

对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。请看下面的例子:

public class PrimitiveTypeTest {
    public static void main(String[] args) {
        // byte
        System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);
        System.out.println("包装类:java.lang.Byte");
        System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
        System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
        System.out.println();

        // short
        System.out.println("基本类型:short 二进制位数:" + Short.SIZE);
        System.out.println("包装类:java.lang.Short");
        System.out.println("最小值:Short.MIN_VALUE=" + Short.MIN_VALUE);
        System.out.println("最大值:Short.MAX_VALUE=" + Short.MAX_VALUE);
        System.out.println();

        // int
        System.out.println("基本类型:int 二进制位数:" + Integer.SIZE);
        System.out.println("包装类:java.lang.Integer");
        System.out.println("最小值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
        System.out.println("最大值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
        System.out.println();

        // long
        System.out.println("基本类型:long 二进制位数:" + Long.SIZE);
        System.out.println("包装类:java.lang.Long");
        System.out.println("最小值:Long.MIN_VALUE=" + Long.MIN_VALUE);
        System.out.println("最大值:Long.MAX_VALUE=" + Long.MAX_VALUE);
        System.out.println();

        // float
        System.out.println("基本类型:float 二进制位数:" + Float.SIZE);
        System.out.println("包装类:java.lang.Float");
        System.out.println("最小值:Float.MIN_VALUE=" + Float.MIN_VALUE);
        System.out.println("最大值:Float.MAX_VALUE=" + Float.MAX_VALUE);
        System.out.println();

        // double
        System.out.println("基本类型:double 二进制位数:" + Double.SIZE);
        System.out.println("包装类:java.lang.Double");
        System.out.println("最小值:Double.MIN_VALUE=" + Double.MIN_VALUE);
        System.out.println("最大值:Double.MAX_VALUE=" + Double.MAX_VALUE);
        System.out.println();

        // char
        System.out.println("基本类型:char 二进制位数:" + Character.SIZE);
        System.out.println("包装类:java.lang.Character");
        // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台
        System.out.println("最小值:Character.MIN_VALUE="
                + (int) Character.MIN_VALUE);
        // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台
        System.out.println("最大值:Character.MAX_VALUE="
                + (int) Character.MAX_VALUE);
    }
}

下表列出了Java各个类型的默认值:

数据类型 默认值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char ‘u0000’
String (or any object) null
boolean false
上一页