异工同智-Java开发 一面 面经
1、请做个简单的自我介绍
您好,我叫[姓名],[学校][专业]毕业,目前有[X]年的Java开发经验。技术方面,我熟练掌握Java核心技术、Spring Boot、MyBatis、Redis、MySQL等主流技术栈,对微服务架构和分布式系统有一定的实践经验。项目经验上,我主要参与过企业管理系统、电商平台等项目的开发,负责过用户模块、订单模块等核心功能的设计和实现。在开发过程中,我比较注重代码质量和系统性能,遇到过一些技术难题也都通过学习和实践解决了。我对技术比较有热情,平时会关注一些技术博客和开源项目,持续提升自己的能力。希望能加入贵公司,在实际项目中继续成长。
2、MyBatis框架你了解多少,用过哪些特性
MyBatis是我项目中常用的持久层框架,我对它还是比较熟悉的:
- 基本使用方面,MyBatis通过XML或注解的方式配置SQL语句,把Java对象和数据库记录映射起来。我主要用XML方式,因为SQL和代码分离,维护起来更方便。常用的标签有select、insert、update、delete,还有resultMap用来做复杂的结果映射。
- 动态SQL方面,这是MyBatis很强大的功能。用if标签做条件判断,where标签自动处理AND和OR,foreach标签处理集合参数。比如做条件查询时,用户可能只输入部分条件,就用if标签动态拼接SQL,避免写很多重复代码。
- 参数传递方面,单个参数直接用#{参数名}接收,多个参数可以用@Param注解指定名称,或者封装成对象。#{}是预编译的,可以防止SQL注入,${}是直接拼接,一般不用。
- 结果映射方面,简单的查询MyBatis会自动映射,字段名和属性名对应。复杂的需要用resultMap,可以配置一对一、一对多的关联关系。比如查询订单带订单明细,就用collection标签配置一对多。
- 缓存机制方面,MyBatis有一级缓存和二级缓存。一级缓存是SqlSession级别的,默认开启,同一个SqlSession内相同查询会走缓存。二级缓存是Mapper级别的,需要手动开启,可以跨SqlSession共享。但实际项目中我们一般用Redis做缓存,MyBatis的缓存用得少。
- 插件机制方面,MyBatis支持拦截器,可以拦截Executor、StatementHandler等对象的方法。常用的分页插件PageHelper就是基于拦截器实现的。我们项目中用PageHelper做分页,很方便。
- 性能优化方面,要注意避免N+1查询问题,就是查询主表后循环查询关联表,会产生大量SQL。解决方法是用association或collection做关联查询,或者分两次查询在代码里组装。还要注意批量操作,用foreach标签批量插入或更新,比循环调用效率高很多。
3、Java中的集合框架有哪些,分别适用什么场景
Java集合框架主要分为两大类,Collection和Map:
- List接口下有ArrayList、LinkedList、Vector。ArrayList底层是数组,查询快增删慢,适合查询多的场景。LinkedList底层是双向链表,增删快查询慢,适合频繁插入删除的场景。Vector是线程安全的ArrayList,但性能差,现在基本不用了。我项目中最常用ArrayList,因为大部分场景都是查询多。
- Set接口下有HashSet、LinkedHashSet、TreeSet。HashSet基于HashMap实现,无序不重复,适合去重场景。LinkedHashSet保持插入顺序,适合需要保持顺序的去重。TreeSet基于红黑树,元素有序,适合需要排序的场景。我用HashSet做过用户标签去重,用TreeSet做过成绩排名。
- Queue接口下有LinkedList、PriorityQueue、ArrayDeque。LinkedList可以当队列用,先进先出。PriorityQueue是优先级队列,元素按优先级排序。ArrayDeque是双端队列,两端都可以操作,比LinkedList效率高。我用PriorityQueue做过任务调度,按优先级处理任务。
- Map接口下有HashMap、LinkedHashMap、TreeMap、Hashtable。HashMap是最常用的,键值对存储,查询效率O。LinkedHashMap保持插入顺序或访问顺序,可以用来实现LRU缓存。TreeMap按key排序,适合需要排序的场景。Hashtable是线程安全的HashMap,但性能差,现在用ConcurrentHashMap代替。
- 并发集合有ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等。ConcurrentHashMap是线程安全的HashMap,性能比Hashtable好很多。CopyOnWriteArrayList适合读多写少的场景,写时复制一份,不影响读操作。
选择集合的原则是:1)需要键值对用Map,需要单个元素用Collection;2)允许重复用List,不允许重复用Set;3)需要排序用TreeSet或TreeMap;4)多线程环境用并发集合;5)查询多用ArrayList,增删多用LinkedList。
4、数组和链表的优缺点分别是什么
数组和链表是两种基础的数据结构,各有优缺点:
数组的优点:1)随机访问效率高,通过下标可以O(1)时间访问任意元素,因为内存是连续的,可以直接计算地址;2)内存利用率高,只存储数据本身,没有额外的指针开销;3)缓存友好,连续内存访问时CPU缓存命中率高,性能好。
数组的缺点:1)插入删除效率低,中间插入或删除需要移动后面所有元素,时间复杂度O(n);2)大小固定,创建时就要确定大小,扩容需要重新分配内存并拷贝数据,成本高;3)内存要求高,需要一块连续的内存空间,大数组可能分配失败。
链表的优点:1)插入删除效率高,只需要修改指针,时间复杂度O(1),不需要移动元素;2)大小灵活,可以动态增长,不需要预先分配空间;3)内存要求低,不需要连续内存,可以利用碎片空间。
链表的缺点:1)随机访问效率低,访问第n个元素需要从头遍历,时间复杂度O(n);2)内存开销大,每个节点除了数据还要存储指针,双向链表要存两个指针;3)缓存不友好,节点在内存中不连续,访问时缓存命中率低。
实际应用中的选择:1)如果需要频繁随机访问,用数组,比如ArrayList;2)如果需要频繁插入删除,用链表,比如LinkedList;3)如果数据量固定且需要高性能访问,用数组;4)如果数据量不确定且需要灵活操作,用链表。
我在项目中遇到过一个性能问题,原来用Linked
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java面试圣经,带你练透java圣经
查看9道真题和解析