String 是不可变的原因

本贴最后更新于 1808 天前,其中的信息可能已经事过景迁

概述

在 Java 中,String 是不可变的,由 final 进行修饰,但是 String 为什么是不可变的呢?本文从内存、同步和数据结构的角度进行阐述。

原因

1.字符串池的需要

字符串池是方法区一个重要的数据区域,下面这个代码只会在字符串池创建一个'abcd'对象。

String string1 = "abcd";
String string2 = "abcd";

具体引用如下图:
javastringpool.jpeg
如果 string 是可变的,那么一个引用更改字符串值就会导致另一个引用的值错误。

2.缓存 Hashcode

在 Java 中经常使用字符串的 hashcode。 例如,在 HashMap 或 HashSet 中。 作为不可变代码可以保证散列代码总是相同的,这样就不担心更改的情况下改变它。 这意味着,不需要每次使用 hashcode 时都计算它。 这样更有效率。

3.促进其他对象的使用

HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));
 
for(String a: set)
	a.value = "a";

在这个例子中,如果 String 是可变的,那么它的值可以被修改,这将违反 set 的设计(set 包含不重复的元素)。 对于诅咒,上面的例子只是为了演示,在一个真正的字符串类中没有 value 字段。

4.安全

字符串被广泛用作许多 java 类的参数,例如网络连接、打开文件等。 如果 String 不是不可变的,则连接或文件将被更改,这可能会导致严重的安全威胁。 该方法认为它是连接到一台机器,但没有。 可变字符串也可能在反射中导致安全问题,因为参数是字符串。

5.线程安全

String 是不可变的,所以它是线程安全的。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注
1 操作
2457081614 在 2020-01-10 14:47:34 关闭了该帖的回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • coderpwh 2 评论

    String 是线程安全的,你确定吗?看过源码没?

    1 回复
    麻烦你去看看,谢谢
    2457081614
    快跟他们理论理论
    someone27889
  • danbai225

    String 都是不变的了你说是不是线程安全 线程安全是针对变量而言的. 如果这个变量本身都不可以变了,也就谈不上那个什么线程安全不安全了,或者说肯定是线程安全的。

    1 回复
  • coderpwh

    肤浅

    1 回复
  • danbai225

    如果你说的对的 可以举个例子?