String abc=null;
String abc="";
String abc;上面的三种写法有什么区别;

解决方案 »

  1.   

    zz 来自:楼上
    :)
    1:创建一个空字符串对象,
    2:创建一个字符串为空的字符串对象。
    3:声明一个字符串对象,但并没有分配内存,而1,2已经分配了内存对于最后一种表示,你不能if(abc==null),或者int length = abc.length();编译的时候会提示可能没有初始化.
      

  2.   

    String abc=null;//声明了一个变量,变量指向null对象,
    String abc="";//声明了一个变量,变量指向""(空字符串)。
    String abc=new String("");//声明了一个变量,并参照""(空字符串)构造一个字符串对象,字符长度为0。
    String abc;//这个比较特殊,如果用来声明局部变量,他的值不定,如果是在类实例变量,他同String abc=null
      

  3.   

    String abc=null;
    String abc="";上面这两种定义分别在什么时候用呢?
    这两种定义,各有什么优点,缺点呢?
      

  4.   

    String abc=null;
    String abc="";
    一般推荐使用第二种
    第一种abc指向null,很多时候要判断字符串是否为空时,容易漏掉这种情况,在调用String的相关方法的时候就会出错
    而第二种则相对简单,String的方法都可以用,判断的时候也不会出错
      

  5.   

    1) String abc=null;
    2) String abc;
    //1)等于2),和C不同,JAVA为安全原因不允许一个悬挂引用,没有赋值的引用地址一律自动赋值为NULL,以防止访问到任意内存3)String a="";
    4) String b="";
    5) String c=new String("");
    6) String d=new String("");
    3)和4)中,变量a和b将会指向同一内存地址(""的地址)
    5)和6)中,变量c和d不会指向同一地址,而是两个""内容的地址,并且和a,b不同,实际上,3)和4)相当于new String("").intern().
    String 类维护着一个字符串池,对于像3)和4)这样的赋值方法,String 会在这个池中查找字符串是否已经在池中,如果在,就直接指向该地址,如果不在,生成一个实例放入池中再指向那个地址,可见对于同样内容的字符串多次引用时3)4)的方法要比5)6)的方法剩内存,之所以这样做,是因为String 是一个内容不可变的量,运用的是设计模式GOF.FlyWeight