Java后端面试题

腾讯2010届春招面试题:

一面:

    1.自我介绍

    2.介绍项目

    3.HashMap原理

    4.Hash的碰撞解决办法(数据结构)

开放地址法、rehash(再hash法)、链地址法

   5.StringBuilder和StringBuffer的区别

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

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

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

Syschronized锁
我不记得Java哪个版本进行了锁升级,建议看看升级后的锁,包括偏向锁、轻量级锁、重量级锁。当线程获取锁的
时候首先使用CAS获取到偏向锁,如果有第二个线程竞争相同的锁的话,这个时候锁就会升级为轻量级锁,轻量级
锁是这样的,即只允许一个线程拥有锁,其他线程自旋获取锁,如果在一定的时间内自旋没有获取到锁的话,锁再
次升级为重量级锁,这个时候没有拿到锁的线程不会自旋,会直接放到同步队列中等待线程释放锁。

7.CurrentHashMap原理

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

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

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

9.说说Lock

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

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

 11.说说list下面的ArrayList和LinkedList的区别

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

ArrayList插入在尾部插入时间复杂度为O(1),只有与当ArrayList插入数据的时候需要扩容的,插入的效率才比LinkedList慢

 12.讲讲线程、线程池

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

 13.说说线程池创建的参数

1.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:keep_Alive
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不仅支持表锁还支持行锁!!!

InnoDB:(1)缓存索引+表数据
       (2)支持事务和主外键
       (3)锁支持行级别,页级锁
       (4)不支持全文索引
       (5)采用聚集索引(叶子节点就是数据)

MyIsam: (1)只缓存索引
        (2)不支持事务
        (3)锁粒度是表级
        (4)支持全文索引
        (5)采用非聚集索引(叶节点存储的是索引指向一个区域的数据)

23.索引的底层

索引的底层是B+树数据结构。原因是:B+树数据结构是一个多路平衡树,所有的数据都存储在叶子节点,叶子节点
之间用指针连接着。索引本身很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上,索
引组织结构要尽量减少查找过程中磁盘的I/O存储次数。

24.Linux命令,你熟悉的有哪些?

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

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

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

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

27.永久代会变吗?

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

28.GC策略说说

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

29.JVM内存模型

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

30.HashMap put操作的最差情况的解决方案

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

最差的情况是在一个位置插入很多元素,链表长度边长,当长度超过8的时候,JDK1.8就会用红黑树代替链表。

31.说说TreeMap的实现原理

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

32.还有什么问题?

二面

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是单线程还是多线程?

单线程!!!!Memcache使用多线程

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协议原理

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、有没有更快的算法?

用多个桶的话,先装满3个3升桶,然后用3升桶的水倒满7升桶,就剩下两升了

29、你还有什么问题?

转自:  https://blog.csdn.net/qq_40910541/article/details/88735255

今日头条面试题:

一面:

1、自我介绍

2、手撕代码:找出数组中只出现一次的那个数,其他都是出现两次;(异或)

3、手撕代码:接着上面,如果数组中有两个数只出现一次呢?

4、悲观锁和乐观锁

5、讲讲你知道的锁

6、ReentrantLock实现原理

7、接着上面,讲到AQS.

8、讲讲AQS怎么实现Fair和NoFair

9、ssh是什么原理?(RSAd非对称加密,生成一个公钥和一个私钥)

10、项目中用到了redis,讲讲你项目中用到了redis的哪些特性;

11、redis的单进程单线程模型;

12、延伸到IO多路复用;

13、一路延伸到epoll、poll、select(主要讲了三者使用的数据结构区别以及各自的特点);

14、手撕代码:BST中任意两个节点差的最小值。

15、序列化

16、项目中zookeeper怎么保证数据一致性的。

 

 

 

阿里面试题:

数据库:

(1)Mybatis与Hibernate的区别

(2)数据库事务的隔离级别

(3)数据库的乐观锁和悲观锁

(4)那我假设有一张用户表,正常的表只能存放大概一千万或者两千万左右的数据。但是阿里巴巴有上亿的用户?你会怎么存储?(分库分表)

Linux:

 

 

 

经典问题:

(1)如何将UDP变成TCP

(2)解释一下Spring IOC

IOC就是依赖控制转化,利用JAVA的反射机制,将实例的初始化交给Spring。Spring就可以通过配置文件管理实例。

(3)接着上面一问,那我们可以直接用工厂模式呀。工厂模式也可以管理实例的初始化,为什么一定要使用Spring呢?

其实本质上还是因为IOC是通过反射机制来实现的。当我们的需求出现变动的时,工厂模式就会需要进行相应的变化。但是IOC的反射机制允许我们不重新编译代码,
因为它的对象都是动态生成的。

 

 

 

你可能感兴趣的:(面试题)