ArrayList和LinkedList的区别以及对程序员缺乏数据结构知识的思考

这是一篇论数据结构在平时码代码的时候到底有没有用的思考。

如果你是一名业务开发工程师,你可能要说,我整天就是做数据库增删改查,哪里用得到数据结构和算法啊?

对于大部分业务开发来说,我们平时可能更多的是利用已经封装好的现成的接口、类库来堆砌、翻译业务逻辑,很少需要自己实现数据结构和算法。但是,不需要自己实现,并不代表什么都不需要了解。

但是当数据量大的时候,又不得不考虑到性能的优化。可以说性能的优化是一个十分注重细节的技术。
可能我们并没有机会去写高深的算法,但是我们会时刻用到由各种算法构成的工具。

比如ArrayList和LinkedList,我们知道ArrayList是线性结构,LinkedList是链式结构,但是如果不知道数据结构的特征,就不会知道什么情况下用哪种List会提高我们业务的性能。再比如有不少对链表的基本属性都不了解的人,在程序里一味使用数组,内存能开多大就多大;也见过太多根本不知道HASH原理的人,对Hash表随意使用,造成KEY值严重重复、效率极为低下、失去了选用HASH的初衷。

下面我们来看ArrayList和LinkedList的区别。
ArrayList是线性存储结构,LinkedList是链式存储结构,线性结构主要是查找快,插入数据时,如果在list中间插入,LinkedList要比ArrayList高得多。因为线性存储结构存储数据需要重新对数据进行排序,而链式存储只需要改变指针的下一个存储地址。下面我们来看不同操作的时间差。

package com.allqj.application.util;

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

/**
 * @Author WF
 * @DesCription
 * @Date 2019/6/18 9:30
 **/
public class ListTest {
    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList<>();
        List<Integer> linkedList = new LinkedList<>();
        long arrayStartTime = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            arrayList.add(i);
        }
        long arrayEndTime = System.currentTimeMillis();
        System.out.println("ArrayList尾部插入:" + (arrayEndTime - arrayStartTime));
        long linkedStartTime = System.currentTimeMillis();

        for (int i = 0; i < 1000000; i++) {
            linkedList.add(i);
        }
        long linkedEndTime = System.currentTimeMillis();
        System.out.println("LinkedList尾部插入:" + (linkedEndTime - linkedStartTime));


        long arrayInsertStartTime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            arrayList.add(i,i);
        }
        long arrayInsertEndTime = System.currentTimeMillis();
        System.out.println("ArrayList中间插入:" + (arrayInsertEndTime - arrayInsertStartTime));

        long linkedInsertStartTime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            linkedList.add(i,i);
        }
        long linkedInsertEndTime = System.currentTimeMillis();
        System.out.println("LinkedList中间插入:" + (linkedInsertEndTime - linkedInsertStartTime));

        long arrayQueryStartTime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            int a = arrayList.get(i);
        }
        long arrayQueryEndTime = System.currentTimeMillis();
        System.out.println("ArrayList查询:" + (arrayQueryEndTime - arrayQueryStartTime));
        long linkedQueryStartTime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            int a = linkedList.get(i);
        }
        long linkedQueryEndTime = System.currentTimeMillis();
        System.out.println("LinkedList查询:" + (linkedQueryEndTime - linkedQueryStartTime));

        long arrayDeleteStartTime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            arrayList.remove(i);
        }
        long arrayDeleteEndTime = System.currentTimeMillis();
        System.out.println("ArrayList删除:" + (arrayDeleteEndTime - arrayDeleteStartTime));
        long linkedDeleteStartTime = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            linkedList.remove(i);
        }
        long linkedDeleteEndTime = System.currentTimeMillis();
        System.out.println("LinkedList删除:" + (linkedDeleteEndTime - linkedDeleteStartTime));
    }
}

ArrayList尾部插入:37
LinkedList尾部插入:82
ArrayList中间插入:2765
LinkedList中间插入:78
ArrayList查询:1
LinkedList查询:76
ArrayList删除:2534
LinkedList删除:110

可见,在一万条数据的中间插入,效率就差了四倍多,删除差了二十五倍。如果数量大的话,效率相差会更大。
虽然我们不会去写一个高端的数据结构,但是我们的代码中无时无刻都在使用着数据结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值