null和""的区别

本文详细解析了Java中null与空字符串的区别,包括它们的类型、内存占用情况及如何正确进行比较等内容。

本文为转载文章,源地址->http://www.cnblogs.com/qiuting/p/5373571.html


1. 类型

null是一个对象的值,而不是一个字符创。
“”是一个长度为0的字符串。

2. 内存

String s = null在该定义中定义了一个String的对象,但对该对象没有具体实现,即只创建了在栈中的引用,而不创建对应的实例,因此在堆中不占用内存。
String s = ""是定义了一个String对象,并赋值为长度为0的字符串,该字符串在堆中占有内存空间。

示例程序:

public class Demo{
    public static void main(String[] args){
        String str1 = "";
        String str2 = new String();
        String str3 = null;

        System.out.println(str1 == str2); //比较str1和str2的内存地址,返回false
        System.out.println(str1.equals(str2)); //比较str1和str2的内容,返回true
        System.out.println(str1.equals(str3)); //比较str1和str3的内容,返回false
        System.out.println(str3.equals(str1)); //会引发空指针错误java.lang.NullPointerException 
    }
}

3. 比较字符串为空的几个方法

if(s == null || s.equals) // 这种比较方法要调用equals方法相对而言效率比较低
if(s == null || s.length ==0) //这种比较方法相对于上一种比较方法效率有所提升
if(s == null || s.isEmpty()) //这种方法在SE6.0出来后才开始使用
if(s == null || s == "") //这种方法最为简洁,效率也比较快

PS:s == null这个语句不可或缺,且必须在比较的第一位,否则将引发空指针错误(java.lang.NullPointerException)

<think>我们正在讨论的是编程中的nullNULL区别。根据用户提供的引用内容,我们可以总结如下: 1. 在C/C++语言中,NULL是一个系统关键字,用于表示空指针。而null(全部小写)并不是关键字,除非用户自定义,否则没有特殊含义。 2. C/C++对大小写敏感,因此NULLnull是不同的标识符。 3. 在C++11标准中,引入了nullptr关键字,用于解决NULL在整数0空指针之间的二义性问题。 引用[3]引用[4]都提到,在C/C++中,NULL通常被定义为0或者(void*)0(在C中),而null如果没有被定义,则只是一个普通的标识符,没有特殊意义。如果用户自己定义了null为0,那么它也可以用于空指针赋值,但这并不是标准做法。 因此,主要区别在于: - NULL是标准库中定义的空指针常量(通常是一个宏定义)。 - null(小写)不是标准中的保留字,除非用户自己定义,否则编译器不会将其识别为空指针常量。 另外,引用[4]还提到,在C语言中,使用%p%x打印指针地址时的格式区别:%p会以16进制输出内存地址,并且输出8个字符(32位系统)或16个字符(64位系统),而%x则输出6个字符(32位)或8个字符(64位),但实际长度取决于系统。%p格式保证输出指针的完整地址,而%x只是以16进制形式输出整数,如果指针大小超过整数大小,则可能会导致截断。 根据以上信息,我们可以组织回答如下: ### nullNULL区别 在编程中,nullNULL区别主要取决于编程语言上下文。下面以C/C++语言为例进行说明。 #### 1. **大小写敏感性与关键字定义** - **NULL**:是C/C++标准库中定义的空指针常量,通常通过宏定义为`0`或`(void*)0`(在C中)。它是一个关键字级别的标识符,用于表示空指针[^3][^4]。 - **null**:不是C/C++标准中的关键字。如果没有用户自定义,编译器会将其视为普通标识符(如变量名)。如果用户自行定义(例如`#define null 0`),则可以模拟NULL的行为,但这不是标准做法[^3][^4]。 #### 2. **使用场景示例** - 正确使用NULL: ```c int *ptr = NULL; // 正确:ptr被初始化为空指针 ``` - 错误使用null: ```c int *ptr = null; // 错误:除非用户定义了null,否则编译失败 ``` 如果用户自定义了null,则可以编译: ```c #define null 0 int *ptr = null; // 此时等价于ptr=0 ``` #### 3. **C++11中的nullptr** C++11引入了`nullptr`关键字,专门用于表示空指针,解决了NULL可能被解释为整数0的歧义问题[^3]。例如: ```cpp void func(int); void func(char*); func(NULL); // 可能调用func(int),因为NULL可能是0 func(nullptr); // 明确调用func(char*) ``` #### 4. **其他语言中的情况** - **Java**:`null`是关键字(小写),表示空引用。不存在`NULL`(大写)关键字[^1]。 - **JavaScript**:`null`是基本类型之一,表示“空值”;而`NULL`或`Null`只是普通变量,除非被赋值,否则未定义(ReferenceError)[^1]。 - **SQL**:通常使用`NULL`(大写)表示缺失值,但具体语法依赖于数据库实现(如MySQL中`IS NULL``= NULL`的行为差异)[^2]。 #### 5. **打印指针时的格式说明符** - 在C语言中,使用`%p`以16进制完整输出指针地址(自动补0至系统指针长度),而`%x`仅输出无符号整数的16进制形式,可能截断高位[^4]。例如: ```c int a = 10; int *p = &a; printf("p=%p\n", p); // 输出类似0x7ffeeb39d25c printf("p=%x\n", p); // 输出类似eb39d25c(64位系统下可能丢失高位) ``` ### 总结 | 特性 | NULL | null | |------------|--------------------------|--------------------------| | **C/C++** | 标准空指针常量(宏定义) | 非标准,依赖用户定义 | | **Java** | 无 | 关键字(表示空引用) | | **JavaScript** | 无 | 基本类型(表示空值) | | **SQL** | 关键字(表示缺失值) | 无特殊含义 | **最佳实践**:遵循语言规范,使用标准的空值表示(如C/C++用`NULL`或`nullptr`,Java/JS用`null`),避免混用大小写形式[^3][^4]。 §§相关问题§§ 1. 为什么C++11要引入nullptr? 2. 在Java中,null空字符串("")有何区别? 3. 如何处理SQL查询中的NULL值? </think>### nullNULL区别详解 nullNULL在编程中的区别主要体现在**大小写敏感性、语言规范应用场景**三个方面,下面结合您的引用内容进行详细分析: #### 1. **大小写敏感性与语言规范** - **C/C++语言**: - `NULL` 是标准库定义的空指针常量(通过宏实现),通常定义为 `0` 或 `(void*)0`[^3][^4]。 - `null` 是普通标识符,没有特殊含义(除非用户自定义)。直接使用 `null` 会导致编译错误[^4]。 - 示例: ```c int *p = NULL; // 正确:空指针初始化 int *q = null; // 错误:未定义的标识符 ``` - **Java语言**: - `null` 是关键字,表示空引用(如 `String s = null;`)[^1]。 - `NULL` 没有特殊含义,只是普通字符串(如 `String s = "NULL";`)[^1]。 - **JavaScript**: - `null` 是基本类型,表示"空值"。 - `NULL` 被视为未定义的变量(触发 `ReferenceError`)。 #### 2. **内存地址表示差异(C/C++)** 在指针操作中,`NULL` 表示空地址(通常是 `0x00000000`),而 `null` 无此功能。使用 `%p` `%x` 打印指针时: ```c int *p = NULL; printf("p=%p\n", p); // 输出:p=00000000(完整地址) printf("p=%x\n", p); // 输出:p=0 (简化的16进制) ``` - `%p` 专用于指针,输出系统位宽完整的地址(64位系统为16字符)[^4]。 - `%x` 仅输出低位地址(可能丢失高位信息)[^4]。 #### 3. **C++11的nullptr解决方案** C++11引入 `nullptr` 解决 `NULL` 的二义性问题: ```cpp void func(int); void func(char*); func(NULL); // 歧义:可能调用func(int) func(nullptr); // 明确调用func(char*) ``` - `NULL` 本质是整数 `0`,在重载时可能被误认为整型[^3]。 - `nullptr` 是明确的指针类型,避免隐式转换问题[^3]。 #### 4. **SQL中的特殊行为** - `IS NULL` 是标准语法(如 `SELECT * FROM table WHERE col IS NULL`)[^2]。 - `= NULL` 在MySQL中有效但非标准,结果可能不符合预期(因 `NULL` 表示未知值)[^2]。 #### 总结:核心区别 | 特性 | NULL | null | |--------------|-------------------------------------|-------------------------------------| | **C/C++** | 系统宏(空指针) | 普通标识符(未定义则编译错误) | | **Java** | 普通字符串 | 关键字(空引用) | | **语义** | 表示"空地址"或数值0 | 仅作为自定义符号 | | **标准支持** | 语言/库标准定义 | 无特殊含义 | > **最佳实践**:始终使用语言规范的空值表示(如C用 `NULL`,Java用 `null`),避免混淆大小写[^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值