String 字符串不可变带来的好处是什么?

String 字符串不可变带来的好处是什么? 目录一. 线程安全(数据安全)二. 节约内存三. 提高集合的存取效率一. 线程安全(数据安全)众所周知String 字符串是默认被 final 修饰的是不可变的那么首先能想到的一个优点就是线程安全String 是存放在堆中的是所有线程所共享的变量不可变这一特性就可以在多线程的情况下防止出现一个线程对 String 做修改导致另一个线程运行结果出现错误。举个最简单的例子A线程和B线程都用到了字符串 s假如说A线程把 s 做了修改那么B线程就会因为A做的修改而被迫受到影响这一点是非常不好的。二. 节约内存String 虽然是不可变的但它却可以重复利用。String 虽然是在堆中但其实分为两种情况如果我们使用 String string xxx 的方式来创建字符串那么被创建出来的字符串对象是存放在堆中的字符串常量池中的可以重复利用假如我们使用 String string new String(xxx) 的方式来创建字符串那么被创建出来的对象是直接存放在堆中的无法重复利用。我用一段代码举例同学们一下子就懂了。public static void main(String[] args) { String str1 abcdefg; String str2 abcdefg; String str3 new String(abcdefg); System.out.println(str1 str2); System.out.println(str1 str3); System.out.println(str2 str3); }运行上述代码得到如下结果可以看到str1 和 str2 都是直接赋值其实指向的是堆中的同一个字符串对象运算结果为 true而 str3 则是使用 new 对象的方式赋值并不会引用常量池中已有的 abcdefg 而是会重新在堆中新建一个再指向新的所以后两次运算都为 false所以说String 虽然不可变却可以重复利用在开发过程中几乎都是使用 String str xxx 创建字符串然后创建的字符串会被缓存到堆中的字符串常量池中在同一各项目中不管有多少个人创建字符串只要字符串内容一样其实最后都是用的常量池中的同一个字符串对象大大的降低了内存的消耗。三. 提高集合的存取效率上面说到了字符串常量池同学们也可以理解为缓存池在缓存池中不仅缓存了字符串的内容还缓存了每一个字符串对应的哈希值hashCode。当我们使用 Map 集合存取数据的时候因为 Map 集合的 Key 基本都是 String 类型所以在存和取数据的时候就不需要重复哈希值直接去缓存池中找就可以找不到才会去计算。这样一来就极大地提高了 Map 集合存取数据的效率。