http://wenku.baidu.com/view/73447d4efe4733687e21aa58.html
(1)、String abc=null; 创建一个空字符串对象
(2)、String abc=""; 创建一个字符串为空的字符串对象
(3)、String adc; 声明一个字符串对象,但没有分配内存,而1、2已经分配了内存对于(3),不能if(abc==null),或者 int length=abc.length();
1) String abc=null;
2) String abc;
3) String a="";
4) String b="";
5) String c=new String("");
6) String d=new String("");
1)等于2),java不允许一个悬挂引用,没有赋值的引用地址一律自动赋值为null,以防止访问到任意内存;
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。得出的结论:
在成员变量的定一种,String s;等同于String s=null;
在本地变量(方法变量)的定义中,String s不等同于String s=null;这时要使用s必须显示的赋值。
只要是在方法中定义变量都要显示赋初值,main()方法也不例外,而在方法之外编译器会自动赋初值。