String类 StringBuffer类StringBuilder类

xiaoxiao2021-02-28  98

 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.

转载请注明原文地址: https://www.6miu.com/read-62403.html

最新回复(0)