Java 数据类型


Java数据类型分为基本数据类型和对象类型两类。


基本数据类型

Java语言有8种基本数据类型:

  • byte:8位的有符号补码整数。byte值的范围为-128 ~ 127。
  • short:16位的有符号补码整数。short值的范围为-32,768 ~ 32,767。
  • int:默认为32位的有符号补码整数。int值的范围为-231 ~ 231-1(-2,147,483,648 ~ 2,147,483,647)。Java8及之后的版本支持无符号32位整数,范围为0 ~ 232-1(0 ~ 4,294,967,295)。通过Integer类使用无符号int。
  • long:默认为64位的有符号补码整数。int值的范围为-263 ~ 263-1。Java8及之后的版本支持无符号64位整数,范围为0 ~ 264-1。通过Long类使用无符号long。
  • float:单精度浮点数。如果要表示货币等高精度的浮点数,请使用BigDecimal类。
  • double:双精度浮点数。如果要表示货币等高精度的浮点数,请使用BigDecimal类。
  • boolean:布尔值,只有两种值true或false。
  • char:单个16位的Unicode字符。char值的范围为'\u0000' ~ '\uffff'(0 ~ 65535)。

下面是基本数据类型的值范围的例子。

import java.io.UnsupportedEncodingException;

public class BasicType {
    public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println("The smallest byte is " + Byte.MIN_VALUE);    // -128
        System.out.println("The maximum byte is " + Byte.MAX_VALUE);    // 127

        System.out.println("The smallest short is " + Byte.MIN_VALUE);    // -128
        System.out.println("The maximum short is " + Byte.MAX_VALUE);        // 127

        System.out.println("The smallest int is " + Integer.MIN_VALUE);    // -2147483648
        System.out.println("The maximum int is " + Integer.MAX_VALUE);    // 2147483647

        //int i = Integer.parseInt("4294967295"); // exception: NumberFormatException: For input string: "4294967295"
        int maxUint = Integer.parseUnsignedInt("4294967295");
        System.out.println("maxUint is " + maxUint);        // -1
        String strMaxUint = Integer.toUnsignedString(maxUint);
        System.out.println("The maximum unsigned int is " + strMaxUint);    // 4294967295

        char a = 'a';
        char wu = '五';
        System.out.println("The value of a is " + (int)a);    // 97
        System.out.println("The value of 五 is " + (int)wu);    // 20116

        // char转换成字节数组
        byte[] arrWu = new byte[] { (byte)(wu >>> 8), (byte)wu };
        System.out.println("First byte of wu is 0x" + Integer.toHexString(arrWu[0] & 0xFF));    // 0x4e
        System.out.println("Second byte of wu is 0x" + Integer.toHexString(arrWu[1] & 0xFF));    // 0x94
    }
}

基本类型默认值

如果声明一个类属性,但没有赋值给类属性,类属性会被赋给一个默认值。

byteshortint的默认值为0,long的默认值为0L,float的默认值为0.0f,double的默认值为0.0d,boolean的默认值为false,char的默认值为'\u0000'。 局部变量不会赋默认值,访问没赋值的局部变量时会报错。

下面是默认值的例子。

public class DefaultValue {
    private byte b;
    private int i;
    private short s;
    private long l;
    private float f;
    private double d;
    private boolean bool;
    private char c;

    public static void main(String[] args) {
        DefaultValue d = new DefaultValue();
        System.out.println("The default value of byte is " + d.b);    // 0
        System.out.println("The default value of short is " + d.s);    // 0
        System.out.println("The default value of int is " + d.i);        // 0
        System.out.println("The default value of long is " + d.l);    // 0
        System.out.println("The default value of float is " + d.f);    // 0.0
        System.out.println("The default value of double is " + d.d);    // 0.0
        System.out.println("The default value of boolean is " + d.bool);    // false
        System.out.println("The default value of char is \\u" + String.format("%04x", (int)d.c));    // \u0000

        int i;
        //System.out.println("i is " + i); // error: 可能尚未初始化变量i
    }
}

对象类型

常用的对象类型有数组、字符串类、基本数据类型的包装类、枚举(Enum)、集合类等。

数组

数组用来保存多个相同类型的数据,数组创建时确定了数组的长度,并且不能更改数组的长度。

下面是数组的例子。

public class Arr {
    public static void main(String[] args) {
        int[] arr = new int[3];
        arr[0] = 1;
        arr[1] = 2;
        arr[2] = 3;
        for (int element : arr)
            System.out.println(element);    // 1 2 3
    }
}

字符串

字符串是字符的序列,Java中String类用来处理字符串。String对象是不可变的,创建后不能更改。String对象之间可以通过+运算符拼接。 下面是字符串的例子。

public class Str {
    public static void main(String[] args) {
        String hello = "hello";
        String fruit = "red " + "apple";
        System.out.println(hello);    // hello
        System.out.println(fruit);    // red apple
    }
}

基本数据类型的包装类

基本数据类型byte、short、int、long、float、double、char、boolean对应的包装类为Byte、Short、Integer、Long、Float、Double、Character、Boolean类。基本类型和对应的包装类可以互相赋值,称为装箱和拆箱操作。包装类提供了一些实用方法。

下面是包装类的例子。

public class BasicWrapper {
    public static void main(String[] args) {
        Integer i = 123;
        int j = new Integer(2);
        System.out.println(i);    // 123
        System.out.println(j);    // 2
        System.out.println("The hexadecimal of " + i + " is 0x" + Integer.toHexString(i));    // 123 0x7b
    }
}

枚举

枚举是多个预定义常量的集合。枚举对象的值必须是预定义常量之一。

下面是枚举的例子。

public class Enum {
    public static void main(String[] args) {
        Fruit fruit = Fruit.BANANA;
        if (fruit == Fruit.BANANA)
            System.out.println(fruit);    // BANANA
    }
}

enum Fruit {
    APPLE, BANANA, ORANGE
}

集合类

集合类是保存多个相同类型数据的容器。常用的集合类有ArrayList、HashSet和HashMap。

下面是集合类的例子。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Collection {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<String>();
        fruits.add("apple");
        fruits.add("orange");
        fruits.add("apple");

        Set<String> pets = new HashSet<String>();
        pets.add("dog");
        pets.add("cat");
        pets.add("dog");

        Map<String, String> colors = new HashMap<String, String>();
        colors.put("apple", "red");
        colors.put("orange", "orange");

        for (String fruit : fruits)
            System.out.println(fruit);    // apple orange apple

        for (String pet : pets)
            System.out.println("\t" + pet);    // cat dog

        for (Map.Entry<String, String> entry : colors.entrySet())
            System.out.println(entry.getKey() + ": " + entry.getValue());    // orange: orange apple: red
    }
}