腾讯实习面试(一二面)
来源:牛客网
整理:帅地玩编程
写在前面:学习路线,八股文面试题,各大公司真实面经,书籍下载,视频学习资料,都在帅地的网站更好了。
地址:https://www.iamshuaidi.com/
---------下面正文---------
一面 (时长54分钟)
1、自我介绍
2、说项目,项目问的比较深,我说到算法(正态分布),问到正态分布的细节
3、HashMap原理
4、Hash碰撞的解决方法
我说了两个:拉链法,开放定址法(需要看看原理)
5、StringBuilder和StringBuffer的区别
我说到了String常量,字符串操作中最慢,之后就是StringBuilder和StringBuffer的线程安全性
6、StringBuilder和StringBuffer使用单线程执行,有区别吗?
看过Java并发编程艺术应该有提及偏向锁的说法,说到这点面试官就okok了,恭喜答到点子了
7、CurrentHashMap原理
CurrentHashMap的原理解析的越清晰越好,双数组+链表的结构
8、synchronized静态方法和实例所属方法的区别
静态方法:当前类class对象作为锁 实例方法:当前对象作为锁
9、说说Lock
10、说说ReentrantLock是基于哪个类的?说说队列同步器
基于队列同步器AbstractQueueSychronier ,在说队列同步器时,我提到了两大点:队列同步器维护一个
同步队列,是双向链表,同时也维护一个同步状态state;还说到它的方法分类:独占式锁和分享式锁
说说独占式锁的实现:我说到了最重要的一点就是加入同步队列的时结点需要自旋查看它的前一个结点是
否获取锁,如果获取的话,它应该尝试获取锁(tryAcquire),面试官OKOK,所以这里的点在于自旋!!!
11、说说list下的ArrayList和LinkedList的区别
主要说ArrayList基于数组,LinkedList基于链表,LinkedList插入删除更快;ArrayList查询更快即可
12、讲讲线程,线程池
我提到了Excutor线程池,着重强调使用过FixedThredPool和ScheduledThreadPool没有提
CachedThreadPool因为它的maximumPool是Integer.MAX_VALUE值,创建线程太多会导致cpu飙升和资
源耗尽OOM
13、说说线程池创建时的参数
corePool核心线程数,maximum最大线程数,时间,以及阻塞队列
(ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,DelayQueue等)
14、线程池处理task的流程
提交实现Runnable或者Callable接口的task,调用submit或者execute方法,先检查核心线程数是否已经
饱满,如果没有的话,创建新的线程执行任务,否则加入阻塞队列;判断阻塞队列是否饱满,如果饱满,
检查最大线程数是否饱满,如果饱满,交给饱和策略(Abort拒绝并报异常默认方式,用发送任务的当前
线程执行,删除阻塞队列最后一个任务将当前任务加入阻塞队列,直接抛弃)
15、讲讲TCP和UDP的区别
TCP三次握手,更加可靠
16、TCP三次握手和四次挥手过程
读者自行百度,最好理解记忆
17.四次挥手的状态
读者自行百度,最好理解记忆,我个人觉得这一快在面试中经常会被问到,尤其是状态迁移,比如
time_wait的时间为什么2msl之长(两个原因)?或者说time_wait大量出现的原因(socket忙于读写或者
程序忘了没有close)?如何避免这种问题?(两种解决方案:基于socket调用close;基于TCP连接的参数
设置,连接超时设置或者按照一定的频率监控连接是否活动,没有活动就关闭连接)
18、TCP最后一次ACK包没有送到就开始传输数据包,会发生什么?
服务端不会接受数据包,并且会返回给客户端RST包,也就是异常包
19.、HTTP1.0和 HTTP1.1的区别
HTTP1.0默认短连接,可以长连接,但是需要设置header connection:keepAlive HTTP1.1默认长连接
20、HTTP1.0, HTTP1.1和 HTTP2.0的区别
HTTP2.0支持二进制传输数据,更加安全快捷,而 HTTP1.0, HTTP1.1支持文本 HTTP2.0实现多路复用,更加快捷 HTTP2.0压缩header HTTP2.0支持服务“主动”给客户端缓存发送数据
21、HTTPS的改变?
在 HTTP协议基础上加入了安全协议ssl,读者自行百度了解原理,很重要!!!
22、数据库引擎有哪些?说说他们的区别
说到InnoDB和MyISAM,主要区别是InnoDB支持事务!!!,MyISAM不支持!!!以及MyISAM只支持表锁,InnoDB不仅支持表锁还支持行锁!!!
23、索引的底层
这个我答得不好,因为底层我不是很熟悉,我之后百度了一下,索引其实就是一个树形数据结构,一个B+ Tree,索引作树节点,查询快,但是insert和delete会破坏树的结构
24、Linux命令你熟悉哪些?
我说到Java性能调优用到的命令以及问题定位的命令
25、TOP命令的详解,swap了解吗?真正内存包括缓存和***吗?
读者自行百度,本人在这答得不是很好
26、用过网络编程吧?用过,说说select和epoll的原理和区别
个人觉得这一块需要读者着重看一下,因为很多公司的分布式是使用Netty或者其他NIO,AIO通信的,其中的重点技术也就是在这个select和epoll中,它关系到内核与用户态的交流机制!!!!面试官会okok,兄弟
27、永久代会变吗?
其实这个问题把我问懵了,我当时以为在问永久代的回收机制,结果面试官提醒说到动态加载类,然后就开始加载类的知识点
28、GC策略说说
整体使用的分代回收算法,年轻代使用copy算法,年老代使用标记管理算法,都可以避免产生碎片
29、JVM内存模型
堆,栈,本地方法栈,方法区,程序计数器
30、年老代还有内存,但是程序显示OOM什么原因?
在这我想到JVM一般给大对象比如数组分配内存时会在老年代中分配,这时候会产生OOM
31、还有一个问题忘了没提到:HashMap put操作的最差情况解决方案
我说了最差情况会变成一个二叉TreeMap,查询变快。读者自行百度解析原理,也是常考点,在开发中很重要
32、说说TreeMap的实现原理
基于红黑树,红黑树是平衡二叉树,关于平衡二叉树需要读者耐心解决,这一个知识点可能会问到很多处,比如数据库索引使用就是红黑树,红黑树查询快,但是更改操作会打乱树的结构,有左旋右旋处理法,读者自行百度
33、还有什么问题?
另外,关于八股文面经,可以在这个网站刷,很全:https://www.iamshuaidi.com/
二面(第二天)时长54分钟
1、自我介绍
2、使用过哪些集合框架?说说HashMap,为什么HashMap无序?为什么不安全?
HashMap是根据对象的hashcode再散列定位数组角标的,所以无序,TreeMap有序 HashMap没有加锁
3、海量数据]存进HashMap性能会变差吗?
我的答案是不会变差,因为HashMap会扩容,查询时间复杂度本来就是O(1),无论数据量多大,在理论情
况下,不会变差。之后我说了时间复杂度低的原因:先对对象hashcode进行在散列定位到具体的数组角标
中,之后使用equals查看链表是否有相同的key,如果有,直接返回。貌似面试官说okok了解,应该是这
样,读者可以自行百度看看
4、HashMap解决hash碰撞的方案?
前一次面试已经提到了
5、HashMap的reHash过程
HashMap的reHash是在put对象时发生的,先插入到链表]头部,之后判断是否超出临界值(theshold = capacity * loadFactor),如果超出了,进行rehash,在此容量基础上*2,对对象再次hashcode再散列,重新定位数组角标
6、HashMap的rehash过程会发生安全问题吗?
会的,因为rehash过程发生在put操作中,put操作没有加锁,多线程操作的话会发生链表变成环状造成死循环的情况
7、HashTable安全,说说
HashTable每个方法都使用重量级锁synchronized
8、海量数据怎么查找敏感词?
这个问题我没有答好,我只是说到了semhash算法,但是这个算法只是打散句子的过程,面试官提醒使用二叉树树数据结构,但是我没有想明白,读者可以认真考虑一下这个问题
9、Redis的rehash过程
这道题我觉得很有含金量,之前度过Redis的源码,这一部分还是记得比较清楚。过程是:RedisServer结
构体中(Redis使用C语言完成)有一个Dictionary数组,默认容量大小是16, 每个 Dictionary结构体中有
三个Dict结构体指针,Dict其实就是一个KV结构,类似于HashMap,其中两个作为数据存储的库,一个作
为当前使用,一个作为备用rehash;另外一个Dict存储键的过期时间。Redis的rehash过程其实就是将上
述的16个Dictionary进行rehash,Redis内部支持一个周期循环运行的ctro函数,这个函数定期检查上述的
16个Dictionary是否需要rehash,如果有需要,ctro会完成Dictionary的rehash过程,周期结束后并且记
录当前循环到Dictionary数组中的哪一个角标,方便再次循环时从上一次循环停止的地方开始。
其中还有一点,Redis的rehash是延迟性的,每次put会将新元素加入到新的表中,每次查询时,首先会在
新的表中查找,如果没有,在旧的表中查找,查找到的话将这个元素插入到新的表中(这个过程也会涉及
到检查元素是否过期的问题)
10、Redis使用哪些数据结构?
支持字符串,list, sorted list, set, hash
11、Redis是多线程还是单线程的?
单线程!!!!Mem***使用多线程
12、说说TCP和UDP的区别
13、UDP传输数据的最大容量?为什么?
这道题我没答好,我记得是1024,原因我想到了socket的发送缓冲区大小,还有安全方面的考虑。但是面试官说答得有点偏
14、TCP三次握手和四次挥手
15、为什么四次挥手??
记住TCP是全双工模式,直接说全双工,面试官OKOK
16、协议层有哪些?说说五层协议
OSI,TCP/IP,五层协议
17、ping命令是哪一层?
应用层,使用ICMP协议,没有使用TCP/IP
18、HTTP协议的过程
19、DNS域名解析原理
20、ARP协议原理
读者可以自行看看这些,知道ARP(地址解析协议)的原理
21、每次DNS域名解析都要请求DNS服务器,是不是很耗时?怎么解决
这道题我答得不好,我说到了缓存,但是不知道原因
22、Linux的命令你知道哪些?
23、top命令你注意哪个指标?
我一直围绕JVM那一块,比如PID,CPU利用率,Memory等,但是面试官其实想问你经常看磁盘吗?我说没有。。
24、性能调优看哪些命令?
CPU,Memory等,好像答非所问。。
25、说说你遇到最具特色的项目
26、LRU算法知道吗?自己设计怎么设计?
这道题是这次面试第二大最具难度的题,因为之前看过Redis源码,有提及LRU算法,它的作用就是淘汰不经常使用的元素,使用双向链表作为数据结构,插入时将元素插入到头部,查询时将元素也迁移到头部,这样一来,尾部剩余的元素就是相对使用不太频繁的元素。自行设计面试官的要求是使用list,我就照猫画虎设计了,面试官OKOK
27、最后一道算法题:7升桶和3升桶,怎么打到2升水?
我的算法:先装满7升桶,然后7升桶向3升桶倒满,7升桶剩余4升,3升桶清空,7升桶再向3升桶倒满水,7升桶剩余1升,3升桶清空,7升桶把最后1升倒进3升桶,之后7升桶再装满水,给3升桶倒满,7升桶剩余5升,3升桶清空,7升桶给3升桶倒满,7升剩余2升,结果出来了
28、这种算法是不是太慢了,有没有快的方法?
我没想到。。
29、你还有什么问题吗??