面试 | String 为什么要设计成不可变的?

1 如何理解不可变

不可变通常指这个类声明的对象不可变,即对象初始化完毕就不能改变它的状态。对象的状态就是由它的属性决定的,即全局变量;那么不可变对于基本数据类型的属性(全局变量)就是值无法改变,不可变对于引用类型的属性(全局变量)就是其指向的对象以及对象的状态不可变。

2 String不可变体现在什么地方
  • String类在定义时声明为final类型,告诉编译器我是不可变的类;
  • String类全局变量都定义为private final类型,且不提供get和set方法,表明对象一旦初始化,属性值就无法改变;
3 String设计成不可变有什么好处
  • 线程安全。不可变类表明类的属性初始化后不可改变,即对象的不可变;那么当多线程来访问此对象时不用担心线程安全问题,所以String类的对象是线程安全的;
  • 符合字符串常量池的设计。当我们声明一个字符串对象时,编译器首先会去字符串常量池中查找是否存在,若存在则把字符串引用直接指向池中的对象,避免重复声明;若不存在则生成一个对象并放入到池中,供后续使用;虽然String不是Java语言的基本数据类型,但使用非常频繁,避免重复声明可以节省一大部分的内存开销,从而减少GC的时间。
  • 确保hashCode的唯一性。hashMap中是以key的hashCode为存储地址,地址当然是不变的好,不然如何查找可变的地址;不可变String对象的hashCode是唯一的,所以能很好的适用hashMap中的key;

PS:如果想了解到更多关于Java、C、CPP等语言方面的特性知识;分布式开发zk的使用;mysql数据库的特性等;欢迎关注我们的公众号。
公众号
PS:内容丰富全面,共同进步!欢迎你的关注!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值