String类 StringBuffer类 StringBuilder类

时间:2022-10-13 03:57:00

 String类:  

      java源码中,对string的成员变量定义,private final char value[],因此String类是不可变,不可继承的!
String s = "ABCabc";  
System.out.println("s = " + s);

s = "123456";
System.out.println("s = " + s);
打印结果为s = ABCabc ,s = 123456  是因为s并非对象,而是对象的引用,实际在内存中又new了一个 “123456”的字符串。

String不可变的好处? (为什么String要设计成不可变的):

1.性能  常量池的 运行  string不可变的设计出于性能考虑,当然背后的原理是string pool,当然string pool不可能使string类不可变,不可变的string更好的提高性能。    
2.安全   首要原因是安全,不仅仅体现在你的应用中,而且在JDK中,Java的类装载机制通过传递的参数(通常是类名)加载类,这些类名在类路径下,想象一下,假设String是可变的,一些人通过自定义类装载机制分分钟黑掉应用。如果没有了安全,Java不会走到今天

3线程安全    当多线程访问时,不可变对象是线程安全的,不需要什么高深的逻辑解释,如果对象不可变,线程也不能改变它。

4.允许了String对象缓存HashCode

java中String对象的哈希码被频繁的使用,比如在HashMap的容器中。

字符串不变性保证了hash码的唯一性,因此可以放心的进行缓存,这也是一种性能优化手段,意味着不必每次都取计算新的哈希码,在String类的定义中有如下代码:

 private int hash;//用来缓存HashCode

StringBuffer类和StringBuilder类:

他们在内部实现是用char数组,因此可变,扩容。,StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

总体效率来看,速度StringBuilder>StringBuffer>String.