阿里巴巴一面问题搜集

没有时间整理和排版了。

原文:https://blog.csdn.net/no_endless/article/details/60880436 

时间:2017-3-8 14:34
长:32分35时秒
类型:内推电话面试一面
常规
1. 自我介绍,说了自己的信息和三个项目,面试官没有打断我。
JAVA
2. 对于Spring,你除了IOC的Bean机制还用到了什么?
3. 说一说对于JVM的结构你的理解。
4. JVM内存结构衍生到了一个题:
5. JVM的垃圾回收了解多少?
String a = "abc";
String b = new String(a);
对于这两个表达式,a存储在哪里,b存储在哪里?a==b的返回。
1
2
3
6. JVM优化 (没听清,好像是问perm),你知道什么参数指令?
7. Maven你了解多少?用过什么?
8. 在部署项目时你是如何打包的?
数据库
8. 数据库你用过哪些?学校有课程吗?
9. 你了解Mysql底层多少?了解存储引擎?
10. InnoDB存储引擎了解多少?
11. Spring中的事务你有用过吗?
12. Mysql事务的四个特性?阐述一下
13. Mysql底层你知道多少?对于索引的了解:又出了一个题:
在DB中有一个加了索引的字段account_id int,对于值account_id为123的元组执行下面语句后,是否通过?是否使用了索引?
select sth from table where id = '123';
select sth from table where id+1 = 123;
1
2
3
安全
1. 看你写了SQL注入,说一说SQL注入在JAVA中能如何处理?
2. 使用框架时,它是怎么处理的?
协议
1. 对于HTTPS协议你了解多少?相比HTTP
2. 你对于证书、公钥、私钥了解吗?
3. 说说TCP协议下连接建立的过程。
4. 其中TIME_WAIT状态会在哪里产生?
1. 你还有什么问题?
--------------------- -------------------------------------------

  • java内存模型(原子性,有序性,可见性)
  • 线程池工作原理
  • 垃圾回收机制
  • 内存溢出解决方案
  • Spring aop 实现方式
  • orm框架用过哪些
  • 数据库事务四大特性
  • 注解处理器
  • rpc框架
  • 集合类层次,Map是不是集合框架的成员
  • HashMap, Hashtable, ConcurrentHashMap的区别
  • 同步器实现机制
  • 原子类底层机制(cas, Unsafe)
  • 快排实现方式

-----------------------------------------------------------------------------

  1. 描述一下 Java8 哪些新特性?你是如何使用 Stream 流操作的?
  2. HashMap 和 HashSet 的底层实现原理
  3. Mybatis 如何防止 sql 穿透
  4. JVM 的内存模型
  5. 类加载机制
  6. Java 有那些同步机制?说一下 volatile 关键字
  7. Spring 的 PostProcessor 接口起到什么作用
  8. Spring 如何实现事务
  9. 如何在 Bean 对象中获取 ApllicationContext 上下文对象?
  10. Mysql 索引类型有多少种
  11. Mysql 索引的使用与优化
  12. Mybatis 是如何执行 sql 语句的
  13. JDBC 获取数据库连接的大概过程(从 getConnection 开始)
  14. PreparedStatement 和 Statement 区别
  15. Mybatis 的一些 API 接口,比如 SqlSession、sessionFactory 等等
  16. 动态代理有哪些?JDK 动态代理和 cglib 有什么不同?
  17. 为什么用 Spring data JPA 而不用 Mybatis(主要针对我的项目来问的)
  18. 请描述一下从浏览器输入一行请求 url 开始,SpringMVC 的整个处理过程
  19. 请求是先 Filter 还是先经过 Servlet?Servlet 处理完后,还会经过 Filter 吗?
  20. Java 线程有几种状态
  21. 说一下 sleep() 和 wait() 方法的区别
  22. 如何唤醒处于睡眠状体的线程
  23. 如何释放处于等待中的线程
  24. Executor 创建的线程池,有哪几种类型?
  25. Executor 创建线程池的构造方法的参数都有哪些?
  26. corePoolSize = 5,maximumPoolSize = 10,那么现在有4个任务同时进来,这时会创建几条线程?如果还没处理完又进来2个任务,此时又会创建几条线程还是不会创建?
  27. 还有哪些最原生最简单使用多线程的方法?
  28. new 一个对象都经历了那几个过程?(考反射)
  29. Java 的异常有哪几种?Throwble 的子类有哪些?
  30. 请问是不是每次连接数据库都创建一个连接?线程池你都有哪些了解?有接触过哪些线程池?
  31. 数据库联表查询时,左连接和右连接的区别
  32. 说说 Mysql 的四种事务隔离级别
  33. 你是通过什么方式进行学习的?

-------------------------------------------------------------------------------------------------------------

自我介绍

自我介绍就先介绍多大了、毕业多久了、做了什么些东西、最近做的什么内容,擅长的部分呀 等等。这里说一下,自我介绍的内容如实说就好,不要太过于夸大,自我介绍的内容建议大家提前准备好,不要说的时候想到哪儿说到哪儿。

线程部分

1、多线程的实现方式有哪些?

这个题目在一面的时候基本上都会碰到吧,继承 Thread 类、实现Runnable 接口,最后调用 的是 start() 方法来启动线程。

这里还有个知识点是 start() 跟 run() 方法的区别和联系。

直接调用 start() 方法,此时线程处于一个就绪(可运行)的状态,但是并没有真正的运行。而是得到CPU 的时间片后,开始执行 run() 方法,run() 方法里面的是我们的线程体。

我们直接 运行 run() 方法,它其实就是一个普通的方法调用,在主线程中执行,是不会开启多线程的

2、描述一些线程死锁的情况?

这个问题在平常项目我们基本上没怎么接触到,但是我有过部分了解。回答的是: 两个线程在持有自己的锁的时候,还要去持有对方持有的锁,由于别人的锁已经被对方持有,造成彼此等待对方释放锁的情况。回答得比较片面,还有一些类型的死锁问题没有答出来,后面直接交底了,面试官说没关系的。

建议大家在准备这个问题的时候能说出来产生死锁的条件、现象、解决办法等。然后配上一些实例说明,在面试过程中,面试官就提到说根据我们平常遇到死锁问题的场景实例来说。

大家可以搜一下下面这两个死锁场景问题:

  • 三个人 三根筷子:每个人需要拿到身边的两根筷子才能开始吃饭

  • 银行转账问题:线程 A 从 X 账户向 Y 账户转账,线程 B 从账户 Y 向账户 X 转账,那么就会发生死锁。

3、项目中有没有用过线程池 ?怎么用的 ?

回答了我们项目里面有些接口需要组装多个服务的数据进行封装,然后返回。这里面我们会使用多线程去并行拉取数据,减少接口响应时间。

面试官说:“ok,那么你有没有看过线程池里面的源码呢 ?有哪几种线程池 ?”

源码这里我迟疑了一下,我说不太熟,然后我说了几种类型的线程池 newSingleThreadExecutornewFixedThreadPoolnewCachedThreadPool 但是还漏了一种 newScheduledThreadPool 没想起来。

4、线程池的原理是什么样子?底层方法的参数分别是什么意思?

回答这个问题的时候,当时我卡住了。我知道这几个底层都是对 调用的 ThreadPoolExecutor ,但是我死活没有想起来名字,这时候面试官提醒了一下,然后说没关系的。

接着就问:“那你知道他的参数都有哪些吗 ?都分别代表什么意思吗 ?”

我回答的是 有个 线程的个数 和 线程存活的时间,其他的没说上来。然后面试官说:“没关系的”。

补充一下:线程池底层都是通过 ThreadPoolExecutor 来实现的。

public ThreadPoolExecutor( int corePoolSize, 
                                                int maximumPoolSize, 
                                                long keepAliveTime, 
                                                TimeUnit unit,
                                                BlockingQueue<Runnable> workQueue, 
                                                ThreadFactory threadFactory, 
                                                RejectedExecutionHandler handler)

复制代码

几个参数的意思分别为:

  • corePoolSize: 线程池里最小线程数
  • maximumPoolSize:线程池里最大线程数量,超过最大线程时候会使用 RejectedExecutionHandler
  • keepAliveTime:线程最大的存活时间,超过这个时间就会被回收
  • unit:线程最大的存活时间的单位
  • workQueue:缓存需要执行的异步任务的队列
  • threadFactory:新建线程工厂
  • handler:拒绝策略,表示当workQueue已满,且池中的线程数达到maximumPoolSize时,线程池拒绝添加新任务时采取的策略。DiscardPolicy:抛弃当前任务,DiscardOldestPolicy:扔掉最旧的,CallerRunsPolicy:由向线程池提交任务的线程来执行该任务,AbortPolicy:抛出 RejectedExecutionException 异常。

问到这里,我回答的确实太有限,面试官就没有再细问了,还是说:“没关系的”。

如果你这里答出来了,那么我认为你还需要掌握的是,这几种线程池在哪些情况下使用什么类型的,以及要注意什么问题,很大可能面试官会继续深挖

这里就不给出答案了,我相信你自己去搜一下,体会会更深刻些。

MyBatis 部分

5、mybatis 的 $ 与 # 的区别?

回答:他们两都可以来传递参数,不过 # 可以方式 sql 注入,而 $ 就是字符串拼接的方式处理,可能会有sql 注入的问题。

上面还有一个关键的点没有答出来,那就是 #{} 在预处理时,会把参数部分用一个占位符 ? 代替 变成如下的 sql 语句:

select * from user where name = ?;
复制代码

而 ${} 则只是简单的字符串拼接,在动态解析阶段就直接拼接成了 最终的sql 语句:

select * from user where name = 'zhouq';
复制代码

6、$ 跟 # 的使用场景 ?

这个问题我没有怎么理解得到,然后回答的就是 $ 在拼接表名的时候用,其他时候传递参数值的时候用 #。

7、mybatis 的 dao 接口跟 xml 文件里面的sql 是如何建立关系的?

这里问到的时候比较蒙圈,然后回答的是:mybatis 会先解析这些xml 文件,xml 文件里面有命名空间 (namespace),这里可以跟dao 建立关系,然后 xml 中的每段 sql 会有一个id 跟 dao 中的接口进行关联。。。

然后面试官说: "如果 我有两个这个xml 文件 都跟这个dao 建立关系了,那不是就是冲突了?",然后,我认怂了。

我上面的回答太笼统,肯定是有问题的,建议你好好去了解一下mybatis 的原理。

mybatis 到这里就没了。

数据库

先问的是,你平常使用得做多的是什么数据库,当然了,mysql 。

8、mysql 锁机制 ?

面试官问的是,你了解mysql 的锁机制么?我就只答出来一个行锁。然后其他的没想起,就认了,其他的忘记了。

建议你去了解了解还有表锁、页面锁 等等。

9、排它锁 & 共享锁你了解吗 ?

这个地方我想了一会,说平时了解得不多。实时上,平常我们的小业务系统基本上没有用到这些,可能有用到的地方,也没有去在意吧。

接着,面试官说了下面这个场景题,然后让出解决方案。

10、场景问题:在A线程处理一条数据,比如扣款,或者是更新状态时候,其他的线程比如 B 需要对它进行阻塞,不能够再对这条数据进行操作,包括查询也不行,得等A 线程处理完成以后,B才能进行处理。A 跟 B 是同样的业务代码产生的,非不同的业务。要使用数据库的锁来实现,怎么实现 ?

问这个问题的时候,面试官很耐心的解释了这个场景,然后问我有没有想起点什么来?其实就是想考察上面的关于数据库锁的问题。

11、mysql 索引是怎么实现的?

回答的是 B+ 树,接着面试官继续问,能否大致描述一下 B+ 树的大致结构。这块内容没怎么了解,直接认怂了。

缓存相关

这块内容是我项目上写得有使用了多级缓存的方案,然后面试官就这一块问了下面的这些关于使用缓存可能会遇到的问题。

12、缓存击穿、缓存穿透 、缓存雪崩 ?

13、热点数据失效怎么解决?

这两个问题,以前好好了解过,但是没整理成自己的东西,面试的时候也说得云里雾里。所以专门整理了一篇文章,长长记性。

详情请移步:阿里一面关于 缓存穿透、缓存击穿、缓存雪崩和热点数据失效问题的解决方案

14、先删缓存还是先更新数据库,为什么?

这里我说的是先删缓存,然后再更新数据库。这是错误的,这里有非常大的问题。

想想这样一个场景:

如果一个线程 A 先把缓存删除了,然后去更新数据库,那么在它删了缓存还没有更新到数据库的这个中间时间,线程B进来了,发现缓存没有,就去读库,这时候还是读取还是旧的数据,然后又更新到缓存去了。此时A 才把新数据写到数据库。

此时就产生了一个典型的问题就是“双写不一致”。

关于这块问题的讨论:缓存更新的套路-陈皓老师

kafka

15、kafka 的架构,包含了哪些角色?

这个问题我开始不知道怎么回答,就说了个 Broker,然后面试官提醒了一下:“不是我们平常还有生产者,消费呀什么的吗 ?”额,我说还有生产者、消费者、主题呀等等。

这过程中面试官还提到说平常我们在搭建的时候要配置写什么东西呀等等,按照官网的介绍说也行。

这里还有其他的比如Partition、消费者组、还有一个主要的 就是 zk 了。

这里建议大家好好的把 kafka 里面的这些概念、属于、架构图好好自己画一下。不然真是关键时候真说不出来,但是他一提你又明白。这样子肯定是不行的,面试是你说,不是面试官说。

16、kafka 的最小工作单元?

这个问题问得也是蒙圈,其实就是说我们在写代码的时候,要用kafka的时候。我们需要使用那些最基础的组件,比如生产者、消费者、主题、偏移量 等等。

这个问题如果你们遇到,最好向面试官问清楚。

17、kafka 消息重复消费的问题?幂等怎么做的?

刚开始面试官说,你知道kafka 消息重复的问题吗?有没遇到。

我回答的是,会存在消息重复消费的问题。我们在消费数据这端做了幂等处理来解决。

然后面试官继续才问的是:幂等怎么来做的, 我说通过设置数据版本号,还有数据库唯一索引等等。

面试官:“ok”。

这个问题,如果你能告诉面试官产生重复消费的情况,比如说投递的时候重复了,消费的时候由于 offset 没处理好等等问题导致的话,我想可能会更好。

18、kafka ack 机制?集群中的ack 是怎么实现的?

这里我只回答上了 ack 机制是啥,但是实现原理没有回答上来。

Redis

19、Redis 中有哪些数据结构

平常使用得最多的是 String , 还有 List 、Hash、Set、ZSet 。

没有再问其他的内容。

但是像Redis 为什么这么快这种问题,我认为你应该要去了解,其他小伙伴经常遇到。也就是多路复用是个什么玩意儿?

源码

20、这里面试官问 你平常有没有看过一些源码?框架的也行?JDK 的也行。

然后我说看了 HashMap 的源码,然后就巴拉巴拉的说了一哈大体的 put、get 流程 ,它的结构是什么样子的。

这过程中还问到了 怎么判断两个对象是否相等?也就是 == 和 equals 的知识点。

其他的就没再继续问了。到这里整个电面过程结束了,说10个工作日内会给我答复此次面试情况。整个过程大概持续了40分钟的样子。

我知道,凉凉。

最后总结一下

上面的模块虽然顺序有变化,但是每个大块里面的问题都是按照顺序来的,基本上都是由浅入深、循序渐进的来问。

像数据库锁、线程池、缓存问题 这些内容几乎都是那种连环炮的形式,直到摸到你的底

通过这次面试,亲身体会到了差距。不过,更有方向了。

告诫大家一点东西:

  • 平常多积累:输出或者教会别人是最好的学习方式,光看不练,几天就忘。
  • 先深后广:深入学习,而不是只停留在使用API 的层面,一块一块系统的深入了解,再去搞其他的。
  • 建立知识体系:把自己学习的内容形成博客也好,什么导图也罢,记得把这些零散的内容,整理成自己的知识。
  • 别抱有侥幸心理:别裸面,如果自己有整理的还是多看一下,多准备准备。大厂的面试会挖到你最深的部分,不要觉得只背一些面试题就是 ok的,题是背不完的。临时抱佛脚基本上过不了关。如果你是靠背面试题进去的,那么你厉害,佩服。
  • 隔一段时间就去面试吧:不要学我,待一家公司三年多,中途都没有出去面过,出去面面才知道,哪些是需要去补充的。

有些问题答案这些可能不是太全面,需要你自己去动手。这里只是重点把面试的过程和内容描述出来。

希望这篇文章对你有帮助,哪怕只有一个点,都是值得的。其中有一些点如果你不了解,那么你是时候要去补充了


作者:乔二爷
链接:https://juejin.im/post/5cba85c8f265da038a14734b

---------------------------------------------------------------------------------------------------------------------------------
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值