final的使用:

以String类为例,类和类中的所有属性都是final的

  1. 属性使用final修饰保证了该属性是只读的,不能修改
  2. 类用final修饰保证了该类中的方法不能被覆盖,防止子类无意间破坏不可变性

保护性拷贝:

substring方法

  1. public String substring(int beginIndex) {
  2. if (beginIndex < 0) {
  3. throw new StringIndexOutOfBoundsException(beginIndex);
  4. }
  5. int subLen = value.length - beginIndex;
  6. if (subLen < 0) {
  7. throw new StringIndexOutOfBoundsException(subLen);
  8. }
  9. return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
  10. }

其内部调用了string的构造方法创建了一个新字符串

  1. public String(char value[], int offset, int count) {
  2. if (offset < 0) {
  3. throw new StringIndexOutOfBoundsException(offset);
  4. }
  5. if (count <= 0) {
  6. if (count < 0) {
  7. throw new StringIndexOutOfBoundsException(count);
  8. }
  9. if (offset <= value.length) {
  10. this.value = "".value;
  11. return;
  12. }
  13. }
  14. if (offset > value.length - count) {
  15. throw new StringIndexOutOfBoundsException(offset + count);
  16. }
  17. this.value = Arrays.copyOfRange(value, offset, offset + count);
  18. }

构造新字符串的对象时,会生成新的char[] value,对内容进行复制,这种通过创建副本对象来避免共享的手段称为【保护性拷贝】