Java: String vs Stringbuffer

来源:互联网 发布:淘宝会员哪几种 编辑:程序博客网 时间:2024/05/11 17:15
public class FileList {    public static void main(String[] args){        String a = new String("abc");        String b = new String("abc");        System.out.println(a.equals(b));        StringBuffer c = new StringBuffer("bc");        StringBuffer d = new StringBuffer("bc");        System.out.println(c.equals(d));    }}

第1种:

String a=”abc”;
String b=”abc”;
System.out.print(a==b);

结果:true

原因:编译时,这两个”abc”被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。


第2种:

String a=new String(“abc”);
String b=new String(“abc”);
System.out.print(a==b);

结果:false

原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。


第3种

String a=”abc”;
String b=new String(“abc”);
System.out.print(a==b);

结果:false

原因:同上


第4种

String a=”abcdef”;
System.out.print(a==”abcdef”);

结果:true

原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象。


第5种

String a=”abcdef”;
String b=”“;
String c=a+b;
System.out.print(c==”abcdef”);

结果:false

原因:编译时,先将”abcedf”放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。

0 0
原创粉丝点击