#几种拷贝方式

1.保护性拷贝

String类是不可变的,但是我们能看到String提供了substring等方法能够进行字符串编辑,那substring是怎么运行的呢

public String substring(int beginIndex, int endIndex) {
       int length = length();
       checkBoundsBeginEnd(beginIndex, endIndex, length);
       if (beginIndex == 0 && endIndex == length) {
           return this;
       }
       int subLen = endIndex - beginIndex;
       return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen)
                         : StringUTF16.newString(value, beginIndex, subLen);
   }

可以看到,substring是新创建了一个String对象,而且在构造对象的时候也并没有对于String的final byte[] value进行修改,而是直接生成了新的byte[] value数组

public static byte[] copyOfRange(byte[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        byte[] copy = new byte[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

这种通过创建对象来避免线程共享的方式就称为保护性拷贝

2. 浅拷贝

浅拷贝是创建一个新对象,这个对象有着原始对象属性的一份精确拷贝。如果属性是基本类型,那么拷贝的就是基本类型的值,如果属性是引用类型,那么拷贝的就是引用类型的地址。对一个对象进行修改的时候会影响到另一个对象

3. 深拷贝

深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。