1 面试相关问题
就业情况
- 传统开发 SSH
- 框架开发
- 架构开发
新兴互联网:
集群架构、高并发、分布式、高可用、性能调优
思考
- 重复
- 动态扩充
- 足够安全
技术栈:
SSH SSM Linux Maven Web 开发(JSP, Servlet)
学习捷径
- JSP + JavaBean
- MVC AJax Json JQuery Bootstrap Maven Git CURD 分页 上传
- 框架学习 Spring SpringMVC Shiro MyBatis
- 微服务 SpringBoot
常见面试题
1、Java 类集
List Set Map Iterator Enumeration
List 索引取值
- ArrayList 包装了数组的集合,常用,数组可变
- LinkedList 链表实现,搜索数据的时间复杂度为 n
Set
- HashSet 无序 重复判断依据:hashCode() 与 equals
- TreeSet 有序 依靠 Comparable 排序
- LinkedHashSet 有序 继承 HashSet
Map
- 输出 Map.Entry Iterator
- HashMap
- WeakHashMap 弱引用
编写链表和二叉树
2、字符串哈希相等,equals 相等吗?反过来
(1)直接赋值
String str1 = "hello"; String str2 = "hello"; System.out.println(str1.equals(str2)); // true
(2)构造方法
String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1.equals(str2)); // true
(3)StringBuffer
String str1 = new StringBuffer("hello").toString(); String str2 = "hello"; System.out.println(str1.equals(str2)); // true
字符串哈希相等,equals 相等 反过来成立
源码实现
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; } public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
3、Spring 工作原理,控制反转怎么实现?编码过滤器实现
- Spring 核心组成: IOC&DI(工厂设计) AOP(动态代理模式)
- XML 解析处理: DOM4J
- Annotation 必须要求有一个容器
编码过滤器:
- Struts 1.x SpringMVC,JSP + Servlet 都可以通过过滤器完成
- Struts 2.x 必须通过拦截器完成
实现:
在配置文件中设置编码,程序运行时动态取得设置的编码
需要设置两个编码:请求编码,响应编码
4、框架源码
框架核心思想:反射+XML(annotation)
- Struts2 请求交给过滤器执行,过滤器交给控制器完成(action)
- SpringMVC 本质是一个 DispatcherServlet
- Hibernate 反射和 DOM4J 解析处理
5、动态代理
- 直接使用 InvocationHandler 接口进行实现,同时利用 Proxy 类设置动态请求对象
- 使用 CGLIB 来避免"代理设计模式需要使用接口实现"的限制
6、action 是单实例还是多实例
- Struts2 和 SpringMVC 中的 Action 都是多实例
- Struts1 的 Action 是单实例
Struts2 和 SpringMVC 可以通过@Scope="prototype"进行控制
7、怎么配置 Bean
主要在 Spring 里面,重点由 xml 和 annotation 扫描负责
- xml 中直接使用
<bean>
, Spring 容器启动时就可以进行初始化 - Annitation 必须设置 context 命名空间,而后进行扫描包的配置
8、修改单实例多实例
@Scope="prototype"
9、Java 的设计模式
- 工厂
- 代理
- 单例 Runtime
- 合成
- 门面 JDBC
- 装饰 PrintStream、PrintWrite
- 模板 Servlet
10、事务控制
- MySQL 数据库引擎 type=innodb
- 事务的核心控制: commit rollback
- Spring 利用 AspectJ 设置 AOP 切面,进行声明式事务控制
11、脏读、幻读、不可重复读
- 脏读:读取未提交数据
- 一个事务读取另外一个事务还没有提交的数据
- 读取了未提交的新事物,然后被回滚了
- 幻读:前后多次读取,数据总量不一致
- 当事务不独立执行时,插入或者删除另一个事务当前影响的数据
- 读取了提交的新事物,指增删操作
- 不可重复读:前后多次读取,数据内容不一致
- 同一个事务内,两次相同的查询返回了不同的结果
- 读取了提交的新事物,指更新操作
12、Spring 7 个事务传播行为
REQUIRED
如果存在一个事务,则支持当前事务。
如果没有事务,则开启新事务
13、购物车实现
基于:
Session 浏览器关闭后消失
Cookie 数据保存在本地,如果切换到手机无效
数据库 可以在不同终端上持续操作
实现:
Ajax
如果访问频繁需要设计购物车子系统模块
14、统计一天的订单量
如果一天 1w 条,随便处理
千万级不能使用 count 和 where
处理方式分时统计,文件计数(考虑同步),不能用于抢购环节
15、IN、HAVING、EXISIT
- IN 判断具体的几项数据
- HAVING 针对分组后数据筛选,依然要使用统计函数
- EXISIT 判断子查询是否有数据
16、定时任务
- Java:TimeTask Timer 只能够做频率操作
- 使用 quartz 准确时间点触发
17、JVM 内存管理
- 内存分为:栈(Java 虚拟机栈)、堆、程序计数器、方法区、本地方法栈
- 垃圾处理操作指的是堆内存:年轻代,老年代,永生代(JDK1.8 移除)
18、堆内存、栈内存溢出
- 栈溢出:栈帧
- 堆溢出:OutOfMemoryError
19、缓存
-
目的:提高查询效率
-
缓存组件:
-
EhCache 数据库
-
OSCache 页面
-
缓存数据库
-
redis 数据保存到磁盘,15w/s
- memcached
20、统计所有重名用户
- 数据量大考虑位图索引
- 数量量小使用分组统计
22、使用 InputStream 用什么方法
read()
23、JQuery 绑定事件
$.on("click", function () {});
24、JQuery 使用 Ajax 的处理函数
$ajax(), $.get(), $.post(), $.jsonp();
25、Spring 控制层返回什么
String, ModelAndView
26、WebService
web 服务调用,CXF, Jersey
27、RPC
远程过程调用
28、Spring 自动注入注解
@Component
@Service
@Repository
@Controller
29、缓存是什么
ORM 缓存有两种(一级,二级),主要使用 EHCache 组件
源码问题
1、框架源码
2、底层实现算法
- HashMap 在数据量大的时候会自动转换为红黑树
- 数组、队列、链表、树、图
项目:
公认项目:传统办公系统,管理平台,ERP CRM OA,不用考虑用户量
互联网:产品,电商,考虑用户量大
专业背景:数据采集,分析操作