网站建设服务预算,frp做网站,wordpress段代码插件,wordpress数据互通Java 列表复制与对象引用
一、知识点
1. 对象引用的基本概念
在 Java 中#xff0c;ListSchool 这样的集合存储的并不是真正的对象#xff0c;而是对象的“地址”#xff08;引用#xff09;。就好比你有一个文件柜#xff0c;文件柜里放的不是文件本身#x…Java 列表复制与对象引用
一、知识点
1. 对象引用的基本概念
在 Java 中ListSchool 这样的集合存储的并不是真正的对象而是对象的“地址”引用。就好比你有一个文件柜文件柜里放的不是文件本身而是指向文件存放位置的标签。集合中的每个元素都指向堆内存中的实际对象实例。
2. 列表复制与对象引用
当你用 new ArrayList(schools) 复制一个列表时新列表比如 sortedSchools只是把原列表schools中对象的“地址”复制了一遍而不是复制对象本身。也就是说两个列表中的元素都指向同一个对象实例就像两个标签指向同一个文件。
3. 对象属性修改的影响
因为两个列表中的元素指向同一个对象所以当你修改复制后的列表sortedSchools中对象的属性时原列表schools中对应的对象属性也会跟着变。就好比你通过一个标签修改了文件内容另一个标签指向的文件内容也会变。
4. 避免原列表被修改的方法
如果你希望修改复制后的列表时不影响原列表可以在复制列表时创建新的对象而不是直接复制引用。比如用构造函数重新创建对象
ListSchool sortedSchools new ArrayList();
for (School school : schools) {sortedSchools.add(new School(school.abbreviation, school.totalStudents));
}这种方法虽然能避免原列表被修改但会增加内存开销因为要创建新的对象实例和处理时间因为要调用构造函数。 二、面试题
1. 基础概念题
题目请解释在 Java 中 ListSchool 存储的是 School 对象还是对象的引用并说明当使用 new ArrayList(schools) 复制列表时会发生什么
答案ListSchool 存储的是 School 对象的引用而不是对象本身。就好比你有一个文件柜文件柜里放的是指向文件的标签而不是文件本身。当使用 new ArrayList(schools) 复制列表时新列表只是复制了原列表中对象的引用标签而不是创建新的对象实例。也就是说新列表和原列表中的元素都指向堆内存中同一个对象。
2. 代码分析题
题目以下是一段 Java 代码请分析代码的输出结果并解释原因。
import java.util.ArrayList;
import java.util.List;class School {String abbreviation;int totalStudents;int unassignedStudents;int supervisors;public School(String abbreviation, int totalStudents) {this.abbreviation abbreviation;this.totalStudents totalStudents;this.unassignedStudents totalStudents;this.supervisors 0;}
}public class Main {public static void main(String[] args) {ListSchool schools new ArrayList();School school1 new School(ABC, 100);schools.add(school1);ListSchool sortedSchools new ArrayList(schools);for (School school : sortedSchools) {if (school.unassignedStudents 0) {school.unassignedStudents - 20;school.supervisors;}}System.out.println(原列表 schools 中学校的未分配学生数: schools.get(0).unassignedStudents);}
}答案输出结果是 原列表 schools 中学校的未分配学生数: 80。原因如下
sortedSchools 是通过 new ArrayList(schools) 复制的它只是复制了 schools 中对象的引用而不是创建新的对象实例。在 sortedSchools 中修改对象的属性比如 unassignedStudents 和 supervisors因为引用的是同一个对象所以 schools 中对应的对象属性也会被修改。因此schools.get(0).unassignedStudents 的值会从 100 变为 80。
3. 优化策略题
题目如果希望在上述代码中对 sortedSchools 中 School 对象属性的修改不影响 schools 列表应该如何修改代码请说明这种修改的优缺点。
答案
修改方法在复制列表时创建新的 School 对象而不是直接复制引用。修改后的代码如下ListSchool sortedSchools new ArrayList();
for (School school : schools) {sortedSchools.add(new School(school.abbreviation, school.totalStudents));
}优点这样可以保证原列表 schools 不会被 sortedSchools 的操作所影响数据的独立性更好。就像你复制了一份文件修改副本不会影响原始文件。缺点会增加内存开销因为需要创建新的对象实例同时也会增加处理时间因为每次复制都要调用构造函数来创建新对象。