尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Java面试核心知识点:值传递、集合框架与并发编程

Java面试核心知识点:值传递、集合框架与并发编程 1. Java基础面试题精选1.1 Java中的值传递与引用传递在Java面试中值传递和引用传递是必考的基础知识点。很多初学者容易混淆这两者的区别我们先来看一个典型例子public class PassByValueExample { public static void main(String[] args) { int num 10; modifyValue(num); System.out.println(num); // 输出仍然是10 User user new User(John); modifyReference(user); System.out.println(user.getName()); // 输出变为Mike } public static void modifyValue(int param) { param 20; } public static void modifyReference(User param) { param.setName(Mike); } } class User { private String name; // 构造方法和getter/setter省略 }这里的关键理解点是Java中只有值传递没有引用传递对于基本类型传递的是值的副本对于对象类型传递的是引用的副本即指针的拷贝注意面试时经常会被问到为什么Java中只有值传递需要能清晰解释对象引用传递的本质是传递引用的副本。1.2 String的不可变性String的不可变性是Java设计中的一个重要特性理解它对写出高效代码很有帮助String s1 hello; String s2 hello; String s3 new String(hello); String s4 s3.intern(); System.out.println(s1 s2); // true指向字符串常量池同一对象 System.out.println(s1 s3); // falses3是堆中新对象 System.out.println(s1 s4); // trueintern返回常量池引用实际开发中的经验频繁字符串拼接应该用StringBuilder大量相同字符串可以使用intern()方法节省内存敏感信息(如密码)应该用char[]而不是String存储2. Java集合框架深度解析2.1 HashMap的工作原理HashMap是面试中最常被问到的集合类其核心实现要点包括数据结构数组链表/红黑树(JDK8)哈希函数hash (h key.hashCode()) ^ (h 16)扩容机制默认负载因子0.75扩容时容量翻倍// 典型面试问题HashMap多线程下死循环问题 // JDK7版本中多线程扩容可能导致环形链表 // 解决方案使用ConcurrentHashMap或Collections.synchronizedMap2.2 ArrayList与LinkedList对比特性ArrayListLinkedList底层结构动态数组双向链表随机访问O(1)O(n)头部插入O(n)O(1)内存占用更紧凑每个元素额外指针适用场景读多写少写多读少实际开发建议预估数据量时ArrayList初始化指定容量避免扩容频繁在中间位置插入删除考虑LinkedList随机访问超过10万次时ArrayList优势明显3. 并发编程核心问题3.1 synchronized实现原理synchronized关键字的底层实现经历了多次优化JDK1.6前直接使用操作系统的互斥锁性能差锁升级过程无锁 - 偏向锁(单线程)偏向锁 - 轻量级锁(少量竞争)轻量级锁 - 重量级锁(激烈竞争)// 双重检查锁定单例模式 public class Singleton { private volatile static Singleton instance; public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } }注意volatile防止指令重排序保证可见性3.2 ThreadLocal内存泄漏问题ThreadLocal使用不当会导致内存泄漏public class ThreadLocalLeakDemo { private static ThreadLocalbyte[] threadLocal new ThreadLocal(); public static void main(String[] args) { new Thread(() - { threadLocal.set(new byte[10 * 1024 * 1024]); // 10MB // 忘记调用remove() }).start(); } }解决方案使用后必须调用remove()清理声明为static final减少实例数量使用WeakReference改进的ThreadLocal实现4. JVM性能调优实战4.1 内存区域与GC算法JVM内存结构关键点程序计数器线程私有唯一不会OOM的区域虚拟机栈栈帧(局部变量表、操作数栈等)堆对象实例GC主要区域方法区类信息、常量等(JDK8后元空间)GC算法对比算法优点缺点适用场景Serial简单高效单线程STW长客户端小内存Parallel多线程吞吐量高仍会STW后台计算型应用CMS并发收集停顿短内存碎片多互联网B/S系统G1可预测停顿时间内存占用较大大内存服务ZGC超低延迟(10ms内)JDK11对延迟敏感系统4.2 OOM问题排查步骤典型内存溢出排查流程使用jps查看Java进程IDjstat -gcutil [pid] 查看GC情况jmap -histo:live [pid] 查看对象分布jmap -dump:formatb,fileheap.hprof [pid] 导出堆转储使用MAT或VisualVM分析dump文件常见OOM场景堆溢出java.lang.OutOfMemoryError: Java heap space元空间溢出java.lang.OutOfMemoryError: Metaspace栈溢出java.lang.StackOverflowError直接内存溢出java.lang.OutOfMemoryError: Direct buffer memory5. 新特性与设计模式5.1 Java8 Stream API实战Stream操作的三阶段创建流stream()、parallelStream()、Arrays.stream()中间操作filter()、map()、distinct()、sorted()终止操作forEach()、collect()、reduce()、count()// 典型用例统计单词频率 ListString words Arrays.asList(hello, world, hello); MapString, Long wordCount words.stream() .collect(Collectors.groupingBy( Function.identity(), Collectors.counting() ));性能注意事项小数据量时stream可能比循环慢parallelStream要谨慎使用(数据量1万考虑)避免在stream内修改外部状态5.2 单例模式的六种实现从简单到复杂的单例实现演进饿汉式(静态常量)饿汉式(静态代码块)懒汉式(线程不安全)懒汉式(同步方法)双重检查锁定静态内部类枚举(最推荐)// 枚举实现单例(防反射攻击) public enum Singleton { INSTANCE; public void doSomething() { // 业务方法 } }枚举单例的优势线程安全防止反射创建新实例防止反序列化创建新实例代码简洁6. Spring框架核心原理6.1 IOC容器工作流程Spring IOC核心处理流程资源定位找到配置文件(xml/注解)加载解析BeanDefinition的读取与注册依赖注入属性填充(autowire)初始化aware接口回调、init-method使用通过getBean获取实例销毁disposableBean接口、destroy-method// 自定义BeanPostProcessor示例 public class MyBeanPostProcessor implements BeanPostProcessor { Override public Object postProcessBeforeInitialization(Object bean, String beanName) { System.out.println(初始化前处理: beanName); return bean; } Override public Object postProcessAfterInitialization(Object bean, String beanName) { System.out.println(初始化后处理: beanName); return bean; } }6.2 Spring事务传播机制七种传播行为对比传播行为类型说明REQUIRED(默认)当前有事务则加入没有则新建SUPPORTS当前有事务则加入没有则以非事务运行MANDATORY当前必须有事务否则抛异常REQUIRES_NEW新建事务挂起当前事务(完全独立)NOT_SUPPORTED以非事务执行挂起当前事务NEVER以非事务执行当前有事务则抛异常NESTED嵌套事务外层异常时回滚内层(基于保存点)实际开发经验99%场景用REQUIRED或REQUIRES_NEW嵌套事务(NESTED)使用较少且数据库要支持注意Transactional注解失效场景(同类调用、非public方法等)7. 数据库与缓存优化7.1 MySQL索引优化原则索引设计黄金法则最左前缀原则联合索引(a,b,c)只能按a、ab、abc顺序使用覆盖索引查询列都在索引中避免回表索引下推MySQL5.6特性减少回表次数避免索引失效使用!、、not in函数操作如LEFT(name,3)abc类型转换如字符串列用数字查询or条件未全部索引-- 索引失效案例 SELECT * FROM users WHERE age1030; -- 表达式运算 SELECT * FROM users WHERE DATE(create_time)2023-01-01; -- 函数操作 SELECT * FROM users WHERE name LIKE %abc; -- 左模糊7.2 Redis持久化策略两种持久化方式对比特性RDB(快照)AOF(日志)数据完整性可能丢失最后一次更改通常更完整(可配置)恢复速度更快较慢磁盘占用较小(二进制压缩)较大(文本命令)性能影响子进程方式影响较小同步写入影响较大适用场景数据备份、灾难恢复需要更高数据安全性生产环境建议主从架构中主库关闭持久化从库开启RDBAOF混合模式AOF配置为everysec平衡性能与安全定期检查备份文件有效性8. 分布式系统设计8.1 CAP理论实践应用CAP三选二的实际含义一致性(C)所有节点看到相同数据可用性(A)每个请求都能得到响应分区容错性(P)网络分区时系统仍能运行分布式系统设计选择系统类型选择典型代表CP系统放弃AZooKeeper、EtcdAP系统放弃CCassandra、EurekaCA系统放弃P单机数据库实际经验金融系统通常选择CP(如支付系统)互联网应用多选择AP(如社交网络)不存在完美的CA系统(网络分区不可避免)8.2 分布式锁实现方案常见分布式锁实现对比实现方式优点缺点适用场景数据库实现简单性能差、死锁风险低并发简单场景Redis性能高锁续期复杂高并发短期锁定ZooKeeper可靠性高性能中等需要高可靠性的场景etcd性能较好学习成本较高云原生环境Redis分布式锁最佳实践// Redisson实现示例 RLock lock redisson.getLock(myLock); try { // 尝试加锁最多等待100秒上锁后30秒自动解锁 boolean res lock.tryLock(100, 30, TimeUnit.SECONDS); if (res) { // 业务代码 } } finally { lock.unlock(); }关键点必须设置过期时间加锁与设置过期时间必须原子操作考虑锁续期问题(看门狗机制)释放锁要判断持有者9. 系统设计方法论9.1 秒杀系统设计要点高性能秒杀系统核心架构分层削峰前端验证码、答题、按钮置灰网关限流(令牌桶/漏桶)服务队列缓冲、异步处理存储库存预热、分段扣减热点数据处理Redis集群本地缓存库存分段(如1000库存分成10个段)避免大事务(先扣库存再创建订单)防作弊措施用户行为分析设备指纹识别购买频率限制// 分布式库存扣减示例(Lua脚本保证原子性) String script if redis.call(exists,KEYS[1])1 then\n local stock tonumber(redis.call(get,KEYS[1]))\n if stock0 then\n redis.call(decr,KEYS[1])\n return stock-1\n end\n return -1\n end\n return -2;9.2 微服务拆分原则领域驱动设计(DDD)拆分方法战略设计识别限界上下文(如订单、支付、物流)定义上下文映射关系(合作关系、客户-供应商等)战术设计实体(有唯一标识)值对象(通过属性定义)聚合根(外部访问入口)领域服务(跨实体的业务逻辑)拆分经验法则团队规模2Pizza原则(6-10人团队)业务变化频率高频变化部分独立性能需求高并发模块单独部署技术异构不同技术栈需求分离10. 性能优化全链路10.1 JVM参数调优指南生产环境JVM参数配置示例# JDK8推荐配置 java -Xms4g -Xmx4g \ -XX:MetaspaceSize256m -XX:MaxMetaspaceSize256m \ -Xmn2g \ -XX:UseG1GC \ -XX:MaxGCPauseMillis200 \ -XX:ParallelGCThreads4 \ -XX:ConcGCThreads2 \ -XX:HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath/path/to/dump.hprof \ -jar application.jar关键参数说明Xms/Xmx堆内存初始/最大值(建议设为相同)MetaspaceSize元空间初始大小Xmn新生代大小(通常为堆的1/2到1/3)UseG1GC使用G1垃圾收集器MaxGCPauseMillis目标最大停顿时间10.2 全链路压测要点生产环境压测实施步骤环境准备影子表/影子库流量镜像数据脱敏压测场景设计基准测试(单接口)负载测试(逐步增加压力)压力测试(极限情况)稳定性测试(长时间运行)监控指标应用层QPS、RT、错误率系统层CPU、内存、IO、网络中间件连接池、线程池、队列数据库TPS、锁等待、慢查询优化闭环瓶颈定位(火焰图、线程dump)优化实施(代码/配置/架构)验证效果(对比测试)
返回列表