您的位置:首页 > Web前端

String与StringBuffer简解

2015-07-23 12:46 197 查看
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 要快。

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();

System.out.println("StringBuffer");
StringBuffer stf=new StringBuffer("init");
System.out.println(stf.hashCode());
//        连接新字符串
stf.append("add");
System.out.println(stf.hashCode());
}
}


输出:

String
3237136
1948334481

StringBuffer
1826043875
1826043875

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

StringBulider和StringBuffer的主要区别:

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


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: