You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于ArrayList数组声明与元素赋值的技术疑问

拆解Java中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:07:53