1 面试相关问题

就业情况

  1. 传统开发 SSH
  2. 框架开发
  3. 架构开发

新兴互联网:

集群架构、高并发、分布式、高可用、性能调优

思考

  1. 重复
  2. 动态扩充
  3. 足够安全

技术栈:

SSH SSM Linux Maven Web 开发(JSP, Servlet)

学习捷径

  1. JSP + JavaBean
  2. MVC AJax Json JQuery Bootstrap Maven Git CURD 分页 上传
  3. 框架学习 Spring SpringMVC Shiro MyBatis
  4. 微服务 SpringBoot

常见面试题

1、Java 类集

List Set Map Iterator Enumeration

List 索引取值

  1. ArrayList 包装了数组的集合,常用,数组可变
  2. LinkedList 链表实现,搜索数据的时间复杂度为 n

Set

  1. HashSet 无序 重复判断依据:hashCode() 与 equals
  2. TreeSet 有序 依靠 Comparable 排序
  3. LinkedHashSet 有序 继承 HashSet

Map

  1. 输出 Map.Entry Iterator
  2. HashMap
  3. 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 工作原理,控制反转怎么实现?编码过滤器实现

  1. Spring 核心组成: IOC&DI(工厂设计) AOP(动态代理模式)
  2. XML 解析处理: DOM4J
  3. Annotation 必须要求有一个容器

编码过滤器:

  1. Struts 1.x SpringMVC,JSP + Servlet 都可以通过过滤器完成
  2. Struts 2.x 必须通过拦截器完成

实现:

在配置文件中设置编码,程序运行时动态取得设置的编码

需要设置两个编码:请求编码,响应编码

4、框架源码

框架核心思想:反射+XML(annotation)

  1. Struts2 请求交给过滤器执行,过滤器交给控制器完成(action)
  2. SpringMVC 本质是一个 DispatcherServlet
  3. Hibernate 反射和 DOM4J 解析处理

5、动态代理

  1. 直接使用 InvocationHandler 接口进行实现,同时利用 Proxy 类设置动态请求对象
  2. 使用 CGLIB 来避免"代理设计模式需要使用接口实现"的限制

6、action 是单实例还是多实例

  1. Struts2 和 SpringMVC 中的 Action 都是多实例
  2. Struts1 的 Action 是单实例

Struts2 和 SpringMVC 可以通过@Scope="prototype"进行控制

7、怎么配置 Bean

主要在 Spring 里面,重点由 xml 和 annotation 扫描负责

  1. xml 中直接使用<bean>, Spring 容器启动时就可以进行初始化
  2. Annitation 必须设置 context 命名空间,而后进行扫描包的配置

8、修改单实例多实例

@Scope="prototype"

9、Java 的设计模式

  1. 工厂
  2. 代理
  3. 单例 Runtime
  4. 合成
  5. 门面 JDBC
  6. 装饰 PrintStream、PrintWrite
  7. 模板 Servlet

10、事务控制

  1. MySQL 数据库引擎 type=innodb
  2. 事务的核心控制: commit rollback
  3. Spring 利用 AspectJ 设置 AOP 切面,进行声明式事务控制

11、脏读、幻读、不可重复读

  1. 脏读:读取未提交数据
  2. 一个事务读取另外一个事务还没有提交的数据
  3. 读取了未提交的新事物,然后被回滚了
  4. 幻读:前后多次读取,数据总量不一致
  5. 当事务不独立执行时,插入或者删除另一个事务当前影响的数据
  6. 读取了提交的新事物,指增删操作
  7. 不可重复读:前后多次读取,数据内容不一致
  8. 同一个事务内,两次相同的查询返回了不同的结果
  9. 读取了提交的新事物,指更新操作

12、Spring 7 个事务传播行为
REQUIRED
如果存在一个事务,则支持当前事务。
如果没有事务,则开启新事务

13、购物车实现

基于:
Session 浏览器关闭后消失
Cookie 数据保存在本地,如果切换到手机无效
数据库 可以在不同终端上持续操作

实现:
Ajax
如果访问频繁需要设计购物车子系统模块

14、统计一天的订单量
如果一天 1w 条,随便处理

千万级不能使用 count 和 where
处理方式分时统计,文件计数(考虑同步),不能用于抢购环节

15、IN、HAVING、EXISIT

  1. IN 判断具体的几项数据
  2. HAVING 针对分组后数据筛选,依然要使用统计函数
  3. EXISIT 判断子查询是否有数据

16、定时任务

  1. Java:TimeTask Timer 只能够做频率操作
  2. 使用 quartz 准确时间点触发

17、JVM 内存管理

  1. 内存分为:栈(Java 虚拟机栈)、堆、程序计数器、方法区、本地方法栈
  2. 垃圾处理操作指的是堆内存:年轻代,老年代,永生代(JDK1.8 移除)

18、堆内存、栈内存溢出

  1. 栈溢出:栈帧
  2. 堆溢出:OutOfMemoryError

19、缓存

  1. 目的:提高查询效率

  2. 缓存组件:

  3. EhCache 数据库

  4. OSCache 页面

  5. 缓存数据库

  6. redis 数据保存到磁盘,15w/s

  7. memcached

20、统计所有重名用户

  1. 数据量大考虑位图索引
  2. 数量量小使用分组统计

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、底层实现算法

  1. HashMap 在数据量大的时候会自动转换为红黑树
  2. 数组、队列、链表、树、图

项目:
公认项目:传统办公系统,管理平台,ERP CRM OA,不用考虑用户量
互联网:产品,电商,考虑用户量大
专业背景:数据采集,分析操作