Java教程

Java中导出海量数据到excel,层层深入

本文主要是介绍Java中导出海量数据到excel,层层深入,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
# 4 年经验应该具备哪些技能 首先,简单的聊一下我认为的 4 年经验左右、优秀的 Java 程序员应该具备的技能有哪些,按“专业技能”和“项目”两块,包括但不限于以下内容。 **专业技能方面** * 基础:JDK 常用类的原理、源码、使用场景。 * 设计模式:常用几种的原理、使用场景,单例、动态代理、模板、责任链等。 * 数据结构:数组、链表、栈、队列、树。 * 网络:TCP、HTTP、HTTPS、负载均衡算法。 * 框架:Spring IoC 原理、Spring AOP 原理和使用、Spring 常用的扩展点、MyBatis 的核心流程。 * 中间件:常用中间件的核心原理与最佳实践,并对其中的 1 到 2 个有深入的学习,Redis、Kafka(RocketMQ、RabbitMQ)、Dubbo、Zookeeper。 * 数据库(MySQL):索引原理、隔离级别、锁机制、分库分表、慢 SQL 定位及优化、线上问题解决。 * Netty:NIO 原理、核心组件、I/O 多路复用(epoll)、零拷贝。 * JVM:运行时数据区、垃圾回收算法、垃圾回收器(CMS、G1)、常用配置参数、线上问题定位及解决。 * 稳定性保障:隔离、限流、熔断、降级等。 * Linux:基本命令的使用、快速定位和排查问题。 * 分布式理论:CAP、BASE、2PC、3PC、TCC。 **项目方面** * 能独立完成一个复杂模块的需求分析、方案设计和最终落地实现。 * 能不断思考,寻找更优的设计和解决方案,积极优化慢 SQL、慢服务。 * 具备排查问题的能力,遇到线上问题能及时定位和修复上线,例如:数据库死锁、服务器宕机、服务器 Full GC 频繁等。 * 具备难题攻关的能力,能不断解决项目遇到的挑战,能给予初级工程师技术上的指导。 * 初步具备带领团队(1-3人左右)的能力,能合理分配需求,做好进度把控、风险评估、Code Review。 严格来说,要完全做到上面这些有点难,我自己也并不具备,但是,我们可以将其视为目标,不断去努力。 **面试常见形式** 大厂面试通常是“连环炮”的形式,举个栗子: 面试官:用过哪些 Map > 我:LinkedHashMap、ConcurrentHashMap、HashMap、TreeMap 面试官:这四种 Map 的区别 > 我:ConcurrentHashMap 线程安全,LinkedHashMap 可以记录插入顺序和访问顺序,TreeMap 可以自定义排序,除了这几个场景,其他场景基本都可以使用 HashMap 面试官:ConcurrentHashMap 怎么保证线程安全 > 我:JDK 1.8 以前通过分段锁,JDK 1.8 以后通过 CAS + Synchronized 面试官:ConcurrentHashMap 在 JDK 1.8 前后的锁有什么区别 > 我:JDK 1.8 以前锁分段,JDK 1.8 以后锁单个节点,锁粒度降低,并发度变高 这种模式的问法,其实就是想了解候选人对一个知识点的理解是仅仅停留在表面,还是真的去深入研究过。 **面试内容** 下面介绍下一些常见的面试内容,其中的面试题不一定是我真实遇到的,有可能是从别人的面试题中收集的,也有可能是我自己觉得重要的知识点,仅供参考。 **1、项目** 项目对于一个 3 - 5 年经验的开发来说是非常重要的,面试官也非常看重这一块。这个经验的开发基本是各大公司的编码主力,因此面试这个年限的候选人,通常项目是很重要的一块。面试官通常会让你先自己介绍下自己参与度最高(或者最牛逼)的项目,然后从中进行提问。常见的如以下: * 介绍下你参与度最高的项目 * 画下项目的架构图 * 如果核心流程处理到一半,服务器崩溃了,会怎么处理 * 项目中遇到过哪些挑战或问题,怎么解决的 * 项目的稳定性和可用性怎么保障 * 数据安全这块怎么设计 * 项目的技术选型,为什么选这些 * ... **2、场景题** 越到后面的面试官,越喜欢问场景题,场景题比较考验候选人平时的积累和解决问题能力。这个环节很容易挂掉一批人,特别是容易紧张的同学,很容易脑子会一片空白。场景题的核心一般是处理大数据量的问题、解决性能方面的问题。 场景题本质上是比较开放的,没有什么标准答案,只要自己的方案能够解决问题,能够“自圆其说”就行。 这个环节面试官可能会将线上真实的场景拿出来提问,我自己就遇到过。 **3、专业技能** **集合** * 经常用到哪些 Map * 这几种 Map 的区别 * CocurrentHashMap 怎么保证线程安全 * CocurrentHashMap 在 JDK 1.8 前后的锁有什么区别 * 聊下 HashMap 的原理 * HashMap 在 Put 时,新链表节点是放在头部还是尾部 * HashMap 扩容时的流程 * HashMap 在 JDK 1.8 有什么改变 * CocurrentHashMap 在 JDK 1.8 有什么改变 * TreeMap 的原理 * Map、List、Set 分别说下你知道的线程安全类和线程不安全的类 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268345715388.jpg) ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268345650634.jpg) **多线程、锁** * 线程池使用的是哪种 * 线程池参数怎么配置 * 线程池各个参数的作用 * 线程池的参数配置要注意什么 * 线程池的工作流程 * JDK 中的并发类知道哪些 * AQS 的底层原理 * 介绍下悲观锁和乐观锁 * 使用过哪些锁 * synchronized 和 Lock 的区别、使用场景 * synchronized 原理 * synchronized 作用于静态方法、普通方法、this、Lock.class 的区别 * 为什么引入偏向锁、轻量级锁,介绍下升级流程 * 死锁的必要条件,如何预防死锁 * 介绍下 CountDownLatch 和 CyclicBarrier * 介绍下 CAS,存在什么问题 * 介绍下 ThreadLocal,存在什么问题 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268345950806.jpg) ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268346619106.jpg) **网络** * HTTPS 是怎么加密的 * 普通 Hash 和一致性 Hash 原理 * 一致性 Hash 的缺点 * TCP 三次握手过程,为什么需要三次握手 * 为什么 TIME_WAIT 状态需要经过 2MSL 才能返回到 CLOSE 状态 * TCP 的拥塞控制 * TCP 如何解决流控、乱序、丢包问题 * 为什么会出现粘包和拆包,如何解决 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268346908770.jpg) **Spring、Mybatis** * Mybatis 中 # 和 $ 的区别 * 怎么防止 SQL 注入 * 使用 Mybatis 时,调用 DAO(Mapper)接口时是怎么调用到 SQL 的 * 介绍下 Spring IoC 的流程 * BeanFactory 和 FactoryBean 的区别 * Spring 的 AOP 是怎么实现的 * Spring 的事务传播行为有哪些,讲下嵌套事务 * 什么情况下对象不能被代理 * Spring 怎么解决循环依赖的问题 * 要在 Spring IoC 容器构建完毕之后执行一些逻辑,怎么实现 * @Resource 和 @Autowire 的区别 * @Autowire 怎么使用名称来注入 * bean 的 init-method 属性指定的方法里用到了其他 bean 实例,会有问题吗 * @PostConstruct 修饰的方法里用到了其他 bean 实例,会有问题吗 * Spring 中,有两个 id 相同的 bean,会报错吗,如果会报错,在哪个阶段报错 * Spring 中,bean 的 class 属性指定了一个不存在的 class,会报错吗,如果会报错,在哪个阶段 * Spring 中的常见扩展点有哪些 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268346802652.jpg) ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268346682789.jpg) **MySQL** * MySQL 索引的数据结构 * 为什么使用 B+ 树,与其他索引相比有什么优点 * 各种索引之间的区别 * B+ 树在进行范围查找时怎么处理 * MySQL 索引叶子节点存放的是什么 * 联合索引(复合索引)的底层实现 * MySQL 如何锁住一行数据 * SELECT 语句能加互斥锁吗 * 多个事务同时对一行数据进行 SELECT FOR UPDATE 会阻塞还是异常 * MySQL 使用的版本和执行引擎 * MySQL 不同执行引擎的区别 * MySQL 的事务隔离级别 * MySQL 的可重复读是怎么实现的 * MySQL 是否会出现幻读 * MySQL 的 gap 锁 * MySQL 的主从同步原理 * 分库分表的实现方案 * 分布式唯一 ID 方案 * 如何优化慢查询 * explain 中每个字段的意思 * explain 中的 type 字段有哪些常见的值 * explain 中你通常关注哪些字段,为什么 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268346399551.jpg) ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268346254791.jpg) **JVM** * 运行时数据区 * 服务器使用的什么垃圾收集器 * CMS 垃圾收集的原理 * G1 垃圾收集的特点,为什么低延迟 * 有哪些垃圾回收算法,优缺点 * 哪些对象可以作为 GC Roots * 有哪些类加载器 * 双亲委派模式,哪些场景是打破双亲委派模式 * 线上服务器出现频繁 Full GC,怎么排查 * 定位问题常用哪些命令 * 介绍下 JVM 调优的过程 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268346641405.jpg) ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268347154124.jpg) **Kafka** * 为什么使用 Kafka * 介绍下 Kafka 的各个组件 * 如何保证写入 Kafka 的数据不丢失 * 如何保证从 Kafka 消费的数据不丢失 * Kafka 为什么性能这么高 * 零拷贝技术使用哪个方法实现 * Java 中也有类似的零拷贝技术,是哪个方法 * Kafka 怎么保证消息的顺序消费 * Kafka 怎么避免重复消费 * 什么是 HighWatermark 和 LEO * 什么是 ISR,为什么需要引入 ISR ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268347174694.jpg) ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268347123966.jpg) **Redis** * 项目中使用的 Redis 版本 * Redis 在项目中的使用场景 * Redis 怎么保证高可用 * Redis 的选举流程 * Redis 和 Memcache 的区别 * Redis 的集群模式 * Redis 集群要增加分片,槽的迁移怎么保证无损 * Redis 分布式锁的实现 * Redis 删除过期键的策略 * Redis 的内存淘汰策略 * Redis 的 Hash 对象底层结构 * Redis 中 Hash 对象的扩容流程 * Redis 的 Hash 对象的扩容流程在数据量大的时候会有什么问题吗 * Redis 的持久化机制有哪几种 * RDB 和 AOF 的实现原理、优缺点 * AOF 重写的过程 * 哨兵模式的原理 * 使用缓存时,先操作数据库还是先操作缓存 * 为什么是让缓存失效,而不是更新缓存 * 缓存穿透、缓存击穿、缓存雪崩 * 更新缓存的几种设计模式 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268347164747.jpg) ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268347401007.jpg) **Zookeeper** * Zookeeper 的使用场景 * Zookeeper 怎么实现分布式锁 * Zookeeper 怎么保证数据的一致性 * ZAB 协议的原理 * Zookeeper 遵循 CAP 中的哪些 * Zookeeper 和 Eureka 的区别 * Zookeeper 的 Leader 选举 * Observer 的作用 * Leader 发送了 commit 消息,但是所有的 follower 都没有收到这条消息,Leader 就挂了,后续会怎么处理 ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268347209203.jpg) ![](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268347717030.jpg) **分布式** * CAP 理论 * BASE 理论 * 分布式事务 2PC 和 TCC 的原理 * TCC 在 cancel 阶段如果出现失败怎么处理 * Paxos 算法、Raft 算法 **4、Hr 面** 如果你一路过五关斩六将,最终来到了 Hr 面,那么恭喜你,你已经离 offer 非常非常近了。可以开始畅想自己升职加薪,当上总经理,出任 CEO,迎娶白富美,走上人生巅峰的场景了。 Hr 面主要是了解候选人的一些通用素质,经常会问的问题如下: * 介绍下自己投入最多的项目(当时我就惊了,Hr 也开始问项目了 ) * 离职的原因 * 当前的薪资、绩效 * 当前在面试的其他公司的情况 * 平时有没有学习的习惯,怎么学习的,现在在学习什么 * 未来的规划 # 总结 无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。 最后,如果有想要我整理的面试资料的,可以**[戳这里免费领取](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)**,我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。 ![面试了阿里,滴滴,网易,蚂蚁,最终有幸去了网易【面试题分享】](http://www.www.zyiz.net/i/li/?n=2&i=images/20210703/1625268348550457.jpg)
这篇关于Java中导出海量数据到excel,层层深入的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!