先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
功能:索引,缓存,分库分表。
架构:主从复制,读写分离,负载均衡。
合理SQL:测试,经验
12、SpringBoot整合
-
创建工程环境。
-
配置数据库连接信息。这里使用yml方式。spring: datasource: username: root url: …
-
编写实体类。
-
编写Mapper接口类
13、Redis如何使用?
启动redis 、配置redis的数据库连接、编写redis操作工具类、测试
14、Redis是什么?应用场景?如何实现同步?
非关系型数据库,C编写的, key,value键值对数据库 数据存储在内存中 读写快。
优点:读写快,支持数据持久化,数据结构丰富,
缺点:容易受到物理内存的限制,不能作为海量数据的高性能读写 ,不具备容错和恢复功能。
适应场景在较小的数据量的高性能操作和运算上。
15、ES如何保证数据不丢失
16、SpringBean的生命周期
实例化 Instantiation、属性赋值 Populate、初始化 Initialization、销毁 Destruction
17、Mybatis的一级二级缓存
-
一级缓存默认开启,查询时先从缓存中查询,缓存中没有对应数据时再进行数据库查询。
-
二级缓存即查询缓存,他的作用于是mapper和namespace,二级缓存可以跨SqlSession
18、SpringBoot注解?
@RestController表示该方法的返回结果直接写入HTTP response body中 @RequestMapping 注解 处理请求地址映射
@EnableAutoConfiguration 注解允许 Spring Boot 自动配置注解
@Configuration用于定义配置类
@SpringBootApplication用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。 @ComponentScan 组件扫描。让spring Boot扫描到Configuration类并把它加入到程序上下文。
@ResponseBody
@Component
@AutoWired
@RequestParam用在方法的参数前面:
@PathVariable 路径变量。参数与大括号里的名字一样要相同 @ResponseBody表示该方法的返回结果直接写入HTTP response body 中
@Repository 用于标注数据访问组件,即DAO组件
19、 Spring事务有哪些?
ACID 原子性、一致性、隔离性、持久性
20、 这些事务的特性有哪些?
原子性(要么全部成功要么全部失败,不会结束在中间某个环节)
一致性(执行前和执行后数据库保持在一致性状态)
隔离性(数据所处的状态要么是更改之前的状态要么是更改之后的状态 不会看到中间的状态数据)
持久性(只要事务成功结束,那么数据库的数据就会永久保存下来,即使数据库崩溃 重新启动后数据库还能恢复到事务成功结束的状态)
21、数据库的事务隔离?怎么实现的
不考虑事务的隔离性会出现几种:脏读(在一个事务里读取到领另一个未提交事务的数据)、不可重复读(在一个事务范围内多次查询返回的数据不同的数据, 发生在修改)、幻读( 前后两次读取的数据在第二次查询的时候能查到都第一次看不到的行数据,发生在插入和删除 )
事务的ACID是通过InnoDB的日志和锁来保证的,事务的隔离性通
过数据锁的机制实现的
22、RESTful是一种设计风格而不是规范,比如接口的命名不以动词命名(如findById deleteById等),不同的请求方式代表了相应的动作 比如 /user接口 crud操作只需要更换不同的请求方式即可 一个接口即可搞定 而不需要定义多个接口
23、MySQL常用的存储引擎:
InnoDB、MyISAM、MEMORY、ARCHIVE
MyISAM索引与InnoDB索引的区别?
InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。
23.1、InnoDB引擎的4大特性
插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(ahi)、预读(read ahead)
23.2、引擎的选择?
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择。
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率。
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使 Archive。
24、@ResquestBody 和@ResponseBody的区别?
@ResponseBody注解表示该方法的返回的结果直接写入 HTTP 响应正文中,一般在异步获取数据时使用。通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据(xml 格式或者 json等)封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
在GET请求中,不能使用@RequestBody。在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。
25、为什么使用数据库?三大范式了解吗?
1.存取的速度快,数据永久保存
2.第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
25.1、数据库中为什么要用索引?这么多优点怎么不在每一个表中的列都使用索引呢 ?
1、可以大大加快数据的检索速度,使用索引,提高系统的性能。
2、时间上:在每一列上使用索引耗费时间,在使用时会降低执行效率,
空间上:会占用物理空间
25.2、你在开发的时候用到索引了吗 应用场景是?
数据量的时候查询字段较多的时候
当数据多且字段值有相同的值得时候用普通索引,当字段多且字段值没有重复的时候用唯一索引,当有多个字段名都经常被查询的话用复合索引。
26、rabbitmq 的使用场景有哪些?(你公司生产环境用的那个消息中间件)
好处:异步处理、流量削峰、消息通讯、应用解耦;
缺点:可用性降低、复杂度提高、一致性问题
Rabbit :支持高并发高吞吐、支持集群化、功能较为完善
使用场景:顺序消费、服务间异步通信、定时任务、请求削峰
27、zookeeper的部署模式? 应用场景?
三种 :单机部署,集群部署,伪集群部署。
数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁、分布式队列
28、log4j有什么用?
在开发阶段写下的这些判断仅为了调试的语句,在开发完成时需要查找并移除。部署运行后,尤其是在一些企业应用系统中,还经常需要进一步调试,这时就遇到了更大的麻烦。所以,我们需要一套完备的、灵活的、可配置的日志工具log4J就是优秀的选择。
28.1、Log4j主要由哪三部分组成?每部分的主要作用是什么?
Log4j 由 logger、appender 和 layout 三个组件组成。可以通过同名的 Java 类访问 Log4j 的这三个组件。
Logger 在执行应用程序时,接收日志语句生成的日志请求。它是一种重要的日志处理组件, 可以通过 log4j API 的 logger 类对其进行访问。它的方法有:debug、info、warn、error、fatal 和 log。这些方法用于记录消息。 Appender - 管理日志语句的输出结果。执行日志语句时,Logger 对象将接收来自日志语句的记录请求。此请求是通过 logger 发送至 appender 的。然后,Appender 将输出结果写入到用户选择的目的地。对于不同的日志目的地,提供不同的 appender 类型。这些 appender 包括:用于文件的 file appender、用于数据库的 JDBC appender 和用于 SMTP 服务器的 SMTP appender。 Layout - 用于指定 appender 将日志语句写入日志目的地所采用的格式。appender 可以用来格式化输出结果的各种布局包括:简单布局、模式布局和 HTML 布局。
29、线程池的作用?
线程池作用就是限制系统中执行线程的数量。
1、提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
2、方便管理 可以编写线程池管理代码对池中的线程同一进行管理
3、降低资源消耗
29.1、线程池都有哪几种工作队列
1、ArrayBlockingQueue
是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
2、LinkedBlockingQueue
一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列
3、SynchronousQueue
一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
4、PriorityBlockingQueue
一个具有优先级的无限阻塞队列。
30、Nginx?
Nginx是一个轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡
30.1、为什么要用Nginx?
-
跨平台、配置简单、方向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少,
-
而且Nginx内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
使用Nginx的话还能:
-
节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
-
稳定性高:宕机的概率非常小
-
接收用户请求是异步的
30.2、Nginx的优缺点?
- 优点:
-
占内存小,可实现高并发连接,处理响应快
-
可实现http服务器、虚拟主机、方向代理、负载均衡
-
Nginx配置简单
-
可以不暴露正式的服务器IP地址
- 缺点: 动态处理差:nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,现在一般前端用nginx作为反向代理抗住压力,
30.3、Nginx应用场景?
-
http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
-
虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
-
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
-
nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。
30.4、Nginx 是如何实现高并发的?
异步,非阻塞,使用了epoll 和大量的底层代码优化。
如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。正常情况下,会有很多进程一直在等待中。
而nginx采用一个master进程,多个woker进程的模式。
-
master进程主要负责收集、分发请求。每当一个请求过来时,master就拉起一个worker进程负责处理这个请求。
-
同时master进程也负责监控woker的状态,保证高可靠性
-
woker进程一般设置为跟cpu核心数一致。nginx的woker进程在同一时间可以处理的请求数只受内存限制,可以处理多个请求。
Nginx 的异步非阻塞工作方式正把当中的等待时间利用起来了。在需要等待的时候,这些进程就空闲出来待命了,因此表现为少数几个进程就解决了大量的并发问题。
31、多线程 线程安全 高并发?
https://yq.aliyun.com/articles/659726
https://developer.aliyun.com/article/711990
最后
无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。
针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
veloper.aliyun.com/article/711990]( )
最后
无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。
针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。
[外链图片转存中…(img-0Ori9WJn-1713549621056)]
[外链图片转存中…(img-CUSel7Yb-1713549621056)]
[外链图片转存中…(img-KROX5Geg-1713549621056)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-LIphfY7L-1713549621056)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!