不一样的深拷贝

var data = [{
name:‘ya’,
list:[
{name:‘dddd’}
]
}]
JSON 是对象 作用处理json格式的数据 其实就是数组和对象
JSON.stringify 将数据或者对象,变为 json 字符串 并【返回字符串】
var dataStr = JSON.stringify(data)
console.log(dataStr)
console.log(typeof dataStr)
console.log(dataStr.slice)

   JSON.parse() 将json 字符串转化为 数组或者对象;并【返回】数组或者对象
    var res = JSON.parse(dataStr)
    res.push({
        name:'周超'
    })
    console.log(res)
    console.log(data)
  json 字符串 与 普通字符串
  都是字符串;没区别;json 字符串长的像数组和对象;其实是字符串

 json 对象与 普通对象和数据区别是啥
 没区别。 就是普通数组和对象。就是再 json 文件中按照 规定写。
<think>首先,用户的问题是:“两个内存地址一样了,深拷贝吗?那深拷贝是什么?” 这个问题是基于之前的对话,其中讨论了浅拷贝和对象内存地址。 回顾之前的对话: - 用户第一次问浅拷贝改变name是否影响emp1,我解释了浅拷贝后修改String会影响原始对象,因为String是immutable。 - 第二次用户问emp1和emp2是否指向同一个对象,我解释它们指向同的对象,内存地址同。 - 现在用户说“两个内存地址一样了,深拷贝吗?那深拷贝是什么?”,这表明用户可能误解了浅拷贝和深拷贝的区别。 关键点: - **浅拷贝(Shallow Copy)**:创建一个新对象,然后将原始对象的字段复制到新对象。如果字段是基本类型,复制;如果字段是引用类型,复制引用(即内存地址),所以原始对象和拷贝对象共享引用类型的对象。 - **深拷贝(Deep Copy)**:创建一个新对象,然后递归复制所有字段引用的对象。因此,原始对象和拷贝对象完全共享任何引用的对象;所有嵌套对象都是独立的。 在之前的回答中: - 当使用BeanUtils.copyProperties(浅拷贝)时,emp1和emp2是同对象(内存地址同),但它们的引用类型字段(如address)如果修改,会影响彼此,因为它们指向同一个对象。 - 用户现在认为内存地址同就是深拷贝,但这是错误的。内存地址同只意味着是新对象,但浅拷贝也会创建新对象,只是共享引用。 所以,我需要澄清: - 浅拷贝也会创建新对象,所以内存地址同。 - 深拷贝仅创建新对象,还复制所有嵌套对象。 - 给出定义和例子。 结构我的回答: 1. 直接回答用户的问题:内存地址同并意味着深拷贝。 2. 解释浅拷贝和深拷贝的区别。 3. 提供代码示例来演示。 4. 根据规则,在末尾提出3-5个相关问题,以“§§相关问题§§”开头。 确保回答: - 用中文。 - 回答后必须有“§§相关问题§§”,然后是3-5个问题。 - 问题基于用户的问题和我的回答。 最终输出格式: - 回答内容。 - 然后“§§相关问题§§”在一行。 - 接着1. 2. 3. 等问题。 相关问题想法: 1. 如何实现深拷贝在Java中? 2. 深拷贝和浅拷贝在性能上有什么区别? 3. 在浅拷贝中,哪些情况下修改属性会影响原始对象? 4. 为什么String在浅拷贝中表现同? 5. 使用序列化实现深拷贝的优缺点是什么? 确保问题数量在3-5个。 </think> ,**内存地址同并意味着是深拷贝**。浅拷贝也会创建新对象(内存地址同),但深拷贝有更严格的定义。以下是详细解释: ### 浅拷贝 vs 深拷贝核心区别 | 特性 | 浅拷贝 (Shallow Copy) | 深拷贝 (Deep Copy) | |--------------|-----------------------------------------------|---------------------------------------------| | **对象创建** | 创建新对象(内存地址同) | 创建新对象(内存地址同) | | **引用处理** | 仅复制引用(嵌套对象仍共享) | 递归复制所有嵌套对象(完全独立) | | **内存影响** | 修改基本类型或String安全,修改可变对象会共享 | 所有属性(包括嵌套)修改互影响 | ### 关键验证示例 假设 `Employee` 类包含 `Department` 引用: ```java class Department { String name; // 可变对象 } // 浅拷贝演示 Employee emp1 = new Employee(new Department("技术部")); Employee emp2 = BeanUtils.copyProperties(emp1); // 浅拷贝 // 修改 emp2 的嵌套对象 emp2.getDepartment().setName("市场部"); System.out.println(emp1.getDepartment().getName()); // 输出"市场部"(共享对象被修改!) System.out.println(emp1 == emp2); // false(对象地址同) ``` ### 深拷贝是什么? **深拷贝(Deep Copy)** 是指: 1. **完全独立复制**:仅创建新对象,还递归复制所有嵌套引用指向的对象。 2. **实现方式**: - 手动实现:重写 `clone()` 方法并递归调用 - 序列化:通过 `ObjectOutputStream` 和 `ObjectInputStream` - 工具库:如 Apache Commons Lang 的 `SerializationUtils.clone()` ```java // 深拷贝示例(使用序列化) import org.apache.commons.lang3.SerializationUtils; Employee emp1 = new Employee(new Department("技术部")); Employee emp3 = SerializationUtils.clone(emp1); // 深拷贝 emp3.getDepartment().setName("市场部"); System.out.println(emp1.getDepartment().getName()); // 输出"技术部"(未受影响) ``` ### 为什么用户混淆? - **内存地址同 ≠ 深拷贝**:浅拷贝也生成新对象(地址同),但共享嵌套引用。 - **深拷贝要求**:必须确保所有层级对象(如 `Department`)都被复制,形成独立副本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值