java 空字符串与null区别

举报
SHQ5785 发表于 2022/09/15 08:37:59 2022/09/15
【摘要】 1、类型      null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;      ""表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = "" ;2、内存分配      String str = null ; 表示声明一个字符串对象的引用,但指向为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:

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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。