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. vue 2.0 scopedSlots和slots在render函数中的应用示例

    渲染内容为: hello from functional render scopedSlots render scopedSlots named slot of render hello from f ...

  2. Rails在MacOS上搭建Heroku部署环境

    heroku只是用postgresql,而不能兼容sqlite数据库.所以很重要的一步就是在部署实际产品的时候将数据库类型修改为postgresql,否则你将无法push到heroku上去. hero ...

  3. Redis之(三)管理命令

    4.1键管理 通过学习五种数据类型的操作命令,可以发现,Redis对每种数据的处理之前,都要先指定该数据的key,然后再指定对该数据进行何种操作. Redis中的key有点类似于Java中的变量名,起 ...

  4. shiro salt

    1.1 散列算法 散列算法一般用于生成一段文本的摘要信息,散列算法不可逆,将内容可以生成摘要,无法将摘要转成原始内容.散列算法常用于对密码进行散列,常用的散列算法有MD5.SHA.分享牛系列,分享牛专 ...

  5. Mac小技巧:快速查看指定应用程序的所有窗口

    我们知道在Mac中快速在系统所有程序中切换得快捷键为: cmd + tab 不过有时我们需要快速查看某一个程序的所有窗口,那又该如何呢? 以下方法在MacOS 10.12中测试成功! Mac默认该功能 ...

  6. Swift:Minimizing Annotation with Type Inference

    许多程序猿更喜欢比如Python和Javascript这样的动态语言,因为这些语言并不要求程序猿为每个变量声明和管理它们的类型. 在大多数动态类型的语言里,变量可以是任何类型,而类型声明是可选的或者根 ...

  7. 重新安装nginx注意事项

    记得清理/etc/nginx/sites-enabled/default

  8. linux简单命常用令

    Linux常用命令总结 切换:cd tmp cd/tmp/yun cd 切换到host目录 cd .. 显示:ll Top显示系统情况 Netstat显示网络情况 Ifconfig显示网络配置 Mor ...

  9. [Matlab]技巧笔记

    1.将字符串作为Matlab命令执行 md = 'dir'; eval(md); 2.将字符串作为系统命令执行 md = 'dir'; system(md); 3.使显示图像的坐标轴使用相同的度量单位 ...

  10. Hadoop:Hadoop单机伪分布式的安装和配置

    http://blog.csdn.net/pipisorry/article/details/51623195 因为lz的linux系统已经安装好了很多开发环境,可能下面的步骤有遗漏. 之前是在doc ...