关于ArrayList.clear()与=null以及new ArrayList<E>()

本文探讨了如何高效地清理Java中的ArrayList,包括使用clear()方法、设置为null、创建新对象和注意事项。了解不同方法对内存管理和性能的影响,确保正确实践以避免内存泄露。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayList是常用到的JCF类,用来保存类型相同的一组对象,并通过下标来快速访问指定对象。今天讨论的是当我们使用完ArrayList后应该选择怎样合适的处理方式。

这里现在有三种方式如下:

1. 使用ArrayList的对象方法clear()

ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("1");
list.add("2");
list.clear();
 ArrayList对象内部维护一个对象数组elementData, 当执行clear()方法时, 会执行循环将elementData中每一个坐标都设置为为null, 并设置数组的size为0。

2. 使用=null

ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("1");
list.add("2");
list = null;
直接将变量list指向null,通常当我们不需要再使用ArrayList对象时,可以将变量值设为null,以便GC可以运作并回收这部分内存空间。

需要注意的是当仍有其他变量指向该对象时,即使讲变量list置为null垃圾回收器也无法回收该内存空间。如下:

ArrayList<String> list = new ArrayList<String>();
ArrayList<String> arraylist = list;
list.add("0");
list.add("1");
list.add("2");
list = null; // 此时list变量指向null,而arraylist变量仍然指向原内存空间,原内存空间得不到释放
 

3. 使用= new ArrayList()

方法3有点类似于方法1,都是得到一个空的ArrayList对象。不过new ArrayList()会得到一个初始化内部数组elementData容量为10的ArrayList对象,而方法1得到的对象的容量与原对象一致。值得注意的是使用方法3需要进行如在内存中重新开辟内存空间等操作,开销较大,如果只是单纯的想要使用空的ArrayList对象,建议使用方法1,相对来说可尽量避免堆内存溢出问题。

4.如果list变量的对象,有其他对象使用的时候,让它重新开辟空间,来重新赋值,比较合理。如果直接clear()会把其他对象中使用他的内容也清空掉。除非你是需要彻底重新开始,那就可以clear()

您提供的代码已经实现了基于动态规划的解决方案来计算数字三角形的最大路径和。下面是对该算法更详细的解释以及如何将其优化为标准动态规划形式的过程。 --- ### 算法原理说明 此段代码采用了“自底向上”的动态规划方法解决问题,其关键步骤如下: 1. **初始条件设置** 使用列表 `prevRow` 存储当前正在处理的那一层的数据。最初将 `prevRow` 设置成三角形底部那一行的所有值。 2. **状态转移过程** 对于倒数第二层开始直至顶层逐层遍历。每到达新的一层时,更新本层数字能够获取到的最大累积权重。这是通过比较来自下一层两个直接相邻子结点中较大者加本身值得到的结果完成的: \[ dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1]) \] 这里为了节省额外空间开销并没有创建完整的二维DP表格而是复用了单维度变量来进行操作。 3. **最终结果提取** 当所有层级都被处理完之后,留在第一个位置的就是整棵三角树可以取得的最大总合了。 这种做法相比传统的递归搜索极大减少了不必要的重复运算次数并且降低了整体时间复杂度至线性级别即\(O(N^2)\),其中\(N\)代表的是输入金字塔的高度或者说深度。 --- ### 代码简化版示例 我们可以稍微调整原有逻辑让其实现更为简洁明了一些: ```java import java.util.*; public class Main { public static void main(String[] args){ Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); List<List<Integer>> tri=new ArrayList<>(); for(int i=0;i<n;++i){ List<Integer> tmp=new ArrayList<>(); for(int j=0;j<=i;++j)tmp.add(scanner.nextInt()); tri.add(tmp); } // Start dynamic programming process. Integer[] dp = new Integer[n]; Arrays.fill(dp,-1); for(int col=0;col<tri.get(n-1).size();col++)dp[col]=tri.get(n-1).get(col); for(int row=n-2;row>=0;row--){ for(int col=0;col<=row;col++) dp[col]=Math.max(dp[col], dp[col+1])+tri.get(row).get(col); } System.out.print(dp[0]); } } ``` 上述版本去掉了部分冗余内容比如记忆化数组memo等,并且引入了一维整形数组替代复杂的嵌套list进行记录临时中间数据项以便提高性能表现同时也增加了程序易读性和维护便利程度。 --- ### 时间空间复杂度分析 - **时间复杂度:** \(O(N^2)\),因为总共存在约\(\frac{N * (N + 1)}{2}\)个节点都需要被访问一次做必要的累加计算工作。 - **空间复杂度:** \(O(N)\),只保留了一个长度固定等于三角形宽度的一维辅助数组而非整个完整二维表结构,因此极大地削减了实际消耗掉的工作存储资源数量级。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值