String的不可变性

116 阅读1分钟

首先:String的属性被final修饰,表示它不可指向新的数组。同时它的属性又被private修饰,且没有暴露和提供任何修改字符数组的方法。在调用String的任何方法时,都是复制一个新数组进行返回,而不是直接返回原对象,故String是不可变的。

其次:String的类名被final修饰,表示其不可被继承,也就没有了子类覆盖父类行为的可能。

image.png

String的不可变性有什么优点?

优点:

  1. String的不可变可以在一定程度上保证字符串 String 类的安全性,防止篡改字符串导致的SQL注入、访问危险文件等。
  2. 当字符串不可变时,字符串常量池才有意义。用字面量创建字符串时,如果String是可变的,那么就面临着字符串随时可以被修改,字符串常量池的复用也就更谈不上了。
  3. 不可变对象都是线程安全的,在多线程中String的不可变可以保证线程安全性。
  4. 也正是String的不可变性,HashSet和HashMap等容器才能实现相应的缓存功能。String是不可变的,String的哈希码也是不可变的,故String的hash码只需要计算一次,在后续用到该String的hash码时都不需要再计算了,起到了hash码缓存的效果,大大提升了性能。