ArrayList删除元素的思考

本文对比了Java中ArrayList与LinkedList两种数据结构的优缺点,并通过具体示例展示了如何正确使用这两种数据结构。此外,还讨论了Scala中相应数据结构的特点及最佳实践。

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

今天浏览了篇博文:Java ArrayList删除特定元素的方法,重温当年Java代码,再结合Scala特性,由此想到了数据结构中数组与链表各自的优缺点;数据结构和算法是编程的‘易筋经’。


遍历ArrayList的中几种方法:

  1. 最朴实的方法
for (int i = 0; i < l.size(); i++) { 
    if (l.get(i) == "key") { 
        l.remove(i); 
        i--;       // 每次删除后size会减少1
    }
} 

2.比较“先进”的方法

for (String str : l) { 
    if (str == "key") { 
        l.remove(s);
    }
} 

此代码会抛出ConcurrentModificationException 异常。
3.迭代遍历

while (iter.hasNext()) { 
    if (iter.next().equals("key")) { 
        iter.remove(); 
    }
} 

此方法就无任何问题了。

思考

  • 问题原因:
    第一、二种方法会产生问题,表面原因是ArrayList的size是变动,这就给后续的获取大小调用造成了麻烦;而迭代遍历只是“查找它的下一个”,并不需要获取集合大小。
  • scala会不会亦有此问题?
    scala中,常见数据结构:Array(Java数组); 带角标-(Vector-immutable, ArrayBuffer-mutable);链表(List-immutable, LinkedList-mutable)。默认隐式引入的是不可变的对象;当然,这也是scala的主要思想的体现-‘优先不可变’。
    对于其中mutable(ArrayBuffer, List)类型,使用for循环的话,一样会有问题-但我们更加常用的是for推导式和foreach等迭代式的方法。而对于immutable类型,其根本没有’更改’的方法,即使有,也是产生一个新对象而已。
    由此,我们了解到scala意图:尽量使用不可不对象产出新对象;即使要用可变对象,请使用迭代。
  • ArrayList 和 LinkedList 的区别:
    这两个数据结构的具体区别,各种算法和数据结构书籍都是在第一章讲解的,我也不必废话了。但请记住产生它们之间差别最根本的不同-数组中间元素被加入或删除后,其前后元素都会变动;链表无角标,它只有next引用指向下个元素,查询要迭代遍历。由此,数组弱在更改,链表弱在查询(相对)。
  • 对数据结构 数组 和 链表 的思考:
    由此可见,我们“死记硬背”的:数组应用于查找;链表应用于增删-(当然并不绝对),更应该被我们活用在编程中。
    ArrayList是一个被’滥用’的类,几乎被使用在各种情况下-主要是因为我们为了’方便’。但请分清你在’查询’,还是’更改’,并对其使用不同的思想-ArrayList(for循环即可) Or LinkedList(要使用iteration)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值