Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-09-24:String为什么要设计成不可变的?

MoJieBlog opened this issue · comments

安全,常量,hashCode
即安全和性能

安全(考虑类加载的关系,多线程使用时)
性能(常量池,hashcode)

因为String设计成不可变主要是考虑性能和安全.
性能是String为常量池,hashcode
安全是在多线程使用是他是线程安全的.

1,字符串常量池的需要

​ 当创建一个 String 对象时,如果此字符串已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象

​ 如果允许改变,那么将导致各种逻辑错误,比如改变一个对象将会影响另一个独立对象,严格来说,这种常量池的**是一种优化手段

​ 2,允许String对象缓存 HashCode

​ java 中 String 对象的哈希码会被频繁的使用,比如在 hashMap中。字符串的不变形保证了hash码的唯一性,因此可以放放心的进行缓存。这也是一种优化手段,意味着不必没说都计算新的哈希码。在 String 类中有 private int hash 来缓存hashcode

​ 3,安全性

​ String 被许多的类来当做参数,如 网络url,文件路径path 等等,如果String 不是固定的,将会引起各种安全隐患

性能优化(常量池存储,字符串不变保证了Hashcode唯一性)
安全性(考虑类加载的关系,多线程使用时,网络请求时url地址)