主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

Java 数据类型

变量本质上是在内存中申请存储空间来保存数据。

当我们创建一个变量时,内存管理系统会根据其数据类型分配相应的存储空间,该空间仅能用于存储特定类型的数据值。

Java 语言的数据类型主要分为两大类:

基本数据类型(Primitive Data Types)

  • 包括 byte、short、int、long、float、double、char、boolean 等
  • 直接存储数据值
  • 存储在栈内存中

引用数据类型(Reference Data Types)

  • 包括类、接口、数组等
  • 存储的是对象的引用(内存地址)
  • 实际对象存储在堆内存中

这两种数据类型的根本区别在于存储方式和内存分配机制的不同。基本数据类型直接存储值,而引用数据类型存储的是指向对象的引用。


基本数据类型

Java 有 8 种基本数据类型(primitive data types)分别为:整型(整数类型)、浮点型(小数类型)、字符型、布尔型。

byte:

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

short:

  • short 数据类型是 16 位、有符号的、以二进制补码表示的整数;
  • 最小值是-32768(-2^15)
  • 最大值是32767(2^15 - 1)
  • 默认值是0
  • 内存占用2字节;
  • Short 数据类型也可以像 byte 那样节省空间。因为 short 变量占用的空间只有int类型的二分之一;
  • 例子:short s = 1000,short r = -20000。

int:

  • byte 数据类型是 32 位、有符号的、以二进制补码表示的整数;
  • 最小值是-2,147,483,648(-2^31)
  • 最大值是2,147,483,647(2^31 - 1)
  • 默认值是0
  • 内存占用4字节;
  • 一般地整型变量默认为 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
  • 内存占用8字节;
  • 这种类型主要使用在需要比较大整数的系统上;
  • 例子:long a = 100000L,long b = -200000L。

float:

  • float 数据类型是单精度、32 位、符合 IEEE 754 标准的浮点数;
  • float 在储存大型浮点数组的时候可节省内存空间;
  • 默认值是0.0f
  • 内存占用4字节;
  • 浮点数不能用来表示精确的值,如货币;
  • 例子:float f1 = 234.5f。

double:

  • double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
  • 浮点数的默认类型为 double 类型;;
  • double 类型同样不能表示精确的值,如货币;
  • 默认值是0.0d
  • 内存占用8字节;
  • 例子:double a = 7.,double b = 8.0。

boolean:

  • boolean 数据类型表示一位的信息;
  • 只有两个取值:true 和 false;
  • 这种类型只作为一种标志来记录 true/false 情况;
  • 默认值是false
  • 内存占用字节未被严格定义;
  • 例子:boolean one = true。

char:

  • char 类型是一个单一的 16 位 Unicode 字符;
  • 最小值是\u0000(十进制等效值为 0);
  • 最大值是\uffff(即为 65535);
  • char 数据类型可以储存任何字符;
  • 内存占用2字节;
  • 例子:char letter = 'A';。

byte:

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

取值范围实例

对于 Java 基本数据类型的取值范围,开发者无需刻意记忆具体的数值边界。

因为这些关键值已经作为预定义常量,内置于各个基本类型对应的包装类中,我们可以直接通过类常量来获取。

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);
    }
}

执行上述代码后,控制台将输出如下运行结果:

基本类型:byte 二进制位数:8
包装类:java.lang.Byte
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127

基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767

基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647

基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807

基本类型:float 二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38

基本类型:double 二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308

基本类型:char 二进制位数:16
包装类:java.lang.Character
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535

引用数据类型(Reference Types)

引用数据类型是 Java 中用于存储对象(包括数组、类实例和接口实现)引用的数据类型。与基本数据类型直接存储值不同,引用数据类型存储的是对象在内存中的地址(引用)。

✅ 引用数据类型的主要特点

  • 存储的是引用(内存地址),而不是实际数据本身
  • 默认值为 null(未指向任何对象时)
  • 大小不固定,取决于所引用的对象
  • 位于堆内存(Heap Memory)中
  • 需要通过 new 关键字创建(除了字符串字面量和数组初始化语法)

✅ 引用数据类型分类

1. 类(Class)类型

  • 预定义类:如 String、System、Scanner 等
  • 自定义类:开发者自己定义的类
String str = "Hello";  // String 类
Scanner sc = new Scanner(System.in);  // Scanner 类
Person p = new Person();  // 自定义类

2. 接口(Interface)类型

  • 可以引用实现了该接口的类的对象
List<String> list = new ArrayList<>();  // List 是接口,ArrayList 是实现类
Runnable r = new MyRunnable();  // Runnable 是接口

3. 数组(Array)类型

  • 所有数组都是引用类型,即使元素是基本类型
int[] intArray = new int[10];  // 基本类型数组
String[] strArray = new String[5];  // 引用类型数组

✅ 引用数据类型的内存分配

栈内存(Stack)         堆内存(Heap)
+--------+          +----------------+
| 引用变量 | -------> |     对象实例    |
| (地址)  |          | (实际数据存储)  |
+--------+          +----------------+
  • 栈内存:存储引用变量(变量名和对象引用地址)
  • 堆内存:存储实际对象数据

✅ 引用数据类型的重要概念

1. 对象创建与引用

Person p1 = new Person();  // 创建对象并将引用赋给p1
Person p2 = p1;           // p2和p1现在引用同一个对象

2. 比较操作

  • == 比较引用(内存地址)
  • equals() 比较内容(需要正确重写)
String s1 = new String("Java");
String s2 = new String("Java");

System.out.println(s1 == s2);      // false(不同对象)
System.out.println(s1.equals(s2)); // true(内容相同)

3. 垃圾回收

  • 当对象没有任何引用指向时,会被垃圾回收器回收
Person p = new Person();
p = null;  // 之前创建的Person对象现在可以被回收

基本数据类型 vs 引用数据类型

特性 基本数据类型 引用数据类型
存储内容 实际值 对象引用(地址)
内存位置 栈内存 引用在栈,对象在堆
默认值 各类型不同(如int为0) null
大小 固定 不固定
参数传递 值传递 引用传递(传递地址)
示例 int, char, double String, 数组, 自定义类


评论区 0
发表评论
教程介绍
Java 通用高级编程语言,广泛应用在企业级应用开发、移动应用开发、大数据处理等领域。
12 章节
72 阅读
0 评论