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);                // 内存地址的比较,返回false
        System.out.println(str1.equals(str2));         // 值的比较,返回false
        System.out.println(str2==str3);                // 内存地址的比较,返回false
        System.out.println(str3.equals(str2));         // 值的比较,返回false
        System.out.println(str1==str3);                // 内存地址的比较,返回false
        System.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进阶(二十三)java中long类型转换为int类型

    java中long类型转换为int类型 由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参 ...

  2. AngularJS进阶(二十一)Angularjs中scope与rootscope区别及联系

    Angularjs中scope与rootscope区别及联系 scope是html和单个controller之间的桥梁,数据绑定就靠他了.rootscope是各个controller中scope的桥梁 ...

  3. Java进阶(二十)解疑答惑之何时字符串才算真正为空?

    解疑答惑之何时字符串才算真正为空? 在一次编码过程中,有一个现象一直困扰着自己,经过后台的不断调试,才发现原来有时候字符串的空非空.测试代码如下: // medname可为药品名称或药品ID Stri ...

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

    java中String值为空字符串与null的判断方法 2018年01月21日 14:53:45 阅读数:1189 Java空字符串与null的区别 1.类型 null表示的是一个对象的值,而不是一个 ...

  5. Java空字符串与null的区别和判断字符串是否为空的方法

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

  6. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  7. Java进阶(三十一) Web服务调用

    Java进阶(三十一) Web服务调用 前言 有朋友问了一个问题:如何调用已知的音乐服务接口,服务文档如下: https://www.evernote.com/shard/s744/sh/c37cd5 ...

  8. Java进阶(五十一)Could not create the view: An unexpected exception was thrown

    Java进阶(五十一)Could not create the view: An unexpected exception was thrown 今天打开Myeclipse10的时候,发现server ...

  9. Java进阶(五十一)必须记住的Myeclipse快捷键

    Java进阶(五十一)必须记住的Myeclipse快捷键 在调试程序的时候,我们经常需要注释一些代码,在用Myeclipse编程时,就可以用 Ctrl+/ 为选中的一段代码加上以 // 打头的注释:当 ...

随机推荐

  1. Data access between different DBMS and other txt/csv data source by DB Query Analyzer

        1 About DB Query Analyzer DB Query Analyzer is presented by Master Genfeng,Ma from Chinese Mainl ...

  2. 虚拟机克隆,并设置新的ip

    6.1克隆新的虚拟机 选中某个虚拟机-à右键à管理à克隆 选择下一步 选择下一步 点击完成 6.2修改主机名 [root@hadoop3 ~]# vim/etc/sysconfig/network 将 ...

  3. Eclipse调试(2)——各种类型断点设置

    本文是Eclipse调试(1)--基础篇 的提高篇.分两个部分: 1) Debug视图下的3个小窗口视图:变量视图.断点视图和表达式视图 2) 设置各种类型的断点 变量视图.断点视图和表达式视图 1. ...

  4. 让sublime总是在新选项卡打开新文件

    sublime的一个默认设置让人很不爽,比如现在选项卡里面已经打开了一个文件A,当你从左边side bar里面点击一个新文件B时,如果你不是快速的双击,且A没有处于编辑未保存状态,那么B就会覆盖A的选 ...

  5. 获取客户信息SQL

    /*取客户信息SQL*/ --客户信息 SELECT hou.name 业务实体, hca.account_number 客户编号, hp.party_name 客户名称, arp_addr_pkg. ...

  6. [django]用fastcgi部署

    django官方已经开始弃用fastcgi来部署django应用了,作为以前使用过的用户,还是贴一个配置,用来做纪念吧.. 项目下 #! /bin/sh case "$@" in ...

  7. [Python]print vs sys.stdout.write

    之前只是在项目中看到过,没怎么注意,正好跟对象一起看python学习手册,看到了这个部分于是来研究下. python版本 2.7.x os  win7 print  一般就是执行脚本的时候,把信息直接 ...

  8. HDFS的读数据过程分析

    我们继续在 FileSystem 类分析,读数据使用的是 open(-)方法,我们可以看到源码 FSDataInputStream in = fileSystem.open(new Path(&quo ...

  9. python学习资料整理

    [1] The Python Tutorial [2] Numpy Quick Start Tutorial [3] Python-OpenCV [4] http://www.learnpython. ...

  10. 巨星陨落 - Jim Gary

    偶然在微软Research中搜论文时搜到了神牛Jim Gary的paper,看着照片有点眼熟,貌似在买过的哪本书中见过.于是就饶有兴致地看着Jim的生平介绍,结果-  "Dr. Gray j ...