Java基础整理-为什么String是不可变的

为什么String是不可变的

String所有属性都被final修饰、私有的并且没有提供修改方法。 (主要字段是char数组,虽然被final修饰但数组是可变的,私有保证了不被修改但还是可以通过反射来改变String)

为什么String设计成final

避免被继承后破坏,防止方法被重写

为什么String设计成不可变的
  1. 字符串常量池的需要,提升效率和减少内存分配
  2. 安全性考虑,防止被意外修改(HashSet中存的值如果是可变的String,则破坏了唯一性;不可被写所以线程安全;)
  3. 作为HashMap、HashTable等hash型数据key的必要。因为不可变的设计,jvm底层很容易在缓存String对象的时候缓存其hashcode,这样在执行效率上会大大提升。
创建变量
  • 显式的String常量
    String a = "test";
    在常量池中创建了String对象,若存在则不创建返回相同对象
  • String对象
    String a = new String("test");
    Class被加载时就在常量池创建了String对象(若有就不创建),执行时在堆中创建String对象
intern()方法

intern用来返回常量池中的某字符串,如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用。否则,在常量池中加入该对象,然后返回引用。

推荐阅读:

Java-String.intern的深入研究

Java中字符串内存位置浅析

Java中的String为什么是不可变的? -- String源码分析

请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值