三面“有赞”Java岗斩获offer:Spring+JVM+并发锁+分布式+算法

简介: 年末离职,年初为面试也筹备挺长一段时间,找了不少复习资料,刷了很多题在网上投了很多简历最终面试了有赞,还有幸拿到offer!

年末离职,年初为面试也筹备挺长一段时间,找了不少复习资料,刷了很多题在网上投了很多简历最终面试了有赞,还有幸拿到offer!

本人两年Java开发,本科毕业,计算机专业,勤学好问、积极上进!!!!(对自己能力还是比较认可的)

有赞:问得非常细节

一面:

1 Java并发技术了解吗,说了线程,juc的线程池,并发容器,阻塞队列,原子数据类型等。

2 问我原子数据类型怎么实现,cas

3 线程池有哪些参数,阻塞队列用的是普通队列么,答不是,是blockingqueue

4 concurrenthashmap和hashmap的区别,chm的实现原理,你在什么场景下用到chm,为什么,我说了多线程查询数据,put可能覆盖,或者hashmap的扩容可能产生死链

5 还用过哪些数据结构,list,set,map,stack和queue。

6 Spring了解么,问我了解五大组件不,不了解,说了ioc和aop。然后问我分别怎么实现的,使用xml和注解配置实现类有什么区别,怎么解析它们的数据。

7 Spring如何动态地加载一个bean到bean容器中,不是通过配置文件配置的,不会。

8 Spring aop的实现原理,如何加一层动态代理的,我说是创建bean过程中直接生成代理类的实例

9 Spring的spring quartz知道么,必须不知道

10 spring源码看过么,mvc了解么,说了一下mvc的原理和请求过程

11 hibernate和mybatis的源码看过么,没有

12 如何实现不同环境中配置文件的自动切换,使用脚本或者命令,他说使用hibernate的注解可以实现切换。

13 nio和io的区别,nio是阻塞轮询的,如何改用异步通知的机制,我说使用aio注册异步回调函数。

14 nio的包装框架了解么,我说netty,看得深入么,我说没有深入看。

15 分布式服务dubbo了解么,有哪些功能,如何自己实现一个dubbo,我分别从rpc和微服务的角度说了一下。问我有哪些序列化方式。

16 mysql问了几个简单问题。

17 对我们公司了解么,只是稍微了解。

二面:

1 项目

2 Java的内存模型,堆和栈分别存什么

3 Java的深拷贝和浅拷贝

4 Spring的aop怎么实现的,动态代理的原理是什么

5 Spring MVC的请求过程。

6 跳出Spring,说一下浏览器的请求过程

7 网络编程这一块,你了解哪些,说了socket和nio

8 nio的底层实现一般是epoll,讲一下epoll吧。

9 mysql的索引说一下,二级索引是怎么进行查找的

10 MySQL的两个引擎区别

11 hibernate的orm是怎么实现的,我说的是xml和注解的解析,以及jdbc封装

12 hibernate的事务如何实现,我说是jdbc的事务实现。

13 分布式数据库查询一个表的前十条数据,对id进行hash来索引节点,如何进行查询。我说那就对id hash,找到节点分别查询。

14 分布式系统的概念,如果有数据一致性怎么办,答cap和base

15 了解哪些分布式技术,说了缓存,负载均衡,消息队列,Hadoop

16 负载均衡的衡量指标,不知道

17 消息队列了解哪个,rabbitmq和kafka,为什么kafka比rm快,答了零拷贝,具体实现原理答错了,应该是避免复制数据到应用缓冲,直接使用sendfile传输数据。

18 hadoop了解哪些,hdfs的文件读写机制说一下。

19 没什么问题了

20 需要来现场面试,其实我不想去现场面,然后隔天给我发了拒信

三面:

1 自我介绍和项目

2 Java的内存分区

3 Java对象的回收方式,回收算法。

4 CMS和G1了解么,CMS解决什么问题,说一下回收的过程。

5 CMS回收停顿了几次,为什么要停顿两次。

6 Java栈什么时候会发生内存溢出,Java堆呢,说一种场景,我说集合类持有对象。

7 那集合类如何解决这个问题呢,我说用软引用和弱引用,那你讲一下这两个引用的区别吧。

8 Java里的锁了解哪些,说了Lock和synchronized

9 它们的使用方式和实现原理有什么区别呢,使用的话,synchronize用于方法和代码块,可以锁对象和类以及方法,Lock一般锁一块代码。并且Lock可以搭配condition使用。

实现原理的话,synchronized使用底层的mutex锁,需要系统调用,而Lock则使用AQS实现。

10 synchronized锁升级的过程,说了偏向锁到轻量级锁再到重量级锁,然后问我它们分别是怎么实现的,解决的是哪些问题,什么时候会发生锁升级。

11Tomcat了解么。说一下类加载器结构吧,我说不知道,说了些别的。

12 问我会什么框架,说了Spring,问我Spring中如何让A和B两个bean按顺序加载,我说依赖关系,他问怎么实现,然后说要用dependon注解,我说不了解。

13 beanfactory和applicationcontext是什么关系,使用有什么区别。

14 MySQL的sql优化了解么,答了解索引优化。

15 他问我如何做一条sql的优化,说了慢日志和explain。

16 MySQL集群的主从复制怎么做的,具体有哪些线程做哪些事情,使用了哪些日志。

17 CAP定理说一下,为什么三者只能选二,为什么分区容忍性必须保证。

18 平时了解哪些技术是牺牲了一致性来保证可用性的,我说消息队列,他问我MySQL是不是,我说MySQL主从复制应该是。

19 工作中CAP的A和P是怎么选择的,我说选P吧,他的意思是选A。

20 算法题:

一:10亿个数去重,我说用hash分片做,他说可能不均匀,然后我说了bitmap,他说那数字量更多怎么办,我说那就两个bitmap把。他说下一题吧。

二:十亿个数找前10个最大的,小顶堆过一遍即可。他说如果要提高效率呢,我说可以分片做堆排序再进行归并即可。他说OK。

分享一波我的复习宝典

Step1:准备一份优秀的简历

想要拿到阿里Offer,那么首先得要有面试阿里的机会,想要得到大厂面试机会并不是一件容易的事情,而简历,是撬开面试大门的钥匙,钥匙是否匹配,就要看简历是否优秀了。很多应届生不知道怎么制作自己的简历,随便在网上下载一份,改改个人信息。实际上,大厂面试的简历,看重的不是你的个人爱好,也不是在校参加过什么社团学生会,更注重的还是你的个人实际能力。所以,一份优秀的简历,应该包括你个人掌握的技术点,是否有实习经历,参加过什么项目,解决过什么项目难题等等。

Step2:提示自身的软实力(知识和技术)

第二个关键就要自己的自身实力过硬了,无论是你应届生,还是工作好几年,无论是校招还是社招,企业招聘的永远是自身实力过硬的,也就是你的知识储备,你的技术水平要达到要求,而提升自身软实力的唯一办法就是:不断学习。

以下我会分享一些我个人的学习文档,有需要的朋友自行选择获取:

资料获取方式:可以点击此处来获取就可以了!

  • Java核心知识整理

啃完283页的pdf文档(美团资深架构师整理)

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

Java核心知识

  • Spring全家桶(实战系列)

  • 其他电子书资料

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

写在最后

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。

以上学习资料均免费放送,最后祝愿各位身体健康,顺利拿到心仪的offer!

资料获取方式:可以点击此处来获取就可以了!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
641 0
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
1461 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
11月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
存储 架构师 安全
深入理解Java锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁(图解+史上最全)
锁状态bits1bit是否是偏向锁2bit锁标志位无锁状态对象的hashCode001偏向锁线程ID101轻量级锁指向栈中锁记录的指针000重量级锁指向互斥量的指针010尼恩提示,讲完 如减少锁粒度、锁粗化、关闭偏向锁(-XX:-UseBiasedLocking)等优化手段 , 可以得到 120分了。如减少锁粒度、锁粗化、关闭偏向锁(-XX:-UseBiasedLocking)等‌。JVM锁的膨胀、锁的内存结构变化相关的面试题,是非常常见的面试题。也是核心面试题。
深入理解Java锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁(图解+史上最全)
Java 中锁的主要类型
【10月更文挑战第10天】
488 59
|
缓存 Java
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
本文介绍了几种常见的锁机制,包括公平锁与非公平锁、可重入锁与不可重入锁、自旋锁以及读写锁和互斥锁。公平锁按申请顺序分配锁,而非公平锁允许插队。可重入锁允许线程多次获取同一锁,避免死锁。自旋锁通过循环尝试获取锁,减少上下文切换开销。读写锁区分读锁和写锁,提高并发性能。文章还提供了相关代码示例,帮助理解这些锁的实现和使用场景。
634 4
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
|
NoSQL Java Redis
秒杀抢购场景下实战JVM级别锁与分布式锁
在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极高的要求。特别是在秒杀开始的瞬间,系统需要处理海量的并发请求,同时确保数据的准确性和一致性。 为了解决这些问题,系统开发者们引入了锁机制。锁机制是一种用于控制对共享资源的并发访问的技术,它能够确保在同一时间只有一个进程或线程能够操作某个资源,从而避免数据不一致或冲突。在秒杀抢购场景下,锁机制显得尤为重要,它能够保证商品库存的扣减操作是原子性的,避免出现超卖或数据不一致的情况。
517 10
|
Java 开发者
Java 中的锁是什么意思,有哪些分类?
在Java多线程编程中,锁用于控制多个线程对共享资源的访问,确保数据一致性和正确性。本文探讨锁的概念、作用及分类,包括乐观锁与悲观锁、自旋锁与适应性自旋锁、公平锁与非公平锁、可重入锁和读写锁,同时提供使用锁时的注意事项,帮助开发者提高程序性能和稳定性。
888 3