环保网站可以做哪些方面六安城市网
2026/4/6 6:01:31 网站建设 项目流程
环保网站可以做哪些方面,六安城市网,一个高端网站设计,网站服务器报价#x1f525; 广州小厂Java实习面经#xff08;爱奇创新#xff09;#xff1a;从笔试到面试#xff0c;线程池、设计模式、Spring IOC、Redis签到与ES分词全解析 发布时间#xff1a;2026年1月15日 字数#xff1a;约9200字 阅读时长#xff1a;27分钟 适用人群… 广州小厂Java实习面经爱奇创新从笔试到面试线程池、设计模式、Spring IOC、Redis签到与ES分词全解析发布时间2026年1月15日字数约9200字阅读时长27分钟适用人群Java实习生、计算机相关专业应届生、准备初级后端岗位面试的在校学生关键词Java实习面试、广州小厂面经、线程池、Thread.sleep(0)、设计模式、Spring IOC、BeanFactory vs ApplicationContext、饿汉式懒汉式、Redis签到、Elasticsearch分词、搜索二维矩阵、SQL多表查询、CompletableFuture在广州众多中小型科技公司中“爱奇创新”虽非大厂但其Java实习岗位的考察内容却兼具广度与深度——不仅有扎实的笔试基础题更有贴近工程实践的场景设计题。本文基于一位候选人的真实经历完整还原“笔试 面试”全流程采用“面试官提问 候选人专业回答”的对话形式深入剖析10道笔试题与5大面试连环问涵盖Java 异常体系与线程模型线程池原理与最佳实践设计模式与单例实现Spring IOC 容器核心机制Redis 位图签到方案Elasticsearch 分词优化策略手撕代码Switch、SQL、算法无论你正在备战实习面试还是希望系统梳理 Java 后端知识体系本文都将为你提供极具参考价值的实战指南。一、笔试环节10道题直击Java核心基础到达公司后HR先让我填写基本信息表随后发放一份纸质笔试卷共10题限时40分钟。题目如下1. Exception 和 Error 都继承自 Throwable有什么区别标准答案Error表示 JVM 无法处理的严重系统错误如OutOfMemoryError、StackOverflowError。程序通常不应捕获因为无法恢复。Exception表示程序运行中可能出现的异常情况可分为Checked Exception受检异常编译器强制要求处理如IOExceptionUnchecked Exception非受检异常即RuntimeException及其子类如NullPointerException可不显式处理。关键区分是否需要try-catch或throws声明。2. 线程的Thread.sleep(0)有什么意义有什么替代方法标准答案Thread.sleep(0)的作用是主动让出当前 CPU 时间片触发线程调度器重新进行线程优先级评估使其他同优先级或更高优先级的线程有机会执行。它常用于高频率循环中避免“独占”CPU。替代方法Thread.yield()提示调度器让出 CPU但不保证一定切换使用LockSupport.parkNanos(1)实现更精确的微等待更推荐使用并发工具类如CountDownLatch、Semaphore替代忙等待。⚠️注意sleep(0)并非“无操作”它会触发一次完整的线程状态切换RUNNABLE → TIMED_WAITING → RUNNABLE有一定开销。3. 线程池的意义是什么你会怎么创建线程池使用Executors有什么缺陷标准答案线程池的意义降低资源消耗复用线程提高响应速度任务到来时无需创建线程便于统一管理控制并发数、拒绝策略等正确创建方式不要直接使用Executors工具类因其存在严重缺陷newFixedThreadPool/newSingleThreadExecutor使用无界LinkedBlockingQueue可能导致 OOMnewCachedThreadPool最大线程数为Integer.MAX_VALUE可能创建过多线程导致系统崩溃。推荐手动创建ThreadPoolExecutorexecutornewThreadPoolExecutor(2,// corePoolSize4,// maximumPoolSize60L,TimeUnit.SECONDS,// keepAliveTimenewLinkedBlockingQueue(100),// 有界队列newThreadFactoryBuilder().setNameFormat(my-pool-%d).build(),newThreadPoolExecutor.CallerRunsPolicy()// 拒绝策略);✅最佳实践始终使用有界队列 明确拒绝策略避免资源耗尽。4.shutdown()之后线程池已经提交的任务会被执行吗标准答案会。shutdown()的作用是平滑关闭线程池不再接受新任务调用submit()会抛出RejectedExecutionException但已提交的任务包括队列中的会继续执行完毕。若需立即停止应使用shutdownNow()它会尝试中断所有正在执行的任务并返回未执行的任务列表。5. Java 的设计模式有哪些标准答案分类列举创建型单例Singleton、工厂Factory、抽象工厂、建造者Builder、原型Prototype结构型适配器Adapter、代理Proxy、装饰器Decorator、外观Facade、组合Composite行为型策略Strategy、观察者Observer、责任链Chain of Responsibility、模板方法Template Method、命令Command重点掌握单例、工厂、代理、观察者、策略——这五种在 Spring 和日常开发中最常见。6. UUID 是 32 位的 16 进制编码怎么转换成 Base64写出计算方式。标准答案UUID 本质是一个128 位16 字节的二进制数。标准字符串形式如550e8400-e29b-41d4-a716-446655440000是 32 位十六进制 4 个连字符共 36 字符。转换步骤去掉连字符得到 32 位 hex 字符串将 hex 字符串转为 byte 数组16 字节对 byte 数组进行 Base64 编码。Java 示例StringuuidStr550e8400-e29b-41d4-a716-446655440000;StringhexuuidStr.replace(-,);byte[]bytesnewBigInteger(0hex,16).toByteArray();// 去掉可能的符号位BigInteger 补0导致多1字节if(bytes.length17bytes[0]0){bytesArrays.copyOfRange(bytes,1,17);}Stringbase64Base64.getEncoder().encodeToString(bytes);System.out.println(base64);// VQ6EAOKbQdSnFkRmVUQAAA长度对比UUID 字符串36 字符Base64 编码24 字符128 bits / 6 ≈ 21.3 → 向上取整为 24含 padding✅优势Base64 更短适合 URL 或存储空间敏感场景。7. Java 的饿汉式和懒汉式有什么区别标准答案两者都是单例模式的实现方式。饿汉式类加载时就创建实例线程安全但可能造成资源浪费。publicclassSingleton{privatestaticfinalSingletonINSTANCEnewSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returnINSTANCE;}}懒汉式双重检查锁 DCL首次调用getInstance()时才创建节省资源需加volatile防止指令重排序。publicclassSingleton{privatestaticvolatileSingletoninstance;privateSingleton(){}publicstaticSingletongetInstance(){if(instancenull){synchronized(Singleton.class){if(instancenull){instancenewSingleton();}}}returninstance;}}现代推荐使用静态内部类或枚举实现单例更简洁安全。8. 对 Spring 的 IOC 的理解标准答案IOCInversion of Control控制反转是 Spring 的核心思想。传统编程中对象由我们自己new而 IOC 将对象的创建、依赖注入和生命周期管理交给 Spring 容器。我们只需通过配置XML/注解“声明”需要什么容器自动完成装配。好处解耦、便于测试、统一管理 Bean。9.BeanFactory和ApplicationContext这两个 Spring 的 IOC 容器的区别标准答案BeanFactorySpring 最底层的 IOC 容器接口提供基本的 Bean 管理功能如getBean()懒加载使用时才创建 Bean。ApplicationContextBeanFactory的子接口提供更多企业级特性自动注册 BeanPostProcessor、BeanFactoryPostProcessor国际化支持MessageSource事件发布机制ApplicationEvent资源访问ResourceLoader启动时预初始化所有单例 Bean非懒加载实际开发中几乎 always 使用ApplicationContext如AnnotationConfigApplicationContext。10. 算法题LeetCode 搜索二维矩阵 IILC 240题目编写一个高效算法在 m x n 矩阵中搜索目标值 target。该矩阵具有如下特性每行的整数从左到右升序排列每列的整数从上到下升序排列最优解O(mn)publicbooleansearchMatrix(int[][]matrix,inttarget){if(matrixnull||matrix.length0)returnfalse;introw0,colmatrix[0].length-1;// 从右上角开始while(rowmatrix.lengthcol0){if(matrix[row][col]target){returntrue;}elseif(matrix[row][col]target){col--;// 当前值太大向左移动}else{row;// 当前值太小向下移动}}returnfalse;}思路利用矩阵的有序性从右上角或左下角出发每次排除一行或一列。二、面试环节手撕代码 场景设计连环问笔试结束后技术面试官带我进入会议室开启高强度连环追问。面试官提问“请手写一个 switch 语句。”候选人回答intday3;StringdayStr;switch(day){case1:dayStrMonday;break;case2:dayStrTuesday;break;case3:dayStrWednesday;break;default:dayStrUnknown;}System.out.println(dayStr);// 输出 Wednesday注意点Java 7 支持String作为 switch 条件必须加break否则会穿透fall-throughdefault可放在任意位置但建议放最后。面试官提问“有 user 和 phone 两张表user(id, name)phone(id, user_id, number)。请写 SQL 查询 phone 表中有一条及以上记录的 user。”候选人回答这是典型的“存在性查询”可用EXISTS或IN 子查询但更高效的是GROUP BY HAVING-- 方法1使用 EXISTS推荐性能好SELECTu.*FROMuseruWHEREEXISTS(SELECT1FROMphone pWHEREp.user_idu.id);-- 方法2使用 INNER JOIN去重需 DISTINCTSELECTDISTINCTu.*FROMuseruINNERJOINphone pONu.idp.user_id;-- 方法3使用 IN注意 NULL 问题SELECT*FROMuserWHEREidIN(SELECTuser_idFROMphoneWHEREuser_idISNOTNULL);最佳选择EXISTS因为它在找到第一条匹配记录后即可停止子查询效率最高。面试官提问“根据你的项目假设有 A、B、C 三个任务C 必须等待 A 和 B 都完成后才能执行怎么实现”候选人回答在 Java 中有多种方式实现任务依赖方案1使用CountDownLatchCountDownLatchlatchnewCountDownLatch(2);newThread(()-{// 任务Alatch.countDown();}).start();newThread(()-{// 任务Blatch.countDown();}).start();// 任务Clatch.await();// 阻塞直到计数归零System.out.println(A and B done, start C);方案2推荐使用CompletableFuture更现代、灵活CompletableFutureVoidtaskACompletableFuture.runAsync(()-{// 任务A逻辑});CompletableFutureVoidtaskBCompletableFuture.runAsync(()-{// 任务B逻辑});// 等待A和B都完成再执行CCompletableFuture.allOf(taskA,taskB).thenRun(()-{// 任务C逻辑System.out.println(A and B done, start C);}).join();优势CompletableFuture支持链式调用、异常处理、自定义线程池是 Java 8 的首选。面试官提问“要实现每月签到功能怎么设计”候选人回答我会使用Redis 的 Bitmap位图来实现这是业界标准方案。设计思路以用户 ID 年月 作为 key例如sign:1001:202601每个月最多 31 天用一个 31 位的 bitmap 表示第 1 天对应 offset0第 31 天对应 offset30操作命令签到SETBIT sign:1001:202601 0 11号签到查询是否签到GETBIT sign:1001:202601 0统计当月签到天数BITCOUNT sign:1001:202601获取连续签到天数需结合BITFIELD或程序逻辑计算优势极省空间31 天仅需 4 字节31 bits高性能O(1) 时间复杂度原子性Redis 单命令原子面试官追问“那你 int 要存储到哪里去”候选人回答这里的 “int” 指的是位偏移量offset它不需要单独存储。我们通过日期计算得出 offsetintdayOfMonthLocalDate.now().getDayOfMonth();// 如 15intoffsetdayOfMonth-1;// 0-basedredisTemplate.opsForValue().setBit(key,offset,true);面试官再追问“那 Redis 里存储的是什么数据”候选人回答Redis 中存储的是一个二进制位序列bitmap对外表现为一个 string 类型的 value。例如如果用户在 1 号、3 号、5 号签到则 bitmap 为位索引: 0 1 2 3 4 5 ... 30 值: 1 0 1 0 1 0 ... 0Redis 内部将其紧凑地存储为字节数组极大节省内存。面试官提问“你项目里用了 Elasticsearch那它的分词器怎么工作比如歌手名字叫‘一二’会不会被分成‘一’和‘二’怎么保证准确搜索”候选人回答默认的中文分词器如 standard analyzer会将“一二”按单字切分确实会导致过度分词影响搜索准确性。解决方案1. 使用专门的中文分词器ik_smart / ik_max_word支持词典可识别“周杰伦”为一个词jieba社区版中文分词插件。2. 自定义词典在 ik 分词器的IKAnalyzer.cfg.xml中添加自定义词典文件将“一二”加入词库确保不分词。3. 使用 keyword 类型字段对于歌手名、专辑名等精确匹配字段应设置 mapping 为keyword类型{mappings:{properties:{artist:{type:text,fields:{keyword:{type:keyword}}}}}}搜索时对精确匹配使用artist.keyword字段{term:{artist.keyword:一二}}4. 搜索时指定 analyzer查询时可临时指定不分词的 analyzer如keyword。总结“文本搜索用 text ik精确匹配用 keyword”是 ES 中文搜索的最佳实践。三、总结与建议这场来自广州小厂“爱奇创新”的实习面试充分体现了“基础扎实 场景落地”的考察导向笔试聚焦 Java 核心线程、异常、设计模式、JVM面试强调工程能力SQL、并发、Redis、ES✅ 给实习生的三大建议基础题必须零失误如线程池、单例、异常体系这些是“送分题”答错直接扣印象分。场景题要有方案思维不要只说“用 Redis”要说清“为什么用 Bitmap”、“key 如何设计”、“命令是什么”。手撕代码要规范变量命名、边界处理、注释口头说明都要体现专业素养。最后寄语小厂面试未必简单反而更看重动手能力和解决问题的思路。扎实的基础 清晰的表达 真实的项目经验是你脱颖而出的关键。如果你觉得这篇面经对你有帮助欢迎点赞、收藏也欢迎在评论区分享你的面试故事我们一起进步

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询