A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© laoyang 黑马帝   /  2011-11-18 13:37  /  3552 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 laoyang 于 2011-11-21 20:42 编辑

                String str=null;
                System.out.println(str+2);
居然输出了null2,这是为什么啊?
                String strone="";
                System.out.println(strone+"");
这个就什么也不输出。
这两个在内存中有什么区别吗?

8 个回复

倒序浏览
本帖最后由 潜王伟 于 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 ;   这句话在栈内是分配了空间的,但在堆内是没有分配的

如有错误,敬请指正!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
null代表了一个空对象,根本就不是一个字符串。对空对象做任何操作都不行的,除了了=和==
“” 代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。这个字符串里没有内容。看下面的实例分析:
  String str=null; 只是定义了一个句柄,也就是说你有了个引用,但是这个引用未指向任何内存空间。
  String str="";这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以你可以对它进行操作。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
比如声明一个 String str ;如果说str是null,那么内存根本没创建字符串对像,并由str引用。如果说str是空串,那么确实存在一个由str引用的字符串对像,只不过这个字符串的值是""   null用来表示一个引用没有实例存在,而""本身是一个实例,有自己的对象空间,和"zzyyxx"这样的String没什么区别。两个都是有值 !!!好好体会一下吧

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
帖子要沉下去鸟,分飞鸟
回复 使用道具 举报
徐杨 黑马帝 2011-11-18 19:15:09
地板
String s =null    s不指向任何内存地址,内存也没开辟空间,java虚拟机将会回收资源
String s =""   s指向的是空白字符,内存中开辟空间,java虚拟机不会回收资源

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
崔浩 黑马帝 2011-11-21 08:30:49
7#
如果是null没有任何使用的方法和内存,小心空指针异常
如果是“”代表是的一个长度为0字符串,可以使用字符串的相关方法

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
moonlight 黑马帝 2011-11-21 08:54:22
8#
比如声明一个 String str ;
如果说str是null,那么内存根本没创建字符串对像,并由str引用。
如果说str是空串,那么确实存在一个由str引用的字符串对像,只不过这个字符串的值是""
null用来表示一个引用没有实例存在,而""本身是一个实例,有自己的对象空间,和"zzyyxx"这样的String没什么区别。两个都是有值 !!!
回复 使用道具 举报
侯伟浩 黑马帝 2011-11-21 19:30:59
9#
null没有为对象开辟空间,""是空字符串但是它和"sdsd"是一样的,都为对象开辟了空间。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马