Java 引用

发布时间:2026/7/28 11:12:48

Java 引用 目录一、引用定义二、浅拷贝和深拷贝1.引用拷贝2.深拷贝一、引用定义引用Reference记录的是对象在堆空间中的内存地址因为Java是值传递所以引用存储的是内存地址根据内存地址的编码位数分为32位和64位操作系统分别能表示232B4GB和264B234GB内存空间每个数字代表一个字节的内存编号。如果是32位内存地址那么每个引用占用4B64位占用8B。对于局部变量会占用栈中局部变量表的内存空间必须赋初值否则编译报错。对于成员变量会占用堆空间中的内存默认赋值为null。强引用常见的引用都是强引用。只要强引用存在垃圾回收器永远不会回收被引用的对象。可能导致内存溢出问题ObjectobjnewObject();软引用在内存不足时软引用关联的对象会强制被垃圾回收器回收。SoftReferenceObjectsoftRefnewSoftReference(newObject());弱引用在垃圾回收器线程扫描内存区域时一旦发现弱引用不管当前内存是否足够都会回收弱引用关联的对象。可能导致内存泄露问题WeakReferenceObjectweakRefnewWeakReference(newObject());二、浅拷贝和深拷贝引用拷贝两个不同的引用指向堆中同一个对象。浅拷贝浅拷贝会在堆上创建一个新的对象区别于引用拷贝不过如果原对象内部的属性是引用类型的话浅拷贝会直接复制内部对象的引用地址即复用内部对象。深拷贝深拷贝会完全复制整个对象包括这个对象所包含的内部对象。1.引用拷贝ListEmployeelistnewArrayList();EmployeeemployeenewEmployee();for(inti0;i3;i){employee.setName(i);list.add(employee);}list.forEach(System.out::println);这个程序的执行结果是2 2 22.深拷贝publicstaticvoidtest2(){ListEmployeelistnewArrayList();for(inti0;i3;i){EmployeeemployeenewEmployee();employee.setName(i);list.add(employee);}list.forEach(System.out::println);}这个程序的执行结果是0 1 2

相关新闻