标签:
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引用吗,而不是直接修改。
类似于 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不是线程安全的也就是说它不是线程同步的
标签:
原文地址:http://www.cnblogs.com/loveplz/p/4670153.html