区别
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型 浅拷贝(Shadow Clone) 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。 深拷贝(Deep Clone) 深拷贝会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
深拷贝实现方式(4种)
最简单的深拷贝方式(序列化)
fun Serializable. deepClone ( ) : Serializable {
return Gson ( ) . fromJson ( Gson ( ) . toJson ( this ) , this . javaClass)
}
fun Parcelable. deepClone ( ) : Parcelable {
return Gson ( ) . fromJson ( Gson ( ) . toJson ( this ) , this . javaClass)
}
data class User (
var name: String,
var age: Int,
var childName: ArrayList< String>
) : Serializable
@Test
fun test2 ( ) {
val user1 = User ( "zy" , 28 , arrayListOf ( "zy1" , "zy2" ) )
val user2 = user1. deepClone ( )
println ( user1)
println ( user2)
user1. age++
user1. childName. add ( "zy3" )
println ( "改变user1后" )
println ( user1)
println ( user2)
}
User ( name= zy, age= 28 , childName= [ zy1, zy2] )
User ( name= zy, age= 28 , childName= [ zy1, zy2] )
改变user1后
User ( name= zy, age= 29 , childName= [ zy1, zy2, zy3] )
User ( name= zy, age= 28 , childName= [ zy1, zy2] )
也可以将扩展函数改成一个工具类方法
inline fun < reified T> deepClone ( data : T) : T {
return Gson ( ) . fromJson ( Gson ( ) . toJson ( data ) , T:: class . java)
}
val user2 = deepClone ( user1)