Java面试差缺补漏(网上资料整理)

本文基于:BAT研发面试36题总结:Spring+Redis+Docker+Dubbo

文章目录

  • 一面
    • ArrayList和linkedlist区别。ArrayList是否会越界。
    • 数据库引擎Innodb和myisam区别
    • 什么是多态
    • redis:list的底层实现--压缩列表
    • redis有序集合zset的底层实现——跳跃表skiplist
    • 海量数据过滤,黑名单过滤一个url
    • 数据库的悲观锁和乐观锁应用场景。
  • 二面
    • list set map 底层使用什么实现的有哪些典型实现
    • hashmap扩容是怎么扩容的,为什么是2的幂
    • concurrenthashmap为什么线程安全,采用了什么措施应对高并发
    • 线程池的参数有什么意义
    • Springmvc请求流程
    • Spring IOC,autowired如何实现
  • 三面
    • CDN加速过程
    • 分布式架构设计哪方面比较熟悉
    • 讲讲你对CDN的了解,与分布式缓存和本地缓存的区别
    • 多线程和高并发有什么区别
    • 高并发下有哪些常用的技术解决方案,举三个高并发场景设计例子
    • 负载均衡有接触过哪些开源框架,优劣势是什么?
    • 数据库分库分表需要怎样来实现?
      • 1.分库分表带来的问题
        • 1.事务一致性问题
        • 2. 跨节点关联查询 join 问题
        • 3.跨节点分页、排序、函数问题
        • 4. 全局主键避重问题
    • 数据库端的常用优化策略?
    • 如果让你来设计秒杀系统,你的设计思路是什么,为什么要这样设计?

一面

ArrayList和linkedlist区别。ArrayList是否会越界。

ArrayList是实现了基于动态数组的数据结构,如果达到一定的峰值,会对数组进行一个扩容(前数组的1.5倍)LinkedList是基于链表结构。

数据库引擎Innodb和myisam区别

参考:数据库引擎Innodb和myisam区别

什么是多态

Java多态实现原理
方法表是实现动态调用的核心
Java面试差缺补漏(网上资料整理)_第1张图片

redis:list的底层实现–压缩列表

redis:list的底层实现–压缩列表

redis有序集合zset的底层实现——跳跃表skiplist

redis有序集合zset的底层实现——跳跃表skiplist

海量数据过滤,黑名单过滤一个url

常见面试题之布隆过滤器的使用案例(海量数据)

数据库的悲观锁和乐观锁应用场景。

二面

list set map 底层使用什么实现的有哪些典型实现

hashmap扩容是怎么扩容的,为什么是2的幂

答案: 我们正常的思维是进行一个%运算,但是%运算效率太过低下,所以采用2进制运算,同时为了保证2进制的情况下进行一个均匀分布,所以把容量设置成2的幂
参考:面试必考:HashMap容量为2次幂的原因

concurrenthashmap为什么线程安全,采用了什么措施应对高并发

线程池的参数有什么意义

参考:创建线程池每个参数有什么作用

Springmvc请求流程

Java面试差缺补漏(网上资料整理)_第2张图片
参考:springMVC请求流程详解

Spring IOC,autowired如何实现

三面

CDN加速过程

Java面试差缺补漏(网上资料整理)_第3张图片

分布式架构设计哪方面比较熟悉

讲讲你对CDN的了解,与分布式缓存和本地缓存的区别

多线程和高并发有什么区别

高并发下有哪些常用的技术解决方案,举三个高并发场景设计例子

负载均衡有接触过哪些开源框架,优劣势是什么?

LVS、NGINX
参考:很全!浅谈几种常用负载均衡架构
参考:Nginx面试中最常见的18道题 抱佛脚必备

数据库分库分表需要怎样来实现?

参考:数据库分库分表思路

1.分库分表带来的问题

1.事务一致性问题

分布式事务、最终一致性

2. 跨节点关联查询 join 问题

全局表
全局表,也可看做是"数据字典表",就是系统中所有模块都可能依赖的一些表,为了避免跨库join查询,可以将这类表在每个数据库中都保存一份。这些数据通常很少会进行修改,所以也不担心一致性的问题。

字段冗余
一种典型的反范式设计,利用空间换时间,为了性能而避免join查询。例如:订单表保存userId时候,也将userName冗余保存一份,这样查询订单详情时就不需要再去查询"买家user表"了。

数据组装
在系统层面,分两次查询,第一次查询的结果集中找出关联数据id,然后根据id发起第二次请求得到关联数据。最后将获得到的数据进行字段拼装。

ER分片
关系型数据库中,如果可以先确定表之间的关联关系,并将那些存在关联关系的表记录存放在同一个分片上,那么就能较好的避免跨分片join问题。在1:1或1:n的情况下,通常按照主表的ID主键切分。

3.跨节点分页、排序、函数问题

在使用Max、Min、Sum、Count之类的函数进行计算的时候,也需要先在每个分片上执行相应的函数,然后将各个分片的结果集进行汇总和再次计算,最终将结果返回。

4. 全局主键避重问题

UUID
Snowflake分布式自增ID算法:Twitter的分布式自增ID算法snowflake (Java版)
结合数据库维护主键ID表

数据库端的常用优化策略?

参考:常见的数据库优化策略(经典)

如果让你来设计秒杀系统,你的设计思路是什么,为什么要这样设计?

高性能:
动态分离:静态数据进行缓存(比如CDN、本地缓存)
热点操作:通过限制行为控制热点操作频繁发生
热点数据:单独隔离,通过独立的设备存取
一致性
防止卖不出去和超卖问题
选择高可用的数据库,通过数据库的悲观锁进行锁定(因为是频繁的写操作)
高可用
防作弊:通过答题或者密码验证等方式
流量削峰:通过Mq的方式
其他
减少框架依赖
减少无关数据输出,比如日志等
监控,预防,恢复。

你可能感兴趣的:(面试)