关于ArrayList数组声明与元素赋值的技术疑问
ArrayList<Integer>[]声明的疑惑 嘿,刚接触这种写法的时候我也懵过,这就给你一步步讲清楚:
1. 带[]的声明到底是什么意思?
你看到的ArrayList<Integer>[] graph不是给ArrayList加括号,而是声明了一个数组,这个数组里的每个元素的类型是ArrayList<Integer>——简单说就是:这是一个“装篮子的柜子”,柜子(数组)的每个格子里放的是一个专门装整数的篮子(ArrayList
对比你熟悉的普通数组:比如int[] nums是装整数的数组,而ArrayList<Integer>[] graph就是装“整数列表”的数组,两者本质都是数组,只是存储的元素类型不同。
2. 声明后能对这个graph做哪些操作?
既然graph是数组,那你可以先对数组本身做这些操作:
- 通过索引访问元素:比如
graph[0]就能拿到数组第0个位置的ArrayList<Integer> - 遍历数组:用for循环逐个处理每个位置的列表
- 给数组的索引位置赋值:就像代码里的
graph[i] = new ArrayList();,给第i个格子放一个新的篮子
拿到每个位置的ArrayList之后,你就可以对它做所有普通ArrayList支持的操作了:
- 添加元素:
graph[1].add(5);(给第1个格子的篮子里放整数5) - 获取元素:
int num = graph[1].get(0); - 删除元素:
graph[1].remove(0); - 遍历列表:
for (int node : graph[1]) { ... }
3. 为什么声明存Integer,却赋值ArrayList?
这个其实是代码写法的小问题,正确规范的写法应该是:
graph[i] = new ArrayList<Integer>();
代码里写new ArrayList()是Java早期的原始类型写法(没有指定泛型参数),因为Java的泛型有擦除机制,编译器会允许这种未指定泛型的赋值,但会弹出“未检查转换”的警告。
之所以能这么写,是因为你已经声明了数组的元素类型是ArrayList<Integer>,所以把原始类型的ArrayList赋值过去时,编译器会默认把它当作ArrayList<Integer>来处理,但这种写法不够严谨,建议加上<Integer>来明确泛型类型,避免潜在的类型错误。
补充:这段代码的常见用途
这种写法通常用来实现图的邻接表:比如MAX_EDGE_VAL代表图里最大的节点编号,数组的每个索引对应一个节点,对应的ArrayList里存的是这个节点直接连接的其他节点的编号(整数类型),这样能高效存储和遍历图的结构。
内容的提问来源于stack exchange,提问作者ALLAN

