1.自我介绍
2.项目经验介绍
3.zk*机制,可以聊聊Hadoop HA 高可用的原理
4.zk通知机制
5.mr shuffle机制
6.hive数据倾斜
7.一个字段分区一个字段排序 用啥
8.问了一些kafka的问题,但是kafka回答不好,记不清了
Spring
1、介绍一下 Spring MVC 常用的一些注解
在实际项目中,我们最常用的几个注解,包括 @Controller、@RestController、 @RequestMapping、@PathVariable、@RequestParam 以及 @RequestBody,此次主要介绍下这几个注解常用的使用方式和特点
_
@Controller 作用在类上。在SpringMVC中,controller主要负责处理前端控制器(DispatcherServlet )发过来的请求,经过业务逻辑层处理之后封装层一个model,并将其返回给view进行展示。@controller注解通常用于类上,如果结合Thymeleaf模板使用的话,会返回一个页面。如果是前后端分离的项目,则使用@RestController,表明返回的是json格式数据。
@RestController注解里面包含了@Controller注解和@ResponseBody注解,@ResponseBody 注解是将返回的数据结构转换为 JSON 格式,所以说可以这么理解:@RestController = @Controller + @ResponseBody ,省了很多事,我们使用 @RestController 之后就不需要再使用 @Controller 了。
@RequestMapping 是一个用来处理请求地址映射的注解,它可以用于类上,也可以用于方法上。用于类上的注解会将一个特定请求或者请求模式映射到一个控制器之上,表示类中的所有响应请求的方法都是以该地址作为父路径;
value 属性:指定请求的实际地址,value 可以省略不写;
method 属性:指定请求的类型,主要有 GET、PUT、POST、DELETE,默认为 GET。
produces 属性:指定返回内容类型,如 produces = “application/json; charset=UTF-8”。
2、Spring 事务
事务是逻辑上的一组操作,要么都执行,要么都不执行.
原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性: 执行事务前后,数据保持一致;
隔离性: 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;
持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
Spring并不直接管理事务,而是提供了多种事务管理器
**
- PlatformTransactionManager: (平台)事务管理器
- TransactionDefinition: 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)
- TransactionStatus: 事务运行状态
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致一下的问题。
脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。
例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
https://blog.csdn.net/u013490280/article/details/82598097 Spring事务面试题
3、Spring拦截器
https://blog.csdn.net/baichoufei90/article/details/82938530
JAVA
https://blog.csdn.net/sufu1065/article/details/88051083
1、JAVA基本数据类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte:
- byte 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是 -128(-2^7);
- 最大值是 127(2^7-1);
- 默认值是 0;
- byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
- 例子:byte a = 100,byte b = -50。
short:
- short 数据类型是 16 位、有符号的以二进制补码表示的整数
- 最小值是 -32768(-2^15);
- 最大值是 32767(2^15 - 1);
- Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是 0;
- 例子:short s = 1000,short r = -20000。
int:
- int 数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是 -2,147,483,648(-2^31);
- 最大值是 2,147,483,647(2^31 - 1);
- 一般地整型变量默认为 int 类型;
- 默认值是 0 ;
- 例子:int a = 100000, int b = -200000。
long:
- long 数据类型是 64 位、有符号的以二进制补码表示的整数;
- 最小值是 -9,223,372,036,854,775,808(-2^63);
- 最大值是 9,223,372,036,854,775,807(2^63 -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是 0L;
- 例子: long a = 100000L,Long b = -200000L。
“L”理论上不分大小写,但是若写成”l”容易与数字”1”混淆,不容易分辩。所以最好大写。
float:
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
double:
- double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数;
- 浮点数的默认类型为double类型;
- double类型同样不能表示精确的值,如货币;
- 默认值是 0.0d;
- 例子:double d1 = 123.4。
boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是 false;
- 例子:boolean one = true。
char:
- char类型是一个单一的 16 位 Unicode 字符;
- 最小值是 \u0000(即为0);
- 最大值是 \uffff(即为65,535);
- char 数据类型可以储存任何字符;
- 例子:char letter = ‘A’;。
2.GC
https://blog.csdn.net/csdn_aiyang/article/details/72876272
GC的两个职能:1.检测垃圾、2.回收垃圾**。
MySQL
一、为什么用自增列作为主键
1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。
如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。
如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。
2、数据记录本身被存于主索引(一颗B+Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放
因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)
3、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
4、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置
此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销
同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。
二、为什么使用数据索引能提高效率
**
- 数据索引的存储是有序的
- 在有序的情况下,通过索引查询一个数据是无需遍历索引记录的
- 极端情况下,数据索引的查询效率为二分法查询效率,趋近于 log2(N)
基础问题
- concurrenthashmap源码(分段锁和CAS)
- hashmap与concurrenthashmap的区别
- 死锁
- tcp/ip体系结构
- tcp三次握手,二次会发生什么
- HTTP/1.0与HTTP/1.1的区别
- 长连接和短连接
- 判断链表有环
- hashset源码
- 设计一种hashmap缓存
- 设计模式
-
腾讯
项目相关
- 内部类
- static
- 类加载
- 内存泄漏
- GC
-
京东
项目相关
- HashMap是线程安全吗?
- hashmap源码
- Concurrenthashmap为什么线程安全?
- java如何实现线程安全
- 单例模式
-
数太奇
项目相关
- SpringMVC过程
- 冒泡排序
- 快速排序
-
方正国际
SpringBoot是什么
- redis里存放的是什么
- mysql和redis一致
- 注册和登录怎么实现的
- 密码加密怎么实现的
- nginx的Session共享
- 异步怎么实现的
- redis持久化
-
东方畅享
项目相关
- dao层怎么实现
- spring中都用了哪些库
-
佳龙集团
常见的数据结构介绍一下
- hashmap介绍一下
- 快排
- 冒泡
- 斐波那契数列
- 判断回文数
- 约瑟环
- springmvc生命周期
- restful了解吗
-
长城软件
登陆模块怎么做的
- 项目部署在tomcat步骤
- tomcat启动流程
- 介绍下redis
-
星宇联合
==和equals的区别
- arrarylist和linkedlist区别
- synchronized
- 单例模式
-
用友
spring ioc用到的注解
- 未登陆用户拦截
- sql左连接和右连接
- 消息队列怎么实现的
-
每日优鲜
快排
- sql左连接和右连接
- mysql的索引
- b+树介绍一下
- redis的list是什么数据结构
- linux的常用操作
- mybatis的注解
- 多线程的实现
- 线程池的配置
-
小米
赞踩功能是怎么实现的
- 为什么赞踩要用消息队列
- 消息队列怎么实现的
- synchronized和volatile
- synchronized实现原理
- volatile可见性
- 线程池有哪几种
- 具体怎么用
- 说下常用设计模式
- 单例模式在项目中有用到吗
- 观察者模式说一下
- get和post区别
- tcp三次握手
- rcp了解吗
- 为什么不是两次和四次握手
- jvm内存模型
- jvm垃圾收集器
- gc算法
- linux查找一个文件中的某个字
- linux的ping命令是什么
- linux常用的命令
- maven常用命令
- git常用命令
- mysql的引擎
- 各个引擎的区别
- innodb实现原理
- 异常的分类
- http了解多少
- https
- ca证书里有什么
- 滑动窗口和拥塞控制
- 长连接和短连接
- cookie和session区别
- cookie欺诈
-
沪江
hashmap
- linkedlist
- 单例模式
- 快排
- json格式
- 多线程实现
- 线程池
- string可变吗?
- final
- 登陆怎么实现的
- 如何判断用户已经登陆
-
借贷宝
登陆模块怎么实现的
- mybatis映射
- springmvc用到的注解
- restful
- c中的指针是什么
- java中为什么没有
- ajax
- 什么是异步
- mysql数据库引擎
-
芯智引擎
说下你知道的数据结构
- 红黑树能写出来吗?
- 红黑树的特点
- b树
- 图在代码中怎么表示
- 怎么求图中两节点最短距离
- 说下基于比较的排序有哪些
- 各个排序的时间复杂度
- 线程池
- 线程同步
- synchronized实现原理
- monitor实现原理
- osi七层模型
- 各层模型的协议
- java中集合类
- 集合类运用场景
- 操作系统,知道啥
- 页面置换算法
- 进程线程
- 死锁