一次令人窒息的面试体验
事情发生在我上一份工作离职后。那段时间信心爆棚,觉得自己对JVM烂熟于心,GC啊、内存模型啊,轻轻松松就能应对。
结果到了美团面试,面试官一开口:“你能说说深拷贝和浅拷贝的区别吗?”
我心里一乐,这不送分题嘛!
“浅拷贝就是只拷贝对象的第一层,深拷贝是连引用的对象也都复制一份。”
说完我就等着夸奖,结果面试官一挑眉:“那如果对象里嵌套了多个引用,浅拷贝和深拷贝在内存上分别会是怎样的结构?”
……
完了,脑子顿时嗡嗡响,我竟然说不出具体场景,只能干巴巴地扯了点 clone() 的话题,最后草草结束。
回家路上我一直在想:这么简单的知识点,为什么我在关键时刻说不清楚?
那晚我重新捡起了笔记,从JVM内存模型、对象结构到实际代码实现,一个点一个点抠,才发现“深拷贝 vs 浅拷贝”远没有我们想象中那么简单。
什么是浅拷贝?
我们先从“浅拷贝”聊起。
浅拷贝指的是:只复制当前对象本身的字段,对于引用类型的字段,只复制引用地址,不复制其指向的对象本身。
说人话就是——表面复制一份,看起来和原来一样,其实底层的引用指向的还是同一块内存区域。
举个小例子: