从ArrayList和LinkedList测试对比谈一谈我最近的一些想法

笔者最近重温数据结构和算法,同时也兼顾看一些JDK的源码。结合一个小测试,想谈谈我最近的一些想法。提醒一下,本篇非技术资料分享,如果大家不喜欢或者引起您的反感,请自行离去。

大学时代学过C语言版的数据结构,除了考试外,在校期间找实习工作,毕业找工作的时候用到过,而参加工作以后就从未再碰过了。有很多人认为只要实现功能,完成任务就好,数据结构和算法能在实际中应用到场景很少。说实话,最开始工作的时候,我也慢慢的默认了这种观点。笔者现在身处一家小公司,主要做ToB业务,客户主题是政府和第三方。有时候很简单,就是要在老板吹牛的时间内做出来,不管你代码怎么写的。环境如此,加上自己刚工作,水平有限,往往只关注任务和功能实现。

毕业马上要三年,参加工作马上两年半了。最近刚刚做完一个项目,最自己复盘和回头看项目代码的时候,猛然发现但凡涉及list的结构,不仅仅我写的代码,整个项目都是使用ArrayList,竟然没有LinkedList,对于map的使用也很少。这引起了我的疑惑,就想知道如果重新组织代码,采用不同的数据结构会带来什么影响?

就简单那ArrayList和LinkedList来说。笔者简单做了一些测试,代码如下。

package basicdatastructure.src.list;

import java.util.List;

/**
 * 对ArrayList和LinkedList测试
 *
 * @author 
 * @version 1.0
 * @date 2021/5/16 0:02
 */
public class MakeList {


    /**
     * 从表后端添加元素构造一个list
     *
     * @param lst 表
     * @param N 整数
     */
    public static void makeList1(List<Integer> lst, int N) {
        lst.clear();
        for (int i = 0; i < N; i++)
            lst.add(i);
    }

    /**
     * 从表前端添加元素构造一个list
     *
     * @param lst 表
     * @param N 整数
     */
    public static void makeList2(List<Integer> lst, int N) {
        lst.clear();
        for (int i = 0; i < N; i++)
            lst.add(0, i);
    }

    /**
     * 计算List中的数的和
     *
     * @param lst
     * @return
     */
    public static long sum(List<Integer> lst) {
        int total = 0;
        for (int i = 0; i < lst.size(); i++)
            total += lst.get(i);

        return total;
    }
}
package basicdatastructure.test;

import basicdatastructure.src.list.MakeList;

import java.util.ArrayList;
import java.util.LinkedList;

/**
 * @author 
 * @version 1.0
 * @date 2021/5/16 0:12
 */
public class MakeListTest {
    public static void main(String[] args) {
        int n = 50000;
        ArrayList<Integer> arrayList = new ArrayList<>();
        LinkedList<Integer> linkedList = new LinkedList<>();

        long startArrayTime1 = System.currentTimeMillis();
        MakeList.makeList1(arrayList, n);
        long endArrayTime1 = System.currentTimeMillis();
        System.out.println("arrayList总耗时:" + (endArrayTime1-startArrayTime1));
        long startLinkedTime1 = System.currentTimeMillis();
        MakeList.makeList1(linkedList, n);
        long endLinkedTime1 = System.currentTimeMillis();
        System.out.println("linkedList总耗时:" + (endLinkedTime1-startLinkedTime1));

        long startArrayTime2 = System.currentTimeMillis();
        MakeList.makeList2(arrayList, n);
        long endArrayTime2 = System.currentTimeMillis();
        System.out.println("arrayList总耗时:" + (endArrayTime2-startArrayTime2));
        long startLinkedTime2 = System.currentTimeMillis();
        MakeList.makeList2(linkedList, n);
        long endLinkedTime2 = System.currentTimeMillis();
        System.out.println("linkedList总耗时:" + (endLinkedTime2-startLinkedTime2));

        ArrayList<Integer> integerArrayList = new ArrayList<>();
        LinkedList<Integer> integerLinkedList = new LinkedList<>();
        MakeList.makeList1(integerArrayList, n);
        MakeList.makeList1(integerLinkedList, n);
        long arrStartTime = System.currentTimeMillis();
        MakeList.sum(integerArrayList);
        long arrEndTime = System.currentTimeMillis();
        System.out.println("arr总耗时:" + (arrEndTime-arrStartTime));
        long linkStartTime = System.currentTimeMillis();
        MakeList.sum(integerLinkedList);
        long linkEndTime = System.currentTimeMillis();
        System.out.println("link总耗时:" + (linkEndTime-linkStartTime));
    }
}

以前只是在纸面上知道ArrayList和LinkedList的区别,从来没有更加深入的了解过产生区别的原因,直观的区别体现,以及可能在现实中的应用等等。知道自己重温这些知识,亲自动手测试了一下,很直观的感受到了差别,如图是测试结果:

比如就代码测试的add方法和get方法而言,从表后端插入N个元素,忽略网络环境等因素,多次测试现实ArrayList和LinkedList消耗时间为一个数量级,有时候会出现ArrayList稍微耗时多点,这可能要考虑数据量多的情况下,其扩容消耗。而从前端插入数据就有明显的差距了。当循环遍历列表调用get时,这种差距更加明显。

都知道ArrayList有点是快速随机访问,缺点是插入和删除数据;LinkedList与之相反。若非亲自测试,怎能更深入的理解,从而反推自己实际项目中使用的数据结构是否合理,代码是否存在可优化的空间,以及性能是否最好等等。

当然了,这些对于大佬来说可能算不上什么,对我来说,这就是差距我,自己与高手,与自己心中高质量代码的差距,更是自己努力的方向。曾经大学时代的一些知识和技能,有些遗忘了,有些虽然记得,但在实际工作中并没有得到很多的应用,实在是太差劲。

工作马上快三年了,对自我的认知,与目标的差距,以及其他种种,让自己迷失了方向。庆幸从去年开始渐渐地恢复了自律,养成了每天学习的习惯。越了解更多越觉得自己菜,除了自己真的菜外,也属于把“书”读厚的阶段。

曾经开玩笑的给自己定下“活到老,学到老,玩到老,吃到老”,flag谁都会立,可真做起来才发现真的很难。

一些碎碎念,不足挂齿。我想此刻的想法就一个——不让自己以后后悔,仅此而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值