八股文死记硬背打脸记

news2025/1/10 14:11:16
  •  背景

        我们都知道,再编程领域数据结构的重要性,常见的数据结构包括 List、Set、Map、Queue、Tree、Graph、Stack 等,其中 List、Set、Map、Queue 可以从广义上统称为集合类数据结构。而Java也提供了很多的集合数据结构以供开发者开箱即用,其中ArrayList和LinkedList区别的问题早已成为烂大街的八股文面试题其中之一                

        作为一名Javaer,不论是日常开发还是作为面试官,都不得不承认八股文在如今的江湖中占有举足轻重的地位。"面试造火箭,入职拧螺丝"  这是许多面试同学吐槽最多的一句话,但就我个人而言,我认为背八股文对于大多数开发同学而言仍然是一个不错的提升技术途径(特别是对于一些小公司接触不到复杂业务的开发同学)

        凡事都有一个但是,此八股文非彼八股文,不能像读书时背课文似的死记硬背,最好结合自己开发中的实践,要学会有自己的理解,否则有时就会闹笑话,此处引申一则自己的亲身面试经历

       A同学:"ArrayList的底层实现是数组,而LinkedList是双向列表"

       我内心:"马上及格"

       A同学:"所以ArrayList适合查询频繁的业务场景而LinkedList适合增删频繁的业务场景"

       我内心 :"及格,但有无自己的理解呢"        

       我 :"你平时开发中是怎么使用LinkedList的?"

       A同学:"就像我刚才讲的,有频繁增删的场景我便使用LinkedList来存储数据,因为它的效率更高"

       我 :"你确定吗?"

       A同学:"我确定(这面试官行不行,这八股文必背的还能有错?)"

  • 实践

       检验真理的唯一标准就是开整

    //LinkedList访问
    private static void linkedListGet(int elementCount, int loopCount) {
        List<Integer> list = IntStream.rangeClosed(1, elementCount).boxed().collect(Collectors.toCollection(LinkedList::new));
        IntStream.rangeClosed(1, loopCount).forEach(i -> list.get(ThreadLocalRandom.current().nextInt(elementCount)));
    }

    //ArrayList访问
    private static void arrayListGet(int elementCount, int loopCount) {
        List<Integer> list = IntStream.rangeClosed(1, elementCount).boxed().collect(Collectors.toCollection(ArrayList::new));
        IntStream.rangeClosed(1, loopCount).forEach(i -> list.get(ThreadLocalRandom.current().nextInt(elementCount)));
    }

    //LinkedList插入
    private static void linkedListAdd(int elementCount, int loopCount) {
        List<Integer> list = IntStream.rangeClosed(1, elementCount).boxed().collect(Collectors.toCollection(LinkedList::new));
        IntStream.rangeClosed(1, loopCount).forEach(i -> list.add(ThreadLocalRandom.current().nextInt(elementCount),1));
    }

    //ArrayList插入
    private static void arrayListAdd(int elementCount, int loopCount) {
        List<Integer> list = IntStream.rangeClosed(1, elementCount).boxed().collect(Collectors.toCollection(ArrayList::new));
        IntStream.rangeClosed(1, loopCount).forEach(i -> list.add(ThreadLocalRandom.current().nextInt(elementCount),1));
    }
        //元素个数10W
        int elementCount = 100000;
        //循环次数10W
        int loopCount = 100000;
        StopWatch getWatch = new StopWatch();
        getWatch.start("linkedListGet");
        linkedListGet(elementCount, loopCount);
        getWatch.stop();
        getWatch.start("arrayListGet");
        arrayListGet(elementCount, loopCount);
        getWatch.stop();
        System.out.println(getWatch.prettyPrint());

        StopWatch addWatch = new StopWatch();
        addWatch.start("linkedListAdd");
        linkedListAdd(elementCount, loopCount);
        addWatch.stop();
        addWatch.start("arrayListAdd");
        arrayListAdd(elementCount, loopCount);
        addWatch.stop();
        System.out.println(addWatch.prettyPrint());
StopWatch '': running time = 5798625399 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
5789125500  100%   linkedListGet
009499899  00%   arrayListGet

StopWatch '': running time = 27658489400 ns
---------------------------------------------
ns         %     Task name
---------------------------------------------
26271657500  95%   linkedListAdd
1386831900  05%   arrayListAdd

        可以看到 LinkedList 无论是查询还是插入, 完败

  • 总结

        通过查看LinkedList 源码发现,插入操作的时间复杂度是 O(1) 的前提是,已经获得要插入节点的指针。但在实现的时候,我们需要先遍历获取到该节点的 Node,然后再执行插入操作,前者也是有开销的,不可能只考虑插入操作本身的代价

        最后以一个讽刺的图作为结尾 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

左神高级提升班2 约瑟夫环结构

目录 【案例1】 【题目描述】 【输入描述&#xff1a;】 【输出描述&#xff1a;】 【输入】 【输出】 【思路解析】 【代码实现】 【案例1】 【题目描述】 某公司招聘&#xff0c;有n个人入围&#xff0c;HR在黑板上依次写下m个正整数A1、A2、……、Am&#xff0c;然后…

alist windows桌面版下载安装

官网 Desktop | AList Docs 点击下载windows版本 安装 双击exe 修改安装路径 太可惜了&#xff0c;需要收费

LeetCode刷题---Add Two Numbers(一)

文章目录 &#x1f352;题目&#x1f352;解法一 迭代&#x1f352;解法二 递归&#x1f352;递归小案例&#x1f352;迭代 VS 递归 &#x1f352;题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只…

聚观早报 | 飞书签约韵达速递;蔚来首颗自研芯片“杨戬”量产

【聚观365】9月22日消息 飞书签约韵达速递 蔚来首颗自研芯片“杨戬”10月量产 靳玉志接任华为车 BU CEO 亚马逊发布全新Alexa语音助手 OpenAI推出图像生成器DALL-E 3 飞书签约韵达速递 近日&#xff0c;国内物流服务公司韵达快递宣布全员上飞书。飞书解决方案副总裁何斌表…

【大数据】Doris 构建实时数仓落地方案详解(一):实时数据仓库概述

本系列包含&#xff1a; Doris 构建实时数仓落地方案详解&#xff08;一&#xff09;&#xff1a;实时数据仓库概述Doris 构建实时数仓落地方案详解&#xff08;二&#xff09;&#xff1a;Doris 核心功能解读Doris 构建实时数仓落地方案详解&#xff08;三&#xff09;&#…

云原生Kubernetes:K8S集群list-watch机制与 pod调度约束

目录 一、理论 1.K8S的list-watch 机制 2.亲和性 二、实验 1. 指定调度节点 2.节点亲和性 3.亲和性和反亲和 三、问题 1.新生成pod一直为pending 2.如何一次性删除pod和deployment 3.pod亲和性资源报错 4.pod反亲和性资源报错 四、总结 一、理论 1.K8S的list-wat…

zookeeper + kafka

Zookeeper 概述 Zookeeper是一个开源的分布式服务管理框架。存储业务服务节点元数据及状态信息&#xff0c;并负责通知再 ZooKeeper 上注册的服务几点状态给客户端 Zookeeper 工作机制 Zookeeper从设计模式角度来理解: 是一个基于观察者模式设计的分布式服务管理框架&…

vector的扩容机制—为何是1.5倍或者是2倍

文章目录 前言一、Vector 扩容过程二、为什么是1.5倍或者2倍&#xff1f; 前言 在 C 编程中&#xff0c;Vector 是一种常用的动态数组容器。其大小是可以动态调整的&#xff0c;而在扩容操作中&#xff0c;Vector 通常会将容量增加为原来的两倍。本篇博客将详细介绍 Vector 扩…

Kindle电子书下载功能关闭怎么办,借助calibre和cpolar搭建私有的网络书库公网访问

Kindle中国电子书店停运不要慌&#xff0c;十分钟搭建自己的在线书库随时随地看小说&#xff01; 文章目录 Kindle中国电子书店停运不要慌&#xff0c;十分钟搭建自己的在线书库随时随地看小说&#xff01;1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网…

RT-Thread(学习)

RT-Thread是一款完全由国内团队开发维护的嵌入式实时操作系统&#xff08;RTOS&#xff09;&#xff0c;具有完全的自主知识产权。经过16个年头的沉淀&#xff0c;伴随着物联网的兴起&#xff0c;它正演变成一个功能强大、组件丰富的物联网操作系统。 RT-Thread概述 RT-Threa…

openssl创建CA证书教程

配置生成CA证书 总示意图&#xff1a; (1)&#xff0c;通过openssl创建CA证书 第一步&#xff1a;创建一个秘钥&#xff0c;这个便是CA证书的根本&#xff0c;之后所有的东西都来自这个秘钥 # 通过rsa算法生成2048位长度的秘钥 openssl genrsa -out myCA.key 2048 第二步&#…

Wireshark TS | MQ 传输缓慢问题

问题背景 应用传输慢是一种比较常见的问题&#xff0c;慢在哪&#xff0c;为什么慢&#xff0c;有时候光从网络数据包分析方面很难回答的一清二楚&#xff0c;毕竟不同的技术方向专业性太强&#xff0c;全栈大佬只能仰望&#xff0c;而我们能做到的是在专注于自身的专业方向之…

什么是Selenium?使用Selenium进行自动化测试!

你知道什么是 Selenium 吗&#xff1f;你知道为什么要使用它吗&#xff1f;答案就在本文中&#xff0c;很高兴能够与你共飧。 自动化测试正席卷全球&#xff0c;Selenium 认证是业界最抢手的技能之一。 什么是 Selenium&#xff1f; Selenium 是一种开源工具&#xff0c;用于…

Spring Cloud Alibaba Nacos 2.2.3 (2) - 单机版启动 (winodows 和 linux )

Nacos 2.2.3 (1) - 下载与数据库配置 参考下载与数据库配置 启动服务器 执行 nacos-server-2.2.3\bin 下的startup.sh或者startup.cmd &#xff08;根据不同系统&#xff09; windows 下nacos 单机启动 方式一&#xff1a; 1&#xff0c;打开cmd 2&#xff0c;cd 到nacos-s…

数据库数据恢复-SQL SERVER数据库分区被格式化的数据恢复方案

SQL SERVER数据库故障类型&#xff1a; 1、SQL SERVER数据库文件被删除。 2、SQL SERVER数据库所在分区格式化。 3、SQL SERVER数据库文件大小变为“0”。 4、使用备份还原数据库时覆盖原数据库。 SQL SERVER数据库故障原因&#xff1a; 1、人为误操作。 2、文件系统损坏&#…

基于Yolov8的工业小目标缺陷检测实战(2):动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点 | ICCV2023

目录 1.工业油污数据集介绍 1.1 小目标定义 1.2 难点 1.3 工业缺陷检测算法介绍 1.3.1 YOLOv8 2.Dynamic Snake Convolution 2.1 Dynamic Snake Convolution加入到yolov8 3.训练结果分析 4.系列篇 1.工业油污数据集介绍 三星油污缺陷类别&#xff1a;头发丝和小黑点&…

AirtestIDE编辑窗内,脚本内容消失,显示一片红色怎么办?

airtest编辑窗内&#xff0c;脚本内容消失&#xff0c;显示一片红色怎么办 如果突然有一天打开脚本&#xff0c;发现脚本全都变成了红色的点&#xff08;因未知错误导致的脚本异常&#xff09;&#xff1a; 原本辛辛苦苦写的三百多行代码全消失&#xff0c;是不是很难受很心慌…

Android Camera2获取摄像头的视场角(FOV)信息

一、概念 FOV&#xff08;Field of View&#xff09;是一个用于描述视野范围的术语。它通常用于计算设备&#xff08;如摄像机、虚拟现实头显或眼睛&#xff09;所能捕捉到的可见区域。 水平FOV&#xff08;Horizontal FOV&#xff09;&#xff1a;描述视野在水平方向上的范围…

可以查看输入字数的手机备忘录软件用哪个?

在当下这个科技迅速发展的时代&#xff0c;我们常常需要依赖备忘录来记录重要的信息、灵感和待办事项。手机备忘录成为了我们随身携带的工具&#xff0c;但是你有没有遇到这样的情况&#xff1a;你写了很多内容&#xff0c;但不知道写了多少字&#xff1f;这个问题或许曾经困扰…

feign结合hystrix的坑

feign结合hystrix的步骤 创建报错类 接口指向报错类 配置文件放开feign的hystrix 最后注意&#xff1a;启动类的EnableHystrix只适用于ribbon负载均衡的场景&#xff0c;如果是feign要去掉