杰瑞科技汇

Java String默认值到底是什么?

核心答案

在Java中,String引用类型,而不是基本数据类型,它的默认值是 null

Java String默认值到底是什么?-图1
(图片来源网络,侵删)

详细解释

为什么是 null

Java中的变量分为两种:

  • 基本数据类型:如 int, double, char, boolean 等,它们在内存中直接存储值。

    • int 的默认值是 0
    • double 的默认值是 0
    • boolean 的默认值是 false
    • char 的默认值是 '\u0000' (空字符)。
  • 引用数据类型:如所有类(包括 String)、接口、数组等,它们在内存中存储的是一个对象的地址(引用),而不是对象本身。

    • 当一个引用类型变量被声明但没有被初始化时,它不会指向任何有效的对象,为了表示这种“不指向任何对象”的状态,Java使用关键字 null 作为其默认值。
    • null 的字面意思就是“空”,表示该引用不指向任何内存地址。

在什么情况下会出现默认值?

String 的默认值 null 主要出现在以下场景:

Java String默认值到底是什么?-图2
(图片来源网络,侵删)

类的成员变量

当一个类被实例化时,它声明的所有成员变量如果没有被显式初始化,JVM会自动为它们赋予默认值。

public class User {
    private String name; // 成员变量,默认值为 null
    private int age;    // 成员变量,默认值为 0
    public void printInfo() {
        // 直接使用 name 会发生 NullPointerException
        // System.out.println("Name: " + name.length()); // 报错!
        // 正确的做法是先检查是否为 null
        if (name != null) {
            System.out.println("Name: " + name);
        } else {
            System.out.println("Name is not set.");
        }
        System.out.println("Age: " + age); // 输出 Age: 0
    }
}
public class Main {
    public static void main(String[] args) {
        User user = new User();
        user.printInfo();
    }
}
// 输出:
// Name is not set.
// Age: 0

数组的元素

如果创建了一个 String 数组但没有为每个元素赋值,那么数组的每个元素都会是 null

Java String默认值到底是什么?-图3
(图片来源网络,侵删)
public class Main {
    public static void main(String[] args) {
        String[] names = new String[3]; // 创建一个长度为3的String数组
        System.out.println(names[0]); // 输出 null
        System.out.println(names[1]); // 输出 null
        System.out.println(names[2]); // 输出 null
        // names[0].length(); // 如果取消注释,会抛出 NullPointerException
    }
}

String 的特殊性与 (空字符串)

String 有一个非常特殊的字面量: (双引号),它代表一个长度为0的空字符串

  • 是一个有效的 String 对象,它在内存中确实存在,并且其长度为 0
  • null 表示没有 String 对象

这是一个非常重要的区别,混淆它们是常见的编程错误。

特性 null (空字符串)
含义 引用为空,不指向任何对象 引用一个有效的、长度为0的字符串对象
内存占用 仅是一个 null 引用,不占用对象内存 占用内存(在 Java 8+ 的 UTF-16 表示中,通常占用 2 字节)
调用方法 任何方法调用都会抛出 NullPointerException 可以安全地调用 String 的方法,如 .length() 返回 0, .isEmpty() 返回 true
示例 String s = null; String s = "";
public class Main {
    public static void main(String[] args) {
        String nullString = null;
        String emptyString = "";
        System.out.println("nullString == null: " + (nullString == null)); // true
        System.out.println("emptyString == null: " + (emptyString == null)); // false
        System.out.println("emptyString.isEmpty(): " + emptyString.isEmpty()); // true
        // 以下代码会抛出异常
        // int length = nullString.length(); 
        // System.out.println(length);
    }
}
  1. 默认值:Java String 作为引用类型,其默认值是 null
  2. 适用场景:主要出现在类的成员变量数组元素未显式初始化时。
  3. null vs null 表示没有对象,而 表示一个内容为空但实际存在的对象,对 null 调用任何方法都会导致 NullPointerException
  4. 最佳实践:为了避免 NullPointerException,在使用任何可能为 null 的引用(包括 String)之前,最好进行显式检查(例如使用 if (str != null)),现代Java也鼓励使用 Optional 类来更优雅地处理可能为空的值。
分享:
扫描分享到社交APP
上一篇
下一篇