黑马程序员技术交流社区

标题: String中null和""的区别? [打印本页]

作者: laoyang    时间: 2011-11-18 13:37
标题: String中null和""的区别?
本帖最后由 laoyang 于 2011-11-21 20:42 编辑

                String str=null;
                System.out.println(str+2);
居然输出了null2,这是为什么啊?
                String strone="";
                System.out.println(strone+"");
这个就什么也不输出。
这两个在内存中有什么区别吗?
作者: 小王同志    时间: 2011-11-18 13:40
本帖最后由 潜王伟 于 2011-11-18 14:07 编辑

null表示没有引用任何对象,是真正的空值。
""是声明了一个对象实例,是空字符串
你可以用这个程序测试一下,就知道了:
  public   class  TestNull  {
   static  String s;
   public   static   void  main(String args[])  {
     String s1 = null ;
     String s2 = "" ;
     String s3  =   new  String( "" );

     System.out.println( " s: " + s);
     System.out.println( " s1: " + s1);
     System.out.println( " s2: " + s2);
     System.out.println( " s1==s: " + (s1 == s));
     System.out.println( " s1==s2: " + (s1 == s2));
     System.out.println( " s2==\ " \ " : " + (s2 == "" ));
     System.out.println( " s3==s2: " + (s2 == s3));
     System.out.println( " s2.equals(s1): " + s2.equals(s1));
     System.out.println( " s2.equals(s3): " + s2.equals(s3));
     System.out.println(s1.equals(s2));    // throw  java.lang.NullPointerException
    }  
}
结果:
s:null
s1:null
s2:
s1==s:true
s1==s2:false
s2=="":true
s3==s2:false
s2.equals(s1):false
s2.equals(s3):true
Exception in thread "main" java.lang.NullPointerException
        at TestNull.main(TestNull.java:17)

说明""是一个堆中值,堆空间有分配...
而null,例如代码中的这句:     String s1 = null ;   这句话在栈内是分配了空间的,但在堆内是没有分配的

如有错误,敬请指正!
作者: 赵磊5    时间: 2011-11-18 13:59
null代表了一个空对象,根本就不是一个字符串。对空对象做任何操作都不行的,除了了=和==
“” 代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。这个字符串里没有内容。看下面的实例分析:
  String str=null; 只是定义了一个句柄,也就是说你有了个引用,但是这个引用未指向任何内存空间。
  String str="";这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以你可以对它进行操作。
作者: moonlight    时间: 2011-11-18 15:09
比如声明一个 String str ;如果说str是null,那么内存根本没创建字符串对像,并由str引用。如果说str是空串,那么确实存在一个由str引用的字符串对像,只不过这个字符串的值是""   null用来表示一个引用没有实例存在,而""本身是一个实例,有自己的对象空间,和"zzyyxx"这样的String没什么区别。两个都是有值 !!!好好体会一下吧
作者: 小王同志    时间: 2011-11-18 17:35
帖子要沉下去鸟,分飞鸟
作者: 徐杨    时间: 2011-11-18 19:15
String s =null    s不指向任何内存地址,内存也没开辟空间,java虚拟机将会回收资源
String s =""   s指向的是空白字符,内存中开辟空间,java虚拟机不会回收资源
作者: 崔浩    时间: 2011-11-21 08:30
如果是null没有任何使用的方法和内存,小心空指针异常
如果是“”代表是的一个长度为0字符串,可以使用字符串的相关方法
作者: moonlight    时间: 2011-11-21 08:54
比如声明一个 String str ;
如果说str是null,那么内存根本没创建字符串对像,并由str引用。
如果说str是空串,那么确实存在一个由str引用的字符串对像,只不过这个字符串的值是""
null用来表示一个引用没有实例存在,而""本身是一个实例,有自己的对象空间,和"zzyyxx"这样的String没什么区别。两个都是有值 !!!

作者: 侯伟浩    时间: 2011-11-21 19:30
null没有为对象开辟空间,""是空字符串但是它和"sdsd"是一样的,都为对象开辟了空间。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2