腾讯CSIG实习面试(一,二面)

一面 (时长54分钟)

  1. 自我介绍
  2. 说项目,项目问的比较深,我说到算法(正态分布),问到正态分布的细节
  3. HashMap原理
  4. Hash碰撞的解决方法

我说了两个:拉链法,开放定址法(需要看看原理)

  1. StringBuilder和StringBuffer的区别

我说到了String常量,字符串操作中最慢,之后就是StringBuilder和StringBuffer的线程安全性

  1. StringBuilder和StringBuffer使用单线程执行,有区别吗?

看过Java并发编程艺术应该有提及偏向锁的说法,说到这点面试官就okok了,恭喜答到点子了

  1. CurrentHashMap原理

CurrentHashMap的原理解析的越清晰越好,双数组+链表的结构

  1. synchronized静态方法和实例所属方法的区别

静态方法:当前类class对象作为锁 实例方法:当前对象作为锁

  1. 说说Lock
  2. 说说ReentrantLock是基于哪个类的?说说队列同步器

基于队列同步器AbstractQueueSychronier ,在说队列同步器时,我提到了两大点:队列同步器维护一个同步队列,是双向链表,同时也维护一个同步状态state;还说到它的方法分类:独占式锁和分享式锁
说说独占式锁的实现:我说到了最重要的一点就是加入同步队列的时结点需要自旋查看它的前一个结点是否获取锁,如果获取的话,它应该尝试获取锁(tryAcquire),面试官OKOK,所以这里的点在于自旋!!!

  1. 说说list下的ArrayList和LinkedList的区别

主要说ArrayList基于数组,LinkedList基于链表,LinkedList插入删除更快;ArrayList查询更快即可

  1. 讲讲线程,线程池

我提到了Excutor线程池,着重强调使用过FixedThredPool和ScheduledThreadPool没有提CachedThreadPool因为它的maximumPool是Integer.MAX_VALUE值,创建线程太多会导致cpu飙升和资源耗尽OOM

  1. 说说线程池创建时的参数
  1. corePool核心线程数,maximum最大线程数,时间,以及阻塞队列(ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,DelayQueue等)
  1. 线程池处理task的流程

提交实现Runnable或者Callable接口的task,调用submit或者execute方法,先检查核心线程数是否已经饱满,如果没有的话,创建新的线程执行任务,否则加入阻塞队列;判断阻塞队列是否饱满,如果饱满,检查最大线程数是否饱满,如果饱满,交给饱和策略(Abort拒绝并报异常默认方式,用发送任务的当前线程执行,删除阻塞队列最后一个任务将当前任务加入阻塞队列,直接抛弃)

  1. 讲讲TCP和UDP的区别

TCP三次握手,更加可靠

  1. TCP三次握手和四次挥手过程

读者自行百度,最好理解记忆

  1. 四次挥手的状态

读者自行百度,最好理解记忆,我个人觉得这一快在面试中经常会被问到,尤其是状态迁移,比如time_wait的时间为什么2msl之长(两个原因)?或者说time_wait大量出现的原因(socket忙于读写或者程序忘了没有close)?如何避免这种问题?(两种解决方案:基于socket调用close;基于TCP连接的参数设置,连接超时设置或者按照一定的频率监控连接是否活动,没有活动就关闭连接)

  1. TCP最后一次ACK包没有送到就开始传输数据包,会发生什么?

服务端不会接受数据包,并且会返回给客户端RST包,也就是异常包

  1. HTTP1.0和 HTTP1.1的区别

HTTP1.0默认短连接,可以长连接,但是需要设置header connection:keep_Alive
HTTP1.1默认长连接

  1. HTTP1.0, HTTP1.1和 HTTP2.0的区别

HTTP2.0支持二进制传输数据,更加安全快捷,而 HTTP1.0, HTTP1.1支持文本
HTTP2.0实现多路复用,更加快捷
HTTP2.0压缩header
HTTP2.0支持服务“主动”给客户端缓存发送数据

  1. HTTPS的改变?

在 HTTP协议基础上加入了安全协议ssl,读者自行百度了解原理,很重要!!!

  1. 数据库引擎有哪些?说说他们的区别

说到InnoDB和MyISAM,主要区别是InnoDB支持事务!!!,MyISAM不支持!!!以及MyISAM只支持表锁,InnoDB不仅支持表锁还支持行锁!!!

  1. 索引的底层

这个我答得不好,因为底层我不是很熟悉,我之后百度了一下,索引其实就是一个树形数据结构,一个B+ Tree,索引作树节点,查询快,但是insert和delete会破坏树的结构

  1. Linux命令你熟悉哪些?

我说到Java性能调优用到的命令以及问题定位的命令

  1. TOP命令的详解,swap了解吗?真正内存包括缓存和***吗?

读者自行百度,本人在这答得不是很好

  1. 用过网络编程吧?用过,说说select和epoll的原理和区别

个人觉得这一块需要读者着重看一下,因为很多公司的分布式是使用Netty或者其他NIO,AIO通信的,其中的重点技术也就是在这个select和epoll中,它关系到内核与用户态的交流机制!!!!面试官会okok,兄弟

  1. 永久代会变吗?

其实这个问题把我问懵了,我当时以为在问永久代的回收机制,结果面试官提醒说到动态加载类,然后就开始加载类的知识点

  1. GC策略说说

整体使用的分代回收算法,年轻代使用copy算法,年老代使用标记管理算法,都可以避免产生碎片

  1. JVM内存模型

堆,栈,本地方法栈,方法区,程序计数器

  1. 年老代还有内存,但是程序显示OOM什么原因?

在这我想到JVM一般给大对象比如数组分配内存时会在老年代中分配,这时候会产生OOM

  1. 还有一个问题忘了没提到:HashMap put操作的最差情况解决方案

我说了最差情况会变成一个二叉TreeMap,查询变快。读者自行百度解析原理,也是常考点,在开发中很重要

  1. 说说TreeMap的实现原理

基于红黑树,红黑树是平衡二叉树,关于平衡二叉树需要读者耐心解决,这一个知识点可能会问到很多处,比如数据库索引使用就是红黑树,红黑树查询快,但是更改操作会打乱树的结构,有左旋右旋处理法,读者自行百度

  1. 还有什么问题?

二面(第二天)时长54分钟

  1. 自我介绍
  2. 使用过哪些集合框架?说说HashMap,为什么HashMap无序?为什么不安全?

HashMap是根据对象的hashcode再散列定位数组角标的,所以无序,TreeMap有序
HashMap没有加锁

  1. 海量数据存进HashMap性能会变差吗?

我的答案是不会变差,因为HashMap会扩容,查询时间复杂度本来就是O(1),无论数据量多大,在理论情况下,不会变差。之后我说了时间复杂度低的原因:先对对象hashcode进行在散列定位到具体的数组角标中,之后使用equals查看链表是否有相同的key,如果有,直接返回。貌似面试官说okok了解,应该是这样,读者可以自行百度看看

  1. HashMap解决hash碰撞的方案?

前一次面试已经提到了

  1. HashMap的reHash过程

HashMap的reHash是在put对象时发生的,先插入到链表头部,之后判断是否超出临界值(theshold = capacity * loadFactor),如果超出了,进行rehash,在此容量基础上*2,对对象再次hashcode再散列,重新定位数组角标

  1. HashMap的rehash过程会发生安全问题吗?

会的,因为rehash过程发生在put操作中,put操作没有加锁,多线程操作的话会发生链表变成环状造成死循环的情况

  1. HashTable安全,说说

HashTable每个方法都使用重量级锁synchronized

  1. 海量数据怎么查找敏感词?

这个问题我没有答好,我只是说到了semhash算法,但是这个算法只是打散句子的过程,面试官提醒使用二叉树树数据结构,但是我没有想明白,读者可以认真考虑一下这个问题

  1. 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会将新元素加入到新的表中,每次查询时,首先会在新的表中查找,如果没有,在旧的表中查找,查找到的话将这个元素插入到新的表中(这个过程也会涉及到检查元素是否过期的问题)

  1. Redis使用哪些数据结构?

支持字符串,list, sorted list, set, hash

  1. Redis是多线程还是单线程的?

单线程!!!!Mem***使用多线程

  1. 说说TCP和UDP的区别
  2. UDP传输数据的最大容量?为什么?

这道题我没答好,我记得是1024,原因我想到了socket的发送缓冲区大小,还有安全方面的考虑。但是面试官说答得有点偏

  1. TCP三次握手和四次挥手
  2. 为什么四次挥手??

记住TCP是全双工模式,直接说全双工,面试官OKOK

  1. 协议层有哪些?说说五层协议

OSI,TCP/IP,五层协议

  1. ping命令是哪一层?

应用层,使用ICMP协议,没有使用TCP/IP

  1. HTTP协议的过程
  2. DNS域名解析原理
  3. ARP协议原理

读者可以自行看看这些,知道ARP(地址解析协议)的原理

  1. 每次DNS域名解析都要请求DNS服务器,是不是很耗时?怎么解决

这道题我答得不好,我说到了缓存,但是不知道原因

  1. Linux的命令你知道哪些?
  2. top命令你注意哪个指标?

我一直围绕JVM那一块,比如PID,CPU利用率,Memory等,但是面试官其实想问你经常看磁盘吗?我说没有。。

  1. 性能调优看哪些命令?

CPU,Memory等,好像答非所问。。

  1. 说说你遇到最具特色的项目
  2. LRU算法知道吗?自己设计怎么设计?

这道题是这次面试第二大最具难度的题,因为之前看过Redis源码,有提及LRU算法,它的作用就是淘汰不经常使用的元素,使用双向链表作为数据结构,插入时将元素插入到头部,查询时将元素也迁移到头部,这样一来,尾部剩余的元素就是相对使用不太频繁的元素。
自行设计面试官的要求是使用list,我就照猫画虎设计了,面试官OKOK

  1. 最后一道算法题: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升,结果出来了

  1. 这种算法是不是太慢了,有没有快的方法?

我没想到。。

  1. 你还有什么问题吗??
#实习##笔经##提前批##腾讯##Java工程师#
全部评论
3升的桶3次倒满7升的,3*3-7=2,最后一次剩余2升🙄
点赞 回复
分享
发布于 2019-03-25 19:36
icmp属于网络层协议吧
点赞 回复
分享
发布于 2019-03-28 20:33
百信银行
校招火热招聘中
官网直投
大佬大佬,面的好全,你答的也好棒,膜!
点赞 回复
分享
发布于 2019-03-25 19:30
感谢大佬,请问大佬到哪一步了?csig开始发offer了么?
点赞 回复
分享
发布于 2019-03-27 23:46
大佬,请问下一面之后多久发通知的呀,还是第二天直接就打电话过来二面了
点赞 回复
分享
发布于 2019-03-28 18:37
大佬强的一批啊
点赞 回复
分享
发布于 2019-03-28 23:02
建议加精
点赞 回复
分享
发布于 2019-03-28 23:31
大佬 ,HashMap put操作的最差情况解决方案?这个没懂哎,是问链表长度超阈值变红黑树吗?
点赞 回复
分享
发布于 2019-03-29 01:45
java 内存模型楼主打错了啊😂
点赞 回复
分享
发布于 2019-03-29 08:59
熟悉的Linux指令,不是rm -rf *吗
点赞 回复
分享
发布于 2019-03-30 01:03
大佬,问一下,你二面后多久收到的三面通知
点赞 回复
分享
发布于 2019-10-30 09:22
实习面试都这么难.........
点赞 回复
分享
发布于 2020-06-02 11:14
73桶水我想到更好的:三升装满,向7升装水,再装满3升的,3升再向7升装水,此时7升里面有6升水,3升装满再向7升装1升水就可获得2升水了。把思维逆转过来就行了!😄
点赞 回复
分享
发布于 2020-06-02 11:18
二面第八题应该是AC自动机吧
点赞 回复
分享
发布于 2020-06-03 22:04
老哥,你觉得csig这个事业群怎么样
点赞 回复
分享
发布于 2021-04-14 10:39

相关推荐

18 201 评论
分享
牛客网
牛客企业服务