java 空字符串与null区别

1、类型

null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;

""表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = "" ;

2、内存分配

String str = null ; 表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;

String str = ""; 表示声明一个字符串类型的引用,其值为""空字符串,这个str引用指向的是空字符串的内存空间;

在java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap):

就如下:

String str = new String("abc") ;

ps:=左边的是存放在栈中(stack),=右边是存放在堆中(heap)。

3、示例程序:

public class String_Demo {/*** @param args*/public static void main(String[] args) {        String str1 = new String() ;String str2 = null ;String str3 = "" ;System.out.println(str1==str2);                // 内存地址的比较,返回falseSystem.out.println(str1.equals(str2));         // 值的比较,返回falseSystem.out.println(str2==str3);                // 内存地址的比较,返回falseSystem.out.println(str3.equals(str2));         // 值的比较,返回falseSystem.out.println(str1==str3);                // 内存地址的比较,返回falseSystem.out.println(str1.equals(str3));         // 值的比较,返回true}
}

通过如上的程序可以得出如下结论:

字符串对象与null的值不相等,且内存地址也不相等;

空字符串对象与null的值不相等,且内存地址也不相等;

创建一个字符串对象的默认值为"";

" "分配了内存 ;null没有;

调用null的字符串的方法会抛空指针异常。

""是一个字符串(String),它在内存中是存在的。它可以使用Object对象中的方法(如"".toString();"".equals()) 。 而null它是一个空对象,在内存中是不存在的,它不可以使用Object对象中的方法。

""占内存,在内存中会分配一个空间.;null不占内存,为空引用。

String str1 = null; str1引用为空;

String str2 = "";  str2引用一个空串 。

也就是null没有分配空间,""分配了空间,因此str1还不是一个实例化的对象,而str2已经实例化。

注意因为null不是对象,""是对象。所以比较的时候必须是 if(str1==null){....}和if(str2.equals("")){} 

对象用equals比较,null用等号比较。因此,如果str1=null;下面的写法错误:

if(str1.equals("")||str1==null){//如果str1没有值,则....

//.....

}

正确的写法是 if(str1==null||str1.equals("")){ //先判断是不是对象,如果是,再判断是不是空字符串

//...

}

补充

Java里面,类的对象都是用句柄来访问的,就像C里面的指针。

而在Java里面有两个比较相等的方法一个是用“==”,另一个是String 里面的equals()方法,两个的区别是,前者比较的是地址,后者比较的是内容。

例如你写了这样的一个语句

String str1,str2;

那就是定义了两个指向不同String实例的句柄,现在他们都是指向null 的所以str1==str2==null,此时你不能用length()方法,因为,他们都没有指向具体的对象,如果调用这个方法的话,会返回一个 NullPointerException。之后,如果你写了这样的语句 str1=new String(); 那么str1将指向一个具体的String实例,所以str1!=str2,str1!=null,而且更重要的是str1!="",因为""与str1所指的是两个不同的地址。 但方法str1.length()的返回值就是0了,也就是字符串为空。同样即使你再这样写str2=new String(); 这个时候依然是str1!=str2,因为他们指向的是两个不同的地址,但如果你用str1.equals(str2)的话,返回值就是true,因为他们的内容相同,都为空。

PS:

你可以这么想,一个残疾人,虽然他是残疾的,但是他还是可以调用他的方法,他可以吃饭,但是如果这个人都不存在了,吃饭更无法执行了。

美文美图

Java进阶(二十一)java 空字符串与null区别相关推荐

  1. java中String值为空字符串与null的判断方法

    Java空字符串与null的区别 1.类型        null表示的是一个对象的值,而不是一个字符串.例如声明一个对象的引用,String a=null.        ""表 ...

  2. java 空串占用内存吗_java空字符串“”和null区别

    空字符串"" 1.类型:""是一个空字符串(String),长度为0,占内存,在内存中分配一个空间,可以使用Object中的方法(.toString()等) 2 ...

  3. Java 空格“ ”、空字符串“”和null区别

    空格" " 空字符串"" 1.类型:""是一个空字符串(String),长度为0,占内存,在内存中分配一个空间,可以使用Object对象中的 ...

  4. Java空字符串和null

    转载 Java空字符串与null的区别 1.类型 null表示的是一个对象的值,而不是一个字符串.例如声明一个对象的引用,String a=null.        ""表示的是一 ...

  5. Java进阶 主键和外键的使用区别

    文章目录 Java进阶 主键和外键的使用区别 一.主外键定义 二.主外键用法&意义 三.如何创建外键 Java进阶 主键和外键的使用区别 一.主外键定义 主键,primary key:是被挑选 ...

  6. 计算机java语言教程,计算机JAVA教程二讲Java语言基础知识.doc

    计算机JAVA教程二讲Java语言基础知识 2.1简单数据类型 2.1.1 标识符和保留字 1.标识符 程序员对程序中的各个元素加以命名时使用的命名记号称为标识符(identifier).Java语言 ...

  7. 从零开始学JAVA:二、Java基本语法(四)——流程控制

    从零开始学JAVA:二.Java基本语法(四)--流程控制 程序流程控制 1.顺序结构 2.分支结构 2.1.if-else结构 2.2.switch-case选择结构 2.3.Scanner类的使用 ...

  8. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  9. 空字符串和null有什么区别

    空字符串和 null 有很大的区别. 空字符串是一个长度为 0 的字符串,它是一个有效的字符串,代表着没有任何内容. 而 null 则表示没有任何值,不是一个有效的字符串,也不代表任何意义.它指向了一 ...

最新文章

  1. “最害怕过周末”、“希望每天都干活”、“水电费又白交了”
  2. vuejs 中如何优雅的获取 Input 值
  3. vue工程打包上线样式错乱问题 - bug解决(4种)
  4. 滚动插件jQuery Marquee
  5. 单双号限行,今天是否绿色出行
  6. php相关知识,PHP的基础知识简单介绍
  7. Git——版本管理工具(一)
  8. python-unittest学习2--生成报告
  9. java实验报告实验思路_20145307第一周JAVA实验报告
  10. 算法笔记练习 题解合集
  11. 如何免费将XPS转Word格式
  12. 流光容易把人抛,红了樱桃,绿了芭蕉
  13. 深入理解Moya设计
  14. 医学影像开源数据集汇总
  15. c语言程序设计西华大学,知到C语言程序设计(西华大学)章节答案
  16. 用计算机管理硬盘分区,硬盘分区diskgenius工具使用方法,教你如何进行硬盘管理...
  17. 某宝2020最新登录加密算法和滑小鸡算法
  18. 深度学习平台——Paddle核心框架介绍
  19. 开放式式商业模式_开放式和封闭式耳机之间有什么区别,我应该得到什么?
  20. 解决D3.zoom()缩放和平移初始化时图形位置会跳跃的问题(v6版本)

热门文章

  1. 激光雷达(二)——三角测距法和TOF原理
  2. 采用Slwave提取PCB差分走线的S参数
  3. 复古纹路绩效考核培训PPT模板
  4. 太极分布式事务处理框架TJDTP使用指南
  5. vue+element-tiptap
  6. python之泊松融合
  7. 关于STM32与GSM模块之间简单应用
  8. 东莞横沥塑料模具设计与制造的主要工艺流程
  9. php将数字转换人民币显示,php如何实现人民币数字转大写
  10. linux直播电视软件下载,PPS网络电视 for Linux - 集P2P直播点播于一身的网络电视