Loading

Java基础-详解String类

为什么String类是不可变的

public final class String{

    private final char[] value;
}

由以上String类的源码可以看出,String类内部使用字符数组char[]来存储字符串(Java 9后修改为byte[]字节数组),而且数组被final修饰且为私有的,String类没有提供修改该字符串方法,
以及由于String类被final修饰所以无法继承,避免子类破坏String不可变。

String与StringBuilder、StringBuffer的比较

  1. StringStringBuffer是线程安全的,而StringBuilder不是线程安全的;
  2. 只要String是不可变的,StringBuilderStringBuffer都可以修改;
  3. 性能:StringBuilder>StringBuffer>String
  4. 用途:
    • 少量数据:String
    • 大量数据单线程: StringBuilder
    • 大量数据多线程: StringBuffer

字符串 + 拼接

字符串+拼接实际上调用的是StringBuilderappend方法,再通过toString()得到String,这样如果循环内使用+拼接字符串的话会重复创建StringBuilder,可以直接使用StringBuiler避免这个问题。(JDK9之后已经解决了这个问题)

字符常量池

字符常量池是JVM给字符串专门开辟的区域,可以避免字符串重复创建,常量池在中。
字符串常量池实际上是由HashTable实现的,保存的字符串(key)对字符串对象的引用(value),字符串对象的引用则指向堆中的字符串对象。

posted @ 2024-07-19 21:38  瑞莫蒂  阅读(27)  评论(0)    收藏  举报