Java 数据类型分为 基本数据类型(Primitive Types)引用数据类型(Reference Types), 两者在内存存储方式、默认值、使用场景等方面都有明显区别。


1. 基本数据类型(Primitive Types)

(注意java关键字区分大小写! 所以任何大写字母开头是基本数据类型都不是基本数据类型,如Boolean)

分类 数据类型 占用内存 取值范围/内容 默认值 示例
整数型 byte 1 字节 -128 ~ 127 0 byte b = 10;
short 2 字节 -32,768 ~ 32,767 0 short s = 20;
int 4 字节 -2³¹ ~ 2³¹-1 0 int i = 30;
long 8 字节 -2⁶³ ~ 2⁶³-1 0L long l = 40;
浮点型 float 4 字节 约 ±3.40282347E+38F(7 位有效数字) 0.0f float f = 3.14f;
double 8 字节 约 ±1.79769313486231570E+308(15 位有效数字) 0.0d double d = 3.14;
字符型 char 2 字节 单个 Unicode 字符(0 ~ 65535) ‘\u0000’ char c = ‘A’;
布尔型 boolean 1 位(逻辑上) true 或 false false boolean b = true;

2. 引用数据类型(Reference Types)

分类 示例 存储内容 默认值 特点
类(Class) String, Scanner, Date 堆内存中的对象地址(引用) null 需要 new 创建对象
接口 Runnable, List 实现类对象的引用 null 只能指向实现接口的对象
数组 int[], String[] 堆内存中数组对象的引用 null 长度固定,可存放多个元素
枚举 Enum Type 枚举常量的引用 null 常用于限定取值范围

3. 主要区别

对比点 基本数据类型 引用数据类型
存储位置 栈内存,直接存储值 栈中存储引用,指向堆中对象
默认值 数字型为 0,布尔型为 false,char 为 ‘\u0000’ null
使用方式 直接操作数值 通过引用操作对象
是否需要 new 不需要 大多数需要(数组、对象等)
是否可为 null
封装类支持 有对应的包装类(Integer, Double 等) 本身就是对象类型
赋值 把“值”本身复制一份给新变量,两个变量互不影响 把“引用地址”赋值给新变量,多个变量指向同一对象,修改内容会互相影响

4.补充:String类

4.1 创建String对象

在使用直接赋值方法创建String对象时(如下代码所示)

String s = "abc";

看起来和基本数据类型直接赋值很像,但 String 实际上是一个定义在 java.lang 包中的类,属于引用数据类型
且String 对象是不可变的,任何修改(如拼接)都会生成新的对象,而不会改变原有内容。因此,String有时候会被误认为是基本数据类型,但从严格意义上它依然是引用类型。

创建String对象的两种方式

  1. 直接赋值

    String name = "Alice";
    
  2. 使用构造方法

    • 默认构造方法创建空字符串(内容为空,打印不是null)
    String s = new String();
    
    • 传入字符串初始化
    String s = new String("abc");
    
    • 字符数组初始化:应对字符串不能改变的情况,可以改变字符数组的一个或多个字符形成新的字符串
    char[] chars = {'a', 'b', 'c'};
    String s = new String(chars);
    
    • 字节数组初始化:会根据 默认字符集(通常是 UTF-8 或平台设置)把字节数组解码成字符串。
    byte[] bytes = {104, 101, 108, 108, 111}; // ASCII 对应 "hello"
    String s4 = new String(bytes);
    

4.2 String对象比较

基本数据类型的比较使用 ==即可,String对象是引用数据类型,即使两字符串内容相同,但是==在比较时是使用地址,所以要使用boolean equals方法 和 boolean equalsIgnoreCase方法(忽略大小写的比较)

boolean result = s1.equals(s2);

更多推荐