String与StringBuffer简解

  • String 

String的一个关键概念是一个String对象想创建后,就永远不能改变它。在java内String就是对象,像这样 String s=new String();赋值s="aaa";

就可以创建一个心得String对象实例.一旦为String赋值那该值将永不改变.虽然该值不可变。但其引用变量却不是这样.

如果你对String对象赋值了后想改变其值。像这样s=s.concat("abcs")。java并不会在String 对象上修改添加abcs 而是创建了一个新的对象然后把

新的对象交给String s .严格上来说java其实创建了三个对象:初始对象aaa和连接对象常量参数abcs 还有产生的新对象aaaabcs。当我们调用了s.concat后之前的String "aaa"

仍保留在内存中,但它被看做丢失状态。任何代码都没有方法访问它。

(hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值 详细了解请 参考 [1] public int hashCode()返回该对象的哈希码值。)

public class testString {
    public static void main(String agrs[])
    {
        System.out.println("String");
        String s=new String("init");
        System.out.println(s.hashCode());
        //        连接新字符串
        s=s.concat("add");
        System.out.println(s.hashCode());
        System.out.println();
    }
}

输出:

String
3237136
1948334481

从上面的例子可以看出在String 尾部追加了新字符串后String s的引用对象也随之发生了变化.可以说明Sring 在赋值后对其修改是产生一个新的String对象,再使String s引用吗,而不是直接修改。

  • StringBuffer和StringBuilder

类似于 String 的字符串缓冲区对字符串进行大量修改,java.lang.StringBuffer和java.lang.StringBuilder是最好的选择。因为它不会像String那样造成大量丢弃的String对象.下面一段代码就能区别String和Stringbuffer的区别。SUN的建议是在可能的情况下优先采用StringBuilder,因为在大多数实现中,它比StringBuffer 要快。

 

 1 public class testString {
 2     public static void main(String agrs[])
 3     {
 4         System.out.println("String");
 5         String s=new String("init");
 6         System.out.println(s.hashCode());
 7         //        连接新字符串
 8         s=s.concat("add");
 9         System.out.println(s.hashCode());
10         System.out.println();
11         
12         System.out.println("StringBuffer");
13         StringBuffer stf=new StringBuffer("init");
14         System.out.println(stf.hashCode());
15 //        连接新字符串
16         stf.append("add");
17         System.out.println(stf.hashCode());
18     }
19 }

输出:

String
3237136
1948334481

StringBuffer
1826043875
1826043875

从上面可以看出StringBuffer和StringBulider不会像String 赋值修改后会生成新的对象,而是对原始对象直接修改.

StringBulider和StringBuffer的主要区别:

StringBuilder和StringBuffer有着完全一样的api只不过Stringbulider不是线程安全的也就是说它不是线程同步的


posted @ 2015-07-23 12:46  loveplz  阅读(120)  评论(0编辑  收藏  举报