string stringbuffer stringbuilder

来源:互联网 发布:电脑软件快捷键壁纸 编辑:程序博客网 时间:2024/05/22 15:07

equals 方法是 java.lang.Object 类的方法。


java虚拟机里有一个区域叫方法区,方法区里有一个常量区,如果你是String str = "abc",虚拟机认为“abc”是常量,放在常量区。下次你再定义String otherStr = “abc", 虚拟机并不新创建任何东西,而是连到刚才常量区里的”abc“,所以不管是equal还是==,都相等,因为值和地址都相等。 另外还有一个区域叫堆,如果String str = new String("abc"), 虚拟机会创建对象放到堆里,再String otherStr = new String("abc"),会在堆里放两个对象。所以==就是false,因为两个对象地址不同。

有两种用法说明:

1对于字符串变量来说,使用“==”“equals()”方法比较字符串时,其比较方法不同。

“==”比较两个变量本身的值,即两个对象在内存中的首地址。

“equals()”比较字符串中所包含的内容是否相同。

比如:

String s3 = "abc", s4 ="abc" ;

s1 = new String("abc");

s2 = new String("abc");

那么:

s1==s2  false      //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,

故不相等。

s1.equals(s2)  true     //两个变量的所包含的内容是abc,故相等。

注意(1):

如果:          StringBuffer s1 = new StringBuffer("a");
                      StringBuffer s2 = new StringBuffer("a");
                   

结果:           s1.equals(s2) //false

解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
           

          Object类中的equals方法是用来比较地址的,所以等于false.

注意(2):

对于s3s4来说,有一点不一样要引起注意,由于s3s4是两个字符

串常量所生成的变量,其中所存放的内存地址是相等的,

所以s3==s4true(即使没有s3=s4这样一个赋值语句)

  比较stringbuffer:

StringBuffer s3 = new StringBuffer("a");
StringBuffer s4 = new StringBuffer("a");
if (s3.toString().equals(s4.toString())) {
System.out.println("Yes");
} else {
System.out.println("No");
}


String类是不可变类,任何对String的改变都会引发新的String对象的生成;而StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象,可变和不可变类这一对对象已经齐全了,那么为什么还要引入新的StringBuilder类干吗?

如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;当然,如果要保证线程安全,自然非StringBuffer莫属了

0 0