面试官最爱问的Java集合+多线程,详解+示例
文章目录一、开篇为什么面试官揪着这俩不放二、Java集合别只会用ArrayList了2.1 List三兄弟ArrayList、LinkedList、Vector2.2 Set家族HashSet、LinkedHashSet、TreeSet2.3 Map三巨头HashMap、ConcurrentHashMap、TreeMap三、多线程与线程池从打野到正规军3.1 为什么要用线程池3.2 线程池七大核心参数必背3.3 四种拒绝策略面试加分项3.4 为什么生产环境禁用Executors3.5 线程池参数怎么设硬核调优四、线程安全别让并发毁了你的数据4.1 ConcurrentHashMap vs Hashtable4.2 CopyOnWriteArrayList读多写少的神器五、实战代码能直接拿去面试的模板六、结语面试的本质是展示思维无意间发现了一个巨牛巨牛巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看传送门一、开篇为什么面试官揪着这俩不放兄弟们面试Java岗的时候有没有发现个规律甭管你简历上写了多么高大上的微服务、云原生架构面试官嘴角一扬总会轻描淡写地来一句“聊聊Java集合吧再说说多线程。”这时候你心里可能一万只羊驼奔腾我都准备给你讲Kubernetes调度Pod的精妙设计了你就问我ArrayList和LinkedList区别但说实话这俩知识点就像武功里的扎马步。你看那些面试翻车现场十个有八个是在HashMap源码或者线程池参数上栽的跟头。今天咱就把面试官那些弯弯绕绕的小心思给扒明白了顺便送你一套能直接拿去产线的代码模板。二、Java集合别只会用ArrayList了面试官问集合核心就考一件事你知不知道不同场景下该用啥容器。这就好比你去超市买东西总不能买个鸡蛋也拖着个行李箱去吧2.1 List三兄弟ArrayList、LinkedList、VectorArrayList动态数组查询速度快CPU缓存友好中间插入/删除需移动元素效率低时间复杂度O(n)。LinkedList双向链表插入删除效率高仅需修改指针查询需遍历效率较低。Vector线程安全方法上加synchronized性能差现已不推荐使用。2.2 Set家族HashSet、LinkedHashSet、TreeSet很多人被面试官问到Set是不是无序的就懵了。其实得看具体实现HashSet底层HashMap元素无序。LinkedHashSet在HashSet基础上维护双向链表保证插入顺序。TreeSet基于红黑树可按自然排序或比较器排序适合有序场景。2.3 Map三巨头HashMap、ConcurrentHashMap、TreeMapHashMap面试重灾区。JDK 1.8 后为数组链表红黑树链表长度≥8且数组长度≥64时转为红黑树查询复杂度从O(n)降至O(log n)。ConcurrentHashMap高并发首选。JDK 1.8 前分段锁1.8后CASsynchronized锁粒度更细不允许null键值。TreeMap基于红黑树key有序适合范围查询场景。三、多线程与线程池从打野到正规军如果说集合是数据结构的基本功那多线程就是性能优化的分水岭。面试官问线程池核心想看你懂不懂资源管控——毕竟线上环境线程创建太多直接OOM那可不是闹着玩的。3.1 为什么要用线程池想象你开了一家网红奶茶店。最傻的做法是每来一个客人就临时招个员工创建线程客人走了就辞退销毁线程。招人不要成本吗办理入职手续系统调用不耗时间吗线程池就是雇一群长期工核心线程站那儿待命活儿来了直接干干完了歇着但不辞退。这样降低资源消耗、提高响应速度还能统一管理避免人手过多把小店挤爆。3.2 线程池七大核心参数必背面试官最爱问这个七个参数一个不能少corePoolSize核心线程数长期维持空闲不回收可配置allowCoreThreadTimeOutmaximumPoolSize最大线程数keepAliveTime非核心线程空闲存活时间unit时间单位workQueue任务等待队列常用LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueuethreadFactory线程工厂可自定义线程名handler拒绝策略执行流程任务→核心线程→队列→非核心线程→拒绝策略。先尽量入队队列满才扩容线程避免频繁创建线程开销。3.3 四种拒绝策略面试加分项AbortPolicy直接抛异常默认CallerRunsPolicy提交任务的线程自己执行DiscardPolicy静默丢弃任务DiscardOldestPolicy丢弃队列最老任务生产推荐CallerRunsPolicy不丢任务且能削峰。3.4 为什么生产环境禁用ExecutorsnewFixedThreadPool/newSingleThreadExecutor无界队列易OOMnewCachedThreadPool最大线程数无上限易耗尽资源正确用法手动new ThreadPoolExecutor使用有界队列。3.5 线程池参数怎么设硬核调优CPU密集型线程数 CPU核数 1IO密集型线程数 CPU核数 × (1 IO等待时间/CPU处理时间)粗略可设为 2×CPU核数也可使用动态线程池框架如DynamicTp自动调整。四、线程安全别让并发毁了你的数据4.1 ConcurrentHashMap vs HashtableHashtable全局 synchronized读写串行性能差。ConcurrentHashMapJDK1.8 CAS 节点锁并发性能高size()为近似值。4.2 CopyOnWriteArrayList读多写少的神器读多写少场景优选。写时复制新数组修改后替换引用读无锁内存开销大不适合频繁写入。五、实战代码能直接拿去面试的模板publicclassThreadPoolConfig{publicThreadPoolExecutorcreateBusinessExecutor(){intcoreRuntime.getRuntime().availableProcessors();returnnewThreadPoolExecutor(core,// 核心线程数core*2,// 最大线程数60L,TimeUnit.SECONDS,newArrayBlockingQueue(200),// 有界队列防OOMnewThreadFactoryBuilder().setNameFormat(biz-pool-%d).setUncaughtExceptionHandler((t,e)-System.err.println(线程异常: t.getName())).build(),newThreadPoolExecutor.CallerRunsPolicy()// 拒绝策略);}// 优雅关闭publicvoidgracefulShutdown(ThreadPoolExecutorexecutor){executor.shutdown();try{if(!executor.awaitTermination(60,TimeUnit.SECONDS)){executor.shutdownNow();}}catch(InterruptedExceptione){executor.shutdownNow();Thread.currentThread().interrupt();}}}六、结语面试的本质是展示思维说到底面试官揪着集合和多线程不放不是为了听你背源码注释而是看你能不能说出不同场景的选择逻辑。ArrayList还是LinkedList看查询多还是增删多。HashMap还是ConcurrentHashMap看是否需要并发。线程池参数怎么设看任务是CPU密集型还是IO密集型。把这些决策思路讲清楚再加上点源码细节比如HashMap转红黑树的阈值、线程池的状态转换offer基本就跑不了了。下次面试祝你好运无意间发现了一个巨牛巨牛巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看传送门
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2474784.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!