在本版发现很多人讨论关于String的问题,发现大家见解很不一样,
很多都是从其他书本上去学习理解这个问题。
本人从java api的解释得出的答案如下,请高手指点:String s1 = "";
String s2 = ""; 
String s3=null;
String s4=null;
String s5 = new String("");
String s6 = new String("");
System.out.println(s1==s2);
System.out.println(s2);
System.out.println(s3==s4);
System.out.println(s5==s6);
s5=s6;
System.out.println(s5==s6);String s7 = new String();
String类的声明:
public final class String
extends Object
implements Serializable, Comparable, CharSequence观点一:所以它是final,String对象一旦被建立,值是不能被修改,
被String引用的变量可以被改变以指向其它的String对象,
所以给一个String变量赋值的过程是:
如果该String对象存在则将该变量指向这个String对象
不存在则先生成一个String对象,然后将该变量指向这个String对象。对String s1 = ""的解释如下:
首先生成一个空的String对象,然后将变量s1指向这个空的对象。
对String s3=null的解释如下:
首先生成一个null的String对象,然后将变量s3指向这个对象。
所以如果System.out.println(s3);将会输出null。
所以s1==s2与s3==s4都为True。
观点二:
String类有多个构造方法,其中
String()是生成一个String对象,该对象指向一个空的字符串阵列。
String(String original) 是先生成一个String对象,
然后copy一个同样的String,再将变量指向这个拷贝生成的对象。
因此String s=new String("s")相对String s="s";来讲,
是不管String对象s是否存在,都会创建一个新的String对象s
然后将变量指向它。因此s5==s6为false。自然s5==s1也是false观点三:
创建s1、s5、s7的区别:
如果内存中存在一个空的String对象,只是将变量s1指向这个空的String对象,
否则创建一个空的String对象,将变量s1指向它。
而创建s5时不管这个空的String对象是否存在,都会创建一个空的String对象并指向它。
如果不存在,它还将先创建一个再复制该创建的对象,再指向复制后的空的String对象。
而s7则不创建String对象,只是将s7指向一个空的内存空间。