ArrayList和LinkedList区别

 ArrayList和LinkedList是Java集合框架中两种常用的List实现类,它们在内部结构和性能上有显著的区别。

ArrayList

1. **内部结构**:ArrayList基于动态数组实现。它使用一个数组来存储元素,当数组满时,会创建一个更大的新数组,并将旧数组的元素复制到新数组中。

2. **随机访问**:由于基于数组,ArrayList支持高效的随机访问。通过索引访问元素的时间复杂度是O(1)。

3. **插入和删除**:在ArrayList中间插入或删除元素通常需要移动其他元素,因此这些操作的时间复杂度是O(n)。

4. **内存使用**:ArrayList在创建时会分配比实际需要更多的空间,以减少重新分配的次数。这可能导致一定的内存浪费。

LinkedList

1. **内部结构**:LinkedList基于双向链表实现。每个节点都包含对前一个节点和后一个节点的引用。

2. **随机访问**:由于是链表结构,LinkedList不支持高效的随机访问。要访问特定索引的元素,需要从头或尾开始遍历链表,平均时间复杂度是O(n)。

3. **插入和删除**:在LinkedList中间插入或删除元素通常只需要改变相邻节点的引用,因此这些操作的时间复杂度是O(1),前提是已知要操作的节点。

4. **内存使用**:LinkedList的每个元素都需要额外的空间来存储前后节点的引用,这可能导致比ArrayList更高的内存使用。

List<TreeNode> list = new ArrayList<TreeNode>(); 

List<TreeNode> allTrees = new LinkedList<TreeNode>();

这两行代码都是用来创建一个存储多个 TreeNode 对象的列表,但是它们使用的底层实现不同。

ArrayList 是一种数组实现的动态数组,它的底层是一个数组

LinkedList 是一种链表实现的动态数组,它的底层是一个链表。

两种实现有自己的优缺点:

  • ArrayList 查询和访问元素速度快,因为它是通过下标来访问元素的,但插入和删除元素速度比较慢,因为插入和删除元素需要移动整个数组。
  • LinkedList 插入和删除元素速度快,因为只需要修改前后元素的指针,但查询和访问元素速度比较慢,因为需要遍历整个链表来找到指定元素。

所以,如果你的列表需要频繁插入和删除元素,那么使用 LinkedList 更好,如果你的列表需要频繁查询和访问元素,那么使用 ArrayList 更好。

当遍历了所有可能的树,并且需要频繁插入和删除元素,使用了 LinkedList<TreeNode> allTrees = new LinkedList<TreeNode>(); 来存储所有可能的树。这样可以提高插入和删除元素的效率。

选择使用ArrayList或LinkedList, 就要根据你的程序需要来考虑,如果需要频繁的遍历元素,建议使用ArrayList,如果需要频繁的插入和删除元素,建议使用LinkedList。 

List<TreeNode> list = new ArrayList<TreeNode>(); 

输出结果:

[1,null,2,null,3,null,4,null,5,null,6]

List<TreeNode> allTrees = new LinkedList<TreeNode>();

总结

- 如果你需要频繁进行随机访问操作,应该选择ArrayList。
- 如果你需要频繁在列表中间进行插入和删除操作,应该选择LinkedList。
- 在考虑内存使用时,如果元素数量较多且内存受限,可能需要权衡ArrayList的预分配空间和LinkedList的额外引用空间。
- 在实际应用中,还应考虑其他因素,如迭代性能、线程安全等。

选择合适的List实现取决于你的具体需求和预期的操作类型。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茶色岛^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值