2018 一些个人面试经验和一些 java 面试笔记
我是2018届毕业生,在大学快结束(还剩一学期)的时候,准备转行软件,就毅然决然辞去了手上的硬件工作,但是这个时候开始转行确实太难了,我不断地学习,想用着一学期的时间来把软件基础补起来,结果很一般,开始了解软件之后才发现,原来软件的东西比硬件多的多得多,一直在学习但是总是学不够(扯得有点远了)。好了,其实很早就想写一些记录,可是因为一直没找到合心意的工作,所以一直放着。现在终于有时间来好好写写,也算是一点总结。内容包括了一些我认为含金量较高的面试经历,及我个人在准备面试期间的一些知识点的概括总结。(看完的话应该会收获不少)
首先来说一下面试经历吧
-
有赞电话一面
我投的是2019届校招的java开发工程师,这个当时就想试试,毕竟人家招的是2019届的。没想到过了一段时间看到邮件发送过来,简历通过初筛,等待沟通。。。当时心里那个激动啊,下午就接到了有赞面试官的电话,和我约了晚上8点的电话面试。当时想着回去后好好准备一下。
面试开始,有赞的面试官是我遇到过最好的面试官,很耐心,很细节,会从多方面考察你的能力,而不会以偏概全。
- 一开始还是自我介绍,这个我做的很不好,后来去网上查了一下最好这个格式(姓名,毕业学校,家乡,主要学习的语言和怎么使用它们/技术栈是什么、自己对技术的一些想法/对自己的评价)
- 简单说一下HTTP协议,当时听到是懵逼的,不知道该怎么说,我就问他具体指什么,然后他就换了一个方式问(get,post。。。区别及解释)
- 了解DNS吗,简单说一下DNS作用(这个应该都知道,域名解析嘛)
- java的基本类型及包装类,包装类和基本类型的关系(基础的基础,送分题)
- 接下来是 Mysql ,给了一个 Student 类,该怎么建索引,需要建几个。(这个感觉是一个开放题,字段全部自己定,我定了id,name,sex。id是主键,直接就是索引就好了,这个也是个送分题,就是当时理解不了,怎么问的这么宽泛,然后就墨迹了很久)
- 面试官说了一下他们的项目及他们需要维护的东西(这里我很纳闷)
- 又回到 sql ,问怎么优化慢查询。怎么调优(这个答的不是很好,不是就说了一些基本的 sql 查询的优化)
- 最后是一个开放题,真的感觉面试官太好了,看我之前是做爬虫的,直接给我设计了一题:怎么设计一个高可用高效率的爬虫系统(这里我从头到尾,分析了一下,从数据库,到分布式,到消息队列,到缓存,到数据清洗都说了,说的过程面试官很耐心听我讲,也有记录,都没打断我,等我说完后他做了一个总结,和他问题一一对应我是否有涉及到他考察的点。)
- 期间还有问道一个springboot的问题,忘记是什么了
这样就结束了有赞电话面试第一面。他说等通知吧
-
有赞电话二面
二面的话是在国庆后了,在家喝侄子晚了几天后,回到杭州开始准备面试。之前我以为有赞的面试已经凉了,在8号晚上七点多,突然来了电话,说有赞的电话二面,没办法只好硬着头皮上。
- 还是自我介绍
- 毕竟二面了,面试官也不含糊,上来把我的项目经验都看了一下。完了之后说,我看你之前都是做爬虫的,简单介绍一下你的项目吧(我就大概说了一下,爬虫的项目真的没什么技术含量,无非是翻页,解析,模拟登录等等)
- 说完后,我看你模拟登录有对加密的密码破解,你遇到的都是什么加密方式啊(我说了一下非对称加密RSA),接着追问,这个是非对称加密,那对称加密是怎么样的,和非对称加密的区别是什么(模糊的知道对称加密好像破解比较容易,但是不确定,当时就回复了不知道。结束后查了,对称加密加密和解密用的秘钥相同,加密速度快,解密难度相对于非对称加密难度小)
- 接着问,你做爬虫,对http了解吧,https呢,https和http有什么不同,https的加密方式是对称加密还是非对称加密(怪自己只会了解表面,知道https加密,但不知道怎么加密及加密方式是什么,查了一下https加密方式有对称加密和非对称加密)
- TCP 三次握手知道吗,简单说一下过程(必会吧),那 TCP 是属于 OSI 五层或七层的哪一层,先说一下 OSI 五层模型吧,(应用层,传输层,网络层,数据链路层,物理层),TCP/IP ,在哪一层?(送命题,TCP 属于传输层,IP属于网络层)。知道 Socket 吗?它在建立连接的时候 accept ,成功连接后是建立了什么连接,会返回一个什么对象(由于对 java 的 socket 编程不了解,问的时候就不是很清楚了,都说了不知道,结束后查了,socket 连接建立的是TCP 连接( UDP 无连接),在传输层建立, accept 返回的是一个 Socket 对象)
- 简单说一下 TCP / UDP 的区别吧(必会),它们各有什么问题,怎么解决(我就说了一个 TCP 的一个粘包问题,定长解决,UDP 会丢包)
- 看你接触过 ZK ,说说你们怎么使用的啊,使用原生的 API 吗?(是的,主要做了一个任务分发,用了watch机制),那问一下 如果我有三台机器,我坏了几台整个系统就不能用了,(这个没答上来,因为 ZK 用了很久了,而且没有仔细去研究,只是把他简单用上了。结束后查了一下,ZK 系统一般宕机一半以上就不能用了,一定要保证存活半数以上,选举机制的保证),ZK 的内存模型怎么样(面试官提示的是树)
- Redis 用过。它是单线程还是多线程的(单),那为什么呢( Redis 在内存中存取数据,速度本来就很快快,若用多线程,上下文切换的时间消耗十分巨大,效率还不如单线程)。Redis 是单线程的,那它存在并发问题吗(脑子竟然绕不过来,并发问题简单的可以用 i++ 这个来验证,其实 Redis 是存在并发问题的),面试官看我没反应过来,那或者换个方式问,知道CAS吗,(compare and swap 乐观锁,然后我说了一下知道的),面试官看我没反应过来应该很失望吧(CAS 可以用来解决Redis并发问题啊,也就是说 Redis 存在并发问题阿)。然后又问了一个怎么用 Redis 来做选举(当时 Redis 这块准备的不充分,分布式锁这一块都没去看,也就没答出来,但是说可以用 Redis 的 list 来做,每次检查长度,这个肯定不是答案,也不知道该怎么答。后来倒是看了 ZK 的选举机制,1.全新集群选举(机器id,开机顺序)2.非全新集群选举(逻辑时钟 -> 数据id -> 机器id))
- 接下来问了 Spring ,了解spring,说一下 Spring IOC 的初始化过程吧(真的打脸,这个都没去看过还敢说自己了解 Spring ,没答出来),追问那 BeanPostProcessor 这个接口知道吗(也不知道。。好了 Spring 问完了。。。。)
- 问了 Hashmap 是不是线程安全,加在方法上的 synchronized 锁实际是加在哪的(实例对象上),那什么map是线程安全的(说了 ConcurrentHashmap ,感觉自己在挑战权威), 那 ConcurrentHashmap是强一致性还是弱一致性的,为什么(瞬间懵逼,没听说过这个概念,后查到是弱一致性的,因为get无锁,可能不能马上拿到新插入的值)
- 说说 Tomcat 内部结构吧(当时说的很乱,结束后了解清楚,这个也要必须会),servlet是单例是还多例。
差不多就问完了,问完我也就觉得凉凉了,结果第二天就收到通知没通过,心里也很难受,不多让我知道了自己远远不足。
-
玛瑙湾
这家公司的面试很风趣,主要是面试官,他是支付宝出来的,问的问题可以很深入,看你简历怎么写
-
还是问了一下基本的情况
-
快排原理(双轴快排,三向切分快排),说了第一个其他连个都不知道,归并排序(知道,不知道其过程,这个是要不得的,回来后好好把这个看了一下)
-
小顶堆,有向无环图,小顶堆说了一下,后面的不知道,回来简单了解了一下也不是很懂。
-
设计模式,了解单例,没有系统去看,设计模式分为哪三大类(创建型,行为型,结构性)
-
给了一个简单的关联表 sql 查询,竟然没写出来,不知道是因为啥,脑子坏掉了吗
-
说说 int a = 1; 在虚拟机中的执行过程(先生成常量1,放入方法区,将a变量压入线程栈,将a指向1)
-
RFC2616协议了解吗? RFC1945(一脸懵逼,其实就是http1.1 和http1.0),ETAG了解吗(关于缓存的,一个标识,服务端会将客户端传过来的ETAG和服务端进行对比,若相同,则标识客户端缓存的数据都是可以用,未更新。若不相同,服务端会重新发送已更新的数据)
-
以上就是我认为比较有含金量的两次面试,可以学到很多东西
一些简单的总结
- 面向对象的特征
- final,finally,finalize
- 重写,重载
- 抽象和接口的区别
- 内存泄漏和内存溢出区别
- 反射原理
- GET POST区别
- session和cookie区别
- session分布式处理
- JDBC操作
- equals和==区别
- 集合set
- list
- Hashmap(重点)
- ConcurrentHashmap(重点)
- 创建线程的方式
- 说说sleep,wait,join,yield
- sleep(0) 的作用
- CAS 原理
- Redis内存模型
- volatile 原理作用,可否代替 synchronized
- 线程的生命周期的几种状态
- 偏向锁,轻量级锁,自旋锁,锁消除,synchronized可重入,公平锁,非公平锁
- 线程池,一些参数,用的什么队列
- 原子类
- spring默认是单例还是多例
- wait,notify使用
- 隔离级别,会造成什么问题
- mysql储存引擎,分别的特点
- 高并发修改一行数据,推荐乐观锁还是悲观锁,原因
- innodb 标准的行级锁是什么,简单说一下怎么使用
- innodb 和myisam索引的原理,区别。聚集索引和非聚集索引区别
- 简单说一下innodb索引的数据结构
- 数据库的MVCC
- Redis 的缓存击穿,缓存雪崩,缓存穿透,分别是什么
- Redis 几种内存淘汰策略是什么,默认淘汰策略是什么。当数据库中有一部分数据用到的非常频繁,应该选用怎么策略。当数据库数据数据的使用比较平均怎么选择。
- mysql 产生死锁的情况及分析
- 正想索引和反向索引
- 一个类中不能被序列化的变量有哪些
- final修饰的引用变量指向的对象的内容可以修改吗
- spring IOC 初始化流程
- 简单说一下AOP
- SpringMVC的流程
- JVM的内存模型
- 垃圾回收机制
- 二叉堆
- object中公用方法有哪些
- Native修饰的函数是什么
- String类为什么设计成final
- String,StringBuilder,StringBuffer区别
- ThreadLocal 原理
- java泛型
- java 通配符“?”,解决了设么问题,怎么使用
- 手写单列(懒汉式,饿汉式)
- 一个对象被创建的过程(jvm中)
- OSI模型
- TCP/IP
- socket
- 什么是异步
后期会补充知识点的简要解答,文中若有不对的地方,请大家指出