字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
- private修饰,表明外部的类是访问不到value的,子类也访问不到,当然String类不可能有子类,因为类被final修饰了
- final修饰,表明value的引用是不会被改变的,而value只会在String的构造函数中被初始化,而且并没有其他方法可以修改value数组中的值,保证了value的引用和值都不会发生变化
所以你一旦创建了 String 对象,那它的值就无法改变了,而很多操作字符串方法,并不是在原来的 String 上进行操作,而是生成了新的 String,例如:
当我们声明了一个 str 变量并给它赋值为“hello”时,在栈内存和堆内存中会分别开辟一块空间,堆内存中存放 str 的值“hello”,栈内存中存放“hello”在堆内存中的地址。
当我们改变 str 的值时,堆内存中的“hello”是不可变的,只能在堆内存中再开辟一块新的空间,存放新的值。
如果我们做的是字符串拼接,一次声明和一次拼接就要再堆内存中开辟三次内存空间,造成极大的内存空间浪费。
关于String不可变更多的信息:
【翻译】为什么Java中的String不可变 - wavky - 博客园www.cnblogs.com和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
总结:
- String 是不可变的,在字符串修改量极少的情况下可以使用;
- StringBuffer 是可变的,线程安全,但效率较低,在应用程序有线程安全要求时必须使用;
- StringBuilder 是可变的,线程不安全,但效率高,在应用程序没有线程安全要求时优先使用。