#几种拷贝方式
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. 深拷贝
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。