1、你先做个简单的自我介绍吧
我叫张三,2015年在重庆邮电大学毕业。我读的专业是电子信息。工作已经快5年了。
我上家公司的主营业务是在柬埔寨做移动支付钱包。
最近做的一个项目是聚合支付的项目,主要的功能是为了让柬埔寨当地的华人能使用微信、支付宝钱包做支付,就做了一个聚合码这样的功能。负责的主要的模块是一个渠道的模块(对接外部渠道),比如支付宝、微信。然后,就提供一个统一的接口给支付交易那边使用。这个项目上线后我也对它做了一些优化。
再往前的一个项目是一个出入金的项目,这个项目主要的功能是提供一些充值、提现的服务,给当地的人可以去我们公司开设的一个现金网点,用现金做充值提现,先充进钱包里面,做线上的消费,我负责的模块就是一个充值服务,主要是对整个充值流程的控制,和账户,还有订单那边做交互。
2、简单介绍下Spring Bean的注入过程
3、简单介绍下Java8有哪些新特性?
1)语法上面主要就是lambda表达式,它可以用那个函数式进行函数式编程,函数式接口的意思就是它这个接口只有一个方法
2)还有一些流的操作,像Stream API,它可以使编程语义更清晰。比如:有一个filter功能就可以把不符合要求的数据过滤掉
3)它对一些数据结构进行了优化,像ConcurrentHashMap,它底层实现改成了红黑树
分析:
面试官问的是有哪些新特性,回答的是一些优化。
4、刚刚有提到过流式处理,你有了解过它的性能么?比如:Stream流的操作,对比像foreach或者基本的for循环,有没有在效率上进行优化?
5、你能跟我讲一下synchronized和lock锁它底层实现的原理吗?
synchronized是一个语义级的支持,在一个对象头里面,它有一个Mark Word的这么一个标记去记录他的锁。lock显示锁,它底层是一个AQS,它是一个双向链表的先进先出的队列,它当前持有锁的线程就是一个对头,然后它释放出来职还,就会利用一个自旋的操作,就让下一个线程作为对头。
6、synchronized和lock分别是什么层面的呢?是jdk层面还是jvm层面?
sychronized是jvm层面的,lock是jdk层面的
7、刚刚提到synchronized,你有去了解过它锁方法,锁对象头,锁代码块分别是怎么实现的吗?
8、你了解synchronized锁升级过程吗?
9、刚刚提到lock,CAS你能给我简单的介绍一下吗?
CAS,它的意思就是比较并交换
10、你有在开发过程中有实际的一些应用吗?有没有用到乐观锁?
我在更新数据库的时候,如果数据库用的是一个乐观锁的话,我也用一个自旋的操作,就把它更新到成功为止
11、自旋的话,会不会效率很低?比如说,一直取不到这个锁的话,那可能会造成一些线程阻塞。或者说,在高并发的场景下,会影响到效率?
并发高的话,不适合用自旋,这个时候更适合用悲观锁
12、关于线程池,把你知道的知识点跟我说一下
工作流程:
1)先提交进来
2)进入核心池里面
3)如果线程数大于coreSize,就会进入一个阻塞队列
4)阻塞队列满了之后,就会新建一个线程,进入最大的池里面
5)当线程数超出maxSize的时候,就会执行一个拒绝策略。jdk自带的拒绝策略有4种,一种是直接丢弃,一种是抛异常,一种是有调用者在调用者的线程执行,一种就是丢弃阻塞队列里面等待时间最长的一个线程
13、你了解JVM调优的基本步骤吗?
如果生产环境上面发生oom异常,首先要判断它是在堆里面发生的,还是在元空间里面。还有一种可能就是gc效率过低,就是用了80%的时间,但是清除的垃圾都达不到2%,效率过低,主要是针对这种情况(进行调优)。如果是堆空间不够,就要考虑是不是有内存溢出的现象,可以通过拿到当时的内存快照,用工具(jmap),然后就用MAT工具来分析,是不是内存泄漏,有一些对象,它们本来是没有,应该被gc掉,但是它们还保留着,如果是内存泄漏的情况就改代码,如果不是的话,就考虑增大一下堆内存。
14、现在遇上一个线上cpu占用率100%的问题,你怎么排查这个问题?
1)先用top查出是哪些进程占用的cpu最高
2)找到占用cpu最高的进程后,用命令找到里面占用率最高的线程,然后,转换为16进制的,然后再用jstack,打出它具体的堆栈,定位到具体的哪一行代码。
15、在linux上面查看进程的命令?
16、一般怎么去优化mysql的查询?
一般就用expain执行计划,看看执行的各方面的数据。如果是索引没用的的话,就建索引。
17、mysql里面,索引有几种类型?
一般有两种,hash和B+树
18、我们为什么用B+树,不用其他的呢?比如平衡二叉树,红黑树这些。
不用平衡二叉树,是因为平衡二叉树的树高太高了。如果数据是放在内存的话,其实用
AVL也没问题,但是如果树高很高的话它就频繁访问硬盘,IO次数会多一点。
19、树高低也有B树,为什么用B+?
20、能跟我说一下MyISAM和InnoDB的区别吗?
1)MyISAM用的是非聚集索引,它的索引直接指向的是数据项
2)InnoDB用的是追溯索引,它的索引直接指向主键索引,主键索引查取数据项
3)InnoDB支持redo log日志
4)InnoDB支持事务
5)InnoDB支持行锁,MyISAM只支持表锁
21、开发过程种技术选型的时候,这么多缓存中间件(Memcache, MongoDB),为什么选择Redis?
22、Redis为什么这么快?
1)因为数据是在内存中的嘛,所以读写(IO)比较快
2)另外,Redis使用的IO模型是异步非阻塞
23、如果断电了,Redis的数据会不会丢失?
Redis支持持久化,就是把数据持久化到硬盘里面。持久化有两种方式,一种是RDB,每隔一段时间会把内存快照存到硬盘里面,还有一种是AOF,就是用命令将内容序列化到文件里面去,如果断电的话,可以根据AOF写的文件来恢复数据。一般生产上就是RDB和AOF同时开启的,两者有优点缺点,AOF备份的数据会比较全一点,但是恢复起来比较慢,RDB虽然说数据少一点,但是恢复挺快的,拿上去就直接能用了,所以说一般在应急情况下都是会先用RDB的,然后再用AOF去追加那些不全的数据
24、你了解过Redis的集群么?
25、你是怎么理解缓存击穿和缓存穿透的?
26、Spring的优点有哪些?
1)没有侵入性(AOP)
2)把对象的依赖管理起来(IOC)
27、跟我讲下dubbo的调用链路(从生产者到消费者的整个链路)
分析:
1)服务暴露的过程
2)然后调用过程中其实还有1个Monitor监视器什么的
3)在启动的时候,还有一个Containner容器,跟Spring Bean怎么融合的
28、除了单例和工厂,你了解哪些设计模式?
项目中比较常用的:
1)策略模式,它的类结构是有一个Context,它是聚合的一个抽象的策略接口,然后,还有很多个具体的策略实现类来实现它。我主要是把它用在渠道这方面,比如,渠道下单,有多个渠道,要写的报文格式,还有,数据结构都是不一样的,然后就可以用不同的策略
2)还有一个是状态模式,主要是用来进行状态流转的控制,它的类结构和策略模式也有点像,很相似,也是一个Context(它持有的),它聚合的是一个抽象的状态接口,然后,下面也有很多状态的实现类,具体实现类。
比较:
这两个模式关注点不太一样,策略模式主要关注的是对一个功能的不同实现算法(方法),并且可以动态的去切换。状态模式,它主要是关注的一个状态的流转,会从A状态B状态他们之间的是什么流程
29、金融支付的场景,怎么保证幂等?
1)数据库层面要做一个唯一索引
2)在访问量稍微大的情况下,可以考虑把一些需要做幂等的数据先存到缓存里面
30、存到缓存里面怎么去做的?
比如:订单过来的时候,可以把那个订单号放到redis里面,下一笔订单来之后先去Redis里面检查是否存在此订单,然后就过站
31、按道理来说会出现各种场景,就是像退款、下单、支付、发货等都是一个订单号操作的,你怎么能保证是一个场景还是多个场景在这里进行操作的?因为它完全可能是支付成功后,商家马上就来接收到这笔订单之后马上发货什么的。
答:刚刚主要是针对新建订单的场景
32、怎么避免重复消费(重复支付)?
免重复支付,目前的做法就是从数据库里面查一下订单的状态,然后用状态机的状态(刚刚说的状态模式),如果是已经完成了,它已经到了一个状态了,就不会对这边订单做修改了。如果是它还是处理中的话,那就证明它还可以流向失败还有成功的状态。
33、像这样一个场景,就是刚刚你说去查一下嘛,如果我去数据库查到了,然后返回过来的途中,其实它的状态应该还是未支付的,但其实有一笔支付的已经过来了,然后这个时候同时过来两笔,按道理来说这两笔可能都会加上去,对不对?
答:如果是这种情况的话,可以加一个分布式锁
34、说一下分布式锁你是怎么实现的?
分布式锁主要是控制我们平时所谓的线程的共享资源的修改,分布式锁就是控制一个进程,平时的话我们就用Redis的setnx(原子性操作)
35、有试过用ZK(zookeeper)吗?
参考资料
[01] 利用jmap和MAT等工具查看JVM运行时堆内存
[02] HashTable和HashMap的区别详解
[03] Redis乐观锁解决高并发抢红包的问题
[04] 使用Redis和Lua的原子性实现抢红包功能
[05] 一次生产 CPU 100% 排查优化实践
[06] 一份十分完整的CPU 100%排查优化指南
小结
java程序员面试,最常见的套路永远是问:你用过多少中间件和库?
然后又问:这些中间件和库的特性了解多少?
再高级一点的就会问:这些中间件和库特性原理是什么?
作为真正有能力解决问题的开发人员,考虑问题的方向不是这么样的。
1,业务上需要什么功能,某个库或中间件能提供,那么只要冲自已想要的去了解好就行,毕竟软件功能要的永远是够用就行,要考虑以后扩展就不要盲目用第三方提供的东西了,业务周期也没这么充裕的时间让你慢慢搞,堆起来功能能用时业务考虑的第一要素。所以问此中间件和库深层了解是多余的,人人都是冲它有自已想要的功能去用而已,没必要用一样就得了解得透彻。
2,既然是java开发,那么要看看想找的是什么人,搬砖工问的是使用过什么框架,什么库就行了,架构师级别问的,应该是spring,springboot,springcloud都有什么不同,有什么优点,有什么缺点,缺点怎么克服,给出方案和案例才是重点。举个简单例子,很多都知道swagger能生成文档,但对复杂数据不支持,该怎么救活呢?很多人会答不上,但架构师级别有做过的肯定知道,这些是开发前必须解决的事。只要工作场景用不着,很多人对java都是不认识的,nio和netty有什么用都可能不清楚,因为工作场景用不上,用得上的多数是架构级别。如果非架构级别还经常用上,只能说现在用于开发的框架设计太烂了。
3,既然是用java,多线程相关的就别问些什么了,知道hashtable和hashmap的区别就好了,知道线程并行访问资源的时序分析和注意事项就可以了,加个concurrent包装的,就别用来做什么多线程,高效率之类的东西了,用原子锁级别的能有多快呢?并行读互斥写的锁,在绝对读写高并发时同样死。用java老老实实用无状态线程池,共享对象什么的用个redis或memc来放就好了。java不可能像c\c++那样能用cas解决任何高效并发的问题。安全生产最重要,效率稍低机器来补。java的各种多线程对象,sync关键字,都是让多线程变得比单线程流水线还慢的东西。
作为面试官,就要清楚要招的是什么人,要用什么人,别老把乱七八糟的东西扯一大堆不等用的,问倒对方还觉得高兴一样,这样对你对公司形象对面试者都没有好处。
面试重点是这人现有技能是否满足岗位要求,人是否能好好合作,最后才是这人是否学习快,灵活变通,能产生更多价值。
面试职位:Java开发(机器人后台管理系统)
面试公司:维xxx科技有限公司
面试时间:2019-09-20
面试流程:
1)填表
2)笔试(填空,选择,编程,简答)
3)技术面试(自我介绍,项目介绍,提问)
Java笔试题不难,如果好好准备的话,笔试肯定可以过的。
跟Java面试有关的学习资料如下:
[01] Java面试题全集(上)
[02] Java面试题全集(中)
[03] Java面试题全集(下)
印象比较深的题目如下:
笔试题目:依赖注入的3种方式
参考答案:
① setter方法注入 ②构造器注入 ③@Autowired注入
笔试题目:Spring框架中Bean的作用域
参考答案:
① singleton ② prototype ③ request ④ session ⑤ global-session
笔试题目:Spring MVC的原理
笔试题目:实现三角形的角度
分析:
这家公司主要是做三维实景的,开发人员需要懂几何知识的
package examples;
public class MathTest2 {
public static void main(String[] args) {
Point p1 = new Point(1,2);
Point p2 = new Point(3,1);
Point p3 = new Point(2,3);
double a = p2.getLength(p3);
double b = p3.getLength(p1);
double c = p1.getLength(p2);
// 计算弧度
double rad = Math.acos((b*b + c*c - a*a)/(2.0*b*c));
// 将弧度转成角度
double angle = Math.toDegrees(rad);
System.out.println(angle);
}
}
class Point{
private double x;
private double y;
/**
* 计算出两个坐标点之间的距离
* @param other
* @return
*/
public double getLength(Point other) {
double width = this.x-other.x;
double height = this.y-other.y;
return Math.sqrt(width*width+height*height);
}
public Point() {
super();
// TODO Auto-generated constructor stub
}
public Point(double x, double y) {
super();
this.x = x;
this.y = y;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
}
笔试题目:栈的实现原理
笔试题目:html5框架的Canvas有什么作用
参考答案:HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像
面试题目:你知道哪些协议?
我回答的是http协议和https协议
面试题目:有没有用过socket?
他们的机器人项目主要是使用socket进行通信的
面试题目:阻塞,同步与异步
参考:
https://www.jianshu.com/p/5bb812ca5f8e
面试题目:客户端跟后台是怎么交互的?
分析:
1)自定义响应结构(POJO类)
2)浏览器通过ajax发送请求
3)控制器根据请求的路径分配对应handler进行处理
4)handler接收请求参数,并返回自定义的响应结构数据
5)通过视图组件将响应数据转成json格式的文本,发送给浏览器
维xxx科技有限公司面试小结
1)问的问题基本上都是很基础的
2)准备不够充分
参考资料:
[01] Spring注解依赖注入的三种方式的优缺点以及优先选择
[02] 理解Spring框架中Bean的作用域
[03] Java中计算三角形的角度
[04] socket阻塞与非阻塞,同步与异步
[05] ajax的同步和异步有怎样的区别?
面试职位:软件测试
面试公司:上海好xx信息技术有限公司
面试时间:2019-09-24
面试流程:
1)填表
1)技术面试(自我介绍,项目介绍,提问)
印象比较深的题目如下:
面试题目:Email系统怎么测试?比如:QQ邮箱
分析:
这个问题比较开放,现场没发挥好。
1)功能角度(功能运行成功和运行失败的各种情况)
测试发送邮件:邮件主题为空的情况;收件人为空的情况;收件人邮件地址不正确的情况;收件人过多的情况;邮件正文为空的情况;邮件主题过长的情况;邮件正文内容过长的情况;邮件正文包含图片的情况;输入正确的情况;邮件正文设置样式的情况;附件个数过多的情况;附件大小超出限制的情况;服务器磁盘空间不够的情况;收件人邮箱空间不够的情况;邮件主题包含特殊字符(换行、空格、引号等)的情况;数据一致性检查(对方收到的内容是否与发送的内容一致,不会出现中文乱码)
2)安全性角度
登录请求里面的密码是否做了加密处理;邮件内容是否做了加密处理;邮件正文内容包含js代码的情况;邮件正文内容包含木马链接的情况;非登录状态能否发送邮件;附件是病毒或木马文件的情况;
3)性能角度
email系统的响应速度如何;模拟大量并发的情况;
4)兼容性角度
使用不同的浏览器进行测试
5)界面角度(样式检查)
根据原型效果图进行比对(比如:邮件发送成功的界面,发送失败的界面等等)
面试官补充了两点:
1)系统的关联性(QQ聊天系统和QQ邮件系统)
2)垃圾邮件处理机制
面试题目:你知道RPC么?讲一下RPC的原理
RPC的实现原理主要包括8个步骤,请参考[06]
参考资料:
[06] RPC的实现原理
[07] 什么是RPC
面试职位:Java开发
面试公司:上海xx金融信息服务有限公司
面试时间:2019-09-25
面试流程:
1)填表
2)笔试(逻辑题,选择题,简答题)
3)1面:技术经理面试(自我介绍,项目介绍,提问)
4)2面:公司高管面试(自我介绍,提问)
5)3面:HR面试(沟通薪资待遇)
印象比较深的题目如下:
笔试题目(逻辑):
在一张长方形的桌面上放了n个一样大小的圆形硬币。这些硬币中可能有一些不完全在桌面内,也可能有一些彼此重叠;当再多放一个硬币而它的圆心在桌面内时,新放的硬币便必定与原先某些硬币重叠。请证明整个桌面可以用4n个硬币完全覆盖。
笔试题目(逻辑):
假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。
我写上去的答案:
1)用容积为6升的水壶装满水
2)往容积为5升的水壶倒水,直至倒满(6升的水壶里面还剩1升水)
3)把容积为5升的水壶里面的水全部倒掉
4)把容积为6升的水壶里面剩余的1升水倒入容积为5升的水壶
5)用容积为6升的水壶装满水
6)往容积为5升的水壶倒水,直至倒满(6升的水壶里面还剩2升水)
7)把容积为5升的水壶里面的水全部倒掉
8)把容积为6升的水壶里面剩余的2升水倒入容积为5升的水壶
9)用容积为6升的水壶装满水
10)往容积为5升的水壶倒水,直至倒满(6升的水壶里面还剩3升水)
笔试题目(逻辑):
现在共有100匹马跟100块石头,马分3种,大型马;中型马跟小型马。其中一匹大马一次可以驮3块石头,中型马可以驮2块,而小型马2头可以驮一块石头。问需要多少匹大马,中型马跟小型马?
参考资料:
[08] 50道逻辑思维题目
笔试题目(Java)
String s1 = "Student";
String s2 = "Stu" + "dent";
String s3 = new String("Student");
System.out.println(s1==s2);//结果是多少?true
System.out.println(s1==s3);//结果是多少?false
笔试题目(Java):volatile关键字的作用
参考资料:
[09] volatile关键字的作用
笔试题目(Java):CMS收集器
参考资料:
[10] 并发收集器 CMS
笔试题目(Java):为什么要使用MQ消息中间件
参考资料:
[11] 为什么要使用MQ消息中间件?它解决了什么问题?
[12] 为什么要使用MQ和到底什么时候要使用MQ
笔试题目(算法)
二分搜索算法是利用( )实现的算法
A.分治策略 B.动态规划法 C.贪心法 D.回溯法
参考资料:
[13] 二分查找算法实现(图解)与实例
笔试题目(算法):插入排序算法的时间复杂度
参考资料:
[14] 插入排序算法、时间复杂度和稳定性
笔试题目(c语言):volatile关键字的作用?一个指针可以是volatile吗?
参考资料:
[15] 解读关键字volatile
笔试题目(c语言)
下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗?
#include
int main(int argc, char *argv[])
{
int flag = 0;
char passwd[10];
memset(passwd,0,sizeof(passwd));
strcpy(passwd, argv[1]);
if(0 == strcmp("LinuxGeek", passwd))
{
flag = 1;
}
if(flag)
{
printf("\n Password cracked \n");
}
else
{
printf("\n Incorrect passwd \n");
}
return 0;
}
我写上去的答案是:① 使用穷举法破解 ②利用缓存溢出漏洞
参考资料:
[16] 栈中变量的存放-strcpy
[17] 12个有趣的C语言面试题
笔试题目(c语言):static关键字的作用?const关键字的作用?
我写上去的答案是:static表示变量的空间只有1份;const关键字可以用来定义常量;
笔试题目(操作系统):进程之间的通信方式
参考资料:
[18] 进程间的几种通信方式
笔试题目(计算机网络):TCP和UDP的比较
笔试题目(项目)
天猫双十一有个积分换魔盒的活动,总共有50万台天猫魔盒(box),每个用户(user)可以用99个天猫积分(point)兑换一台魔盒,且每人限换一台。 请设计一套java接口并实现下单(order)逻辑。 参考(但不局限于)下面的下单逻辑:
1、创建订单
2、扣减用户积分
3、扣减魔盒库存
4、下单成功
同时请回答:
1、数据库表结构如何设计,有哪些表,分别有什么作用?
2、下单过程中哪些地方可能成为瓶颈?如何解决或改善?
3、是否会用到数据库事务,哪些地方会用到?如果不用数据库事务,如何保证数据的一致性?
用户表:t_user
字段名 | 数据类型 | 约束 | 描述 |
---|---|---|---|
id | int | 主键 | 用户编号 |
username | varchar(50) | 非空 | 用户名 |
password | varchar(50) | 非空 | 登录密码 |
credit | int | 默认值为0 | 积分 |
mobile | varchar(50) | 手机号码 | |
address | varchar(200) | 收货地址 |
字段名 | 数据类型 | 约束 | 描述 |
---|---|---|---|
id | int | 主键 | 商品编号 |
name | varchar(50) | 非空 | 商品名称 |
brand | varchar(50) | 品牌 | |
price | float(10,2) | 非空 | 单价 |
exchange_credit | int | 兑换所需积分 | |
exchange_count_limit | int | 兑换数量限制 | |
stock | int | 库存数量 | |
credit | int | 默认值为0 | 积分 |
exchange_flag | boolean | 默认值false | 能否使用积分兑换 |
img_url | varchar(100) | 图片路径 | |
description | text | 商品描述 |
订单表:t_order
字段名 | 数据类型 | 约束 | 描述 |
---|---|---|---|
id | varchar(50) | 主键 | 订单编号 |
user_id | int | 外键 | 用户编号 |
total_amount | float(10,2) | 订单总金额 | |
actual_total_amount | float(10,2) | 实际订单总金额 | |
discount_by_credit | float(10,2) | 积分抵扣掉的金额 | |
payment_gateway | int | 支付方式 | |
payment_status | int | 订单支付状态 | |
order_status | int | 订单状态 | |
use_credit | boolean | 是否使用积分 | |
create_time | datetime | 下单时间 |
订单明细表:t_item
字段名 | 数据类型 | 约束 | 描述 |
---|---|---|---|
id | int | 主键 | 项目编号 |
order_id | varchar(50) | 外键 | 订单编号 |
product_id | int | 外键 | 商品编号 |
quality | int | 购买数量 |
兑换记录表:t_exchange_records
字段名 | 数据类型 | 约束 | 描述 |
---|---|---|---|
id | int | 主键 | 记录编号 |
user_id | int | 外键 | 用户编号 |
product_id | int | 外键 | 商品编号 |
order_id | varchar(50) | 外键 | 订单编号 |
exchange_quantity | int | 兑换数量 | |
exchange_date | date | 兑换日期 |
参考资料:
[19] 天猫积分换魔盒
[20] 面试题:阿里 天猫积分换魔盒
面试职位:Java开发
面试公司:上海易*软件有限公司
面试时间:2019-11-13
面试流程:
1)填表
2)笔试(简答题)
3)1面:技术经理面试(自我介绍,项目介绍,提问)
印象比较深的题目如下:
笔试题目(Java):
System.out.println(Math.round(10.5));//11
System.out.println(Math.round(-10.5));//-10
笔试题目(Java):
public class A {
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
public class B extends A {
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
/**
* @Author: yangzc
* @Description: 控制台输出多少?1a2b2b
* @Date: Created on 20:34 2019/11/13
* @Modified By:
*/
public class ABTest {
public static void main(String[] args) {
A ab = new B();
ab = new B();
}
}
参考资料:
[21] Java中父类与子类的加载顺序详解
笔试题目
登录(认证授权)涉及的4种技术方案:
1)用户名和密码
2)OAuth2
3)SSO
4)JWT
选择其中的1个或多个,画出登录的流程图或时序图
参考资料:
[22] 登录页面授权认证时序图
[23] OAuth2和JWT - 如何设计安全的API
[24] OAuth2实现单点登录SSO
[25] 基于JWT和Oauth2 实现 SSO(单点登录)
[26] JWT、OAUTH2与SSO资料补充
面试职位:Java开发
面试公司:上海*羽网络有限公司
面试时间:2019-11-14
面试流程:
1)填表
2)笔试(简答题)
3)1面:技术经理面试(自我介绍,项目介绍,提问)
印象比较深的题目如下:
笔试题目:Java类初始化顺序
参考资料:
[27] Java类初始化顺序说明
笔试题目:ReadWriteLock是否读写互斥
参考资料:
[28] ReadWriteLock读写之间互斥吗
笔试题目:
/**
* @Author: yangzc
* @Description: x和y是否相等?为什么?
* @Date: Created on 21:22 2019/11/14
* @Modified By:
*/
public class StringTest {
public static void main(String[] args) {
String x = "ab";
String y = "a" + "b";
System.out.println(x == y);//true
}
}
笔试题目:写一个死锁
笔试题目:设计一个单例模式
参考资料:
[29] 单例模式——懒汉模式
笔试题目:Spring怎么解决循环依赖
参考资料:
[30] Spring 如何解决循环依赖的问题
笔试题目:int a = 1是原子操作么?
笔试题目:MySQL数据库,离散度低的字段建立索引会有什么影响?
推荐阅读:
[31] 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备
[32] 2年Java开发工作经验面试总结
微信扫一扫关注公众号
点击链接加入群聊
https://jq.qq.com/?_wv=1027&k=5eVEhfN
软件测试学习交流QQ群号:511619105