文章目录
  1. 1. final 优点
  2. 2. final 缺点

final 优点

  • 安全性: 在网络、DB连接中,参数类型是String,还有用户名密码等。如果String 可变,那这些参数值

    很容易别人改掉;网络连接,DB连接中很容易被攻击。

  • 同步和并发问题:线程安全因此没有同步问题;

  • 缓存:当编译优化时,如果两个实例值一样,那就可以new一个对象,让两个引用都指向同一个实例。JVM底层就这样设

    计的。换言之,Stirng可以改变,那一个引用改变了值,那其他指向这个实例的引用的值也改变了。

  • 类加载:String被用作类加载的参数,如果可以改变,那将加载错误的类或加载不到类。

  • Hask Key:不可变实例非常适合做hash表的key。否则,hash表的值会出现丢失情况。

  • 长度:长度是确定的,不会改变的。

final 缺点

考虑这样一个问题:为什么在JAVA的密码管理中,更倾向去使用char[]而不是String?

更具体一些的问法是:为什么在JAVA Swing中的密码输入框方法是:getPassword(return char[]), 而不是getText(return String)?

毫无意外的,这里是一个安全问题。因为String 是不可变的,这意味着你一旦创建了它则无法修改。同样也意味着在GC前你

无法彻底的删除掉它。在某些情况下,如果有人黑进了你的内存,那么被保存成String的密码则可以被人获取的。

这就是为什么 你需要使用字符数组。你可以在使用完后显式的清除它,或者你也可以用其他的别的东西去覆盖它。这样敏感

的信息就不会在系统的其他地方出现,即使此时GC还没有启动。

文章目录
  1. 1. final 优点
  2. 2. final 缺点