千家信息网

Java中String 类不可变的原因是什么

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,Java中String 类不可变的原因是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。String 类设计成不可变的原因及好处?St
千家信息网最后更新 2024年11月19日Java中String 类不可变的原因是什么

Java中String 类不可变的原因是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。


String 类设计成不可变的原因及好处?

String 设计成不可变,主要是从性能和安全两方面考虑。

1、常量池的需要

这个方面很好理解,Java 中的字符串常量池的存在就是为了性能优化。

字符串常量池(String pool)是 Java 堆内存中一个特殊的存储区域,当创建一个 String 对象时,假如此字符串已经存在于常量池中,则不会创建新的对象,而是直接引用已经存在的对象。这样做能够减少 JVM 的内存开销,提高效率。

比如引用 s1和 s2 都是指向常量池的同一个对象 "abc",如果 String 是可变类,引用 s1 对 String 对象的修改,会直接导致引用 s2 获取错误的值。

String s1 = "abc";
String s2 = "abc";

所以,如果字符串是可变的,那么常量池就没有存在的意义了。

2、hashcode 缓存的需要

因为字符串不可变,所以在它创建的时候 hashcode 就被缓存了,不需要重新计算。这就使得字符串很适合作为 HashMap 中的 key,效率大大提高。

3、多线程安全

多线程中,可变对象的值很可能被其他线程改变,造成不可预期的结果。而不可变的 String 可以自由在多个线程之间共享,不需要同步处理。

String 类是如何实现不可变的?

1、私有成员变量

String 的内部很简单,有两个私有成员变量

/** The value is used for character storage. */
private final char value[];

/** Cache the hash code for the string */
private int hash; // Default to 0

而并没有对外提供可以修改这两个属性的方法。

2、Public 的方法都是复制一份数据

String 有很多 public 方法,每个方法都将创建新的 String 对象,比如 substring 方法:

public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}
3、String 是 final 的

String 被 final 修饰,因此我们不可以继承 String,因此就不能通过继承来重写一些方法。

public final class String
implements java.io.Serializable, Comparable, CharSequence {
}
4、构造函数深拷贝

当传入可变数组 value[] 时,进行 copy 而不是直接将 value[] 复制给内部变量。

public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}

从 String 类的设计方式,我们可以总结出实现不可变类的方法:

  • 将 class 自身声明为 final,这样别人就不能通过扩展来绕过限制了。
  • 将所有成员变量定义为 private 和 final,并且不要实现 setter 方法。
  • 通过构造对象时,成员变量使用深拷贝来初始化,而不是直接赋值,这是一种防御措施,因为你无法确定输入对象不被其他人修改。
  • 如果确实需要 getter 方法,或者其他可能返回内部状态的方法,使用 copy-on-write 原则,创建私有的 copy。

看完上述内容,你们掌握Java中String 类不可变的原因是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

可变 方法 对象 字符 字符串 常量 变量 原因 成员 线程 私有 设计 安全 两个 内存 内容 性能 拷贝 效率 方面 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 应用程序怎么利用数据库端口 软件开发中介网站 西安交通大学软件开发基础 铁路版与工民建版数据库切换 网络安全承担任务怎么填 远程服务器文件传到本地电脑 电脑网络安全知识点 自己电脑怎么做linux服务器 hive显示数据库 网络安全工程师在哪里可以学习 广东荧火虫互联网科技有限公司 浙江高密度服务器价格 金融系统网络安全及防控 租服务器做项目 贵州安卓软件开发培训 服务器主板值钱吗 刀锋互娱app无法连接服务器 数据库系统 精品课程 第五届佛山网络安全宣传周启动 网络安全法宣传要点解读 冒险元素网络技术 阴阳师服务器多久开一次 数据库求数学这门课的平均成绩 云大带宽服务器价格 魔天记手游服务器叫什么名字 腾讯云云服务器课后心得 ldap服务器管理员密码 杭州游卡网络技术公司 21年网络安全宣传周是第几届 高斯数据库全名
0