这是从破解编码面试中获取的代码。我不理解第4和第5行。从我所看到的,它是arraylist的arraylist但是对它是如何定义有点困惑。请解释一下我在这些方面发生的事情。
1 public class CallHandler {
2 static final int LEVELS = 3; // we have 3 levels of employees
3 static final int NUM_FRESHERS = 5; // we have 5 freshers
4 ArrayList<Employee>[] employeeLevels = new ArrayList[LEVELS];
5 // queues for each call’s rank
6 Queue<Call>[] callQueues = new LinkedList[LEVELS];
7
8 public CallHandler() { ... }
9
10 Employee getCallHandler(Call call) {
11 for (int level = call.rank; level < LEVELS - 1; level++) {
12 ArrayList<Employee> employeeLevel = employeeLevels[level];
13 for (Employee emp : employeeLevel) {
14 if (emp.free) {
15 return emp;
16 }
17 }
18 }
19 return null;
20 }
答案 0 :(得分:3)
这是创建ArrayLists的Array(而不是ArrayList)。在评论代码时,有3个级别的员工。他们将每个级别存储在employeeLevels
数组中的3个ArrayLists之一。
或者,他们可以将每个员工级别存储在自己的变量中 - 但这肯定不具有可扩展性或灵活性。它也会让每个级别的循环(就像它们一样,从第11-12行开始)变得更加困难。
答案 1 :(得分:3)
ArrayList<Employee>[] employeeLevels = new ArrayList[LEVELS];
从我所看到的,它是arraylist的arraylist,但有点混淆它是如何定义的。
它是ArrayLists的数组。
它的长度为LEVELS
(代码中为3),所有元素最初都为null
。要使用这些插槽,您必须放入ArrayLists(在您显示的代码中不会发生)。
要找到这些列表的个人,请执行
ArrayList<Employee> employeeLevel = employeeLevels[level];
但首先初始化条目,否则您将获得null(不为空列表)。
ArrayList<Employee>
尖括号中的东西是泛型类型注释。这意味着ArrayList只能存储Employee(或其子类)的实例。
总而言之,你有一个包含三个元素的数组,每个元素都是一个可以存储Employee实例的List,或者它可以为null。 “三个”列表不需要是不同的(您可以在所有三个插槽中放置相同的列表)。
答案 2 :(得分:0)
ArrayList [] employeeLevels = new ArrayList [LEVELS];
ArrayList []&lt; ---这是类型定义
new ArrayList [LEVELS]; &lt; ---这是实例化。
答案 3 :(得分:0)
从设计角度来看
如果创建一个ArrayList,基本上可以为代码添加很多灵活性。所以你不需要管理arraylist大小。如果创建ArrayList [],则会限制2D数组的一个维度。这样你就可以确定一个维度是固定的。所以有点节省一些内存,并允许阵列中的每个ArrayList增加灵活性。
答案 4 :(得分:0)
关于定义应该注意另一点。对于大多数开发人员来说,对接口而不是实现进行编码是一种很好的做法所以定义应该看起来像List<Employee>[] employeeLevels = new ArrayList[LEVELS];