先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
大根堆要求
①根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值。
②为完全二叉树。
注意这是递归定义的。
对于大根小根堆,递归定义,实现,空间复杂度,各种操作的时间复杂度,真实写二叉树的情况和数组模拟的情况都要会。
有人要问了,会这些算法有啥用?其实Java的优先队列就是堆结构。八大排序之一的堆排序也是数组上堆结构,面试官让我手动实现一个,以下是实现。
/*
================================================
功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
注:画画
================================================
*/
/*
功能:建堆
输入:数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始
*/
void sift(int *x, int n, int s)
{
int t, k, j;
t = *(x+s); /暂存开始元素/
k = s; /开始元素下标/
j = 2*k + 1; /左子树元素下标/
while (j<n)
{
if (j<n-1 && *(x+j) < *(x+j+1))/判断是否存在右孩子,并且右孩子比左孩子大,成立,就把j换为右孩子/
{
j++;
}
if (t<*(x+j)) /调整/
{
*(x+k) = *(x+j);
k = j; /调整后,开始元素也随之调整/
j = 2*k + 1;
}
else /没有需要调整了,已经是个堆了,退出循环。/
{
break;
}
}
*(x+k) = t; /开始元素放到它正确位置/
}
/*
功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
注:
-
*
-
-
建堆时,从从后往前第一个非叶子节点开始调整,也就是“-”符号的位置
*/
void heap_sort(int *x, int n)
{
int i, k, t;
//int *p;
for (i=n/2-1; i>=0; i–)
{
sift(x,n,i); /初始建堆/
}
for (k=n-1; k>=1; k–)
{
t = *(x+0); /堆顶放到最后/
*(x+0) = *(x+k);
*(x+k) = t;
sift(x,k,0); /剩下的数再建堆/
}
}
3)排序知道哪些?来介绍介绍?
答:全知道,全会写,然后只说了冒泡的所有思路和优化、和快排BFPRT就被叫停了。我就把所有排序介绍和实现分享给大家。
一面结束,面试小哥表示对我很满意,说马上让另外一个人二面。
二面:
二面小哥说,一面说你算法贼强,咱们这次就不聊算法了,说说项目。
4)看我项目里用了redis,就问redis都有哪些数据结构。
我说有string、list、hash、set、zset。
问:你说的这些Java以及其他语言基本也都有,你说了解redis,那这些数据结构到底是不是快?咋实现的呢?
我举例子说了一下:
- 1) 字符串
redis并未使用传统的c语言字符串表示,它自己构建了一种简单的动态字符串抽象类型。
当需要一个可以被修改的字符串时,redis就会使用自己实现的SDS(simple dynamic string)。比如在redis数据库里,包含字符串的键值对底层都是SDS实现的,不止如此,SDS还被用作缓冲区(buffer):比如AOF模块中的AOF缓冲区以及客户端状态中的输入缓冲区。
下面来具体看一下sds的实现:
-
struct sdshdr
-
{
-
int len;//buf已使用字节数量(保存的字符串长度)
-
int free;//未使用的字节数量
-
char buf[];//用来保存字符串的字节数组
-
};
sds遵循c中字符串以’\0’结尾的惯例,这一字节的空间不算在len之内。
这样的好处是,我们可以直接重用c中的一部分函数。比如printf;
sds相对c的改进
获取长度:c字符串并不记录自身长度,所以获取长度只能遍历一遍字符串,redis直接读取len即可。
缓冲区安全:c字符串容易造成缓冲区溢出,比如:程序员没有分配足够的空间就执行拼接操作。而redis会先检查sds的空间是否满足所需要求,如果不满足会自动扩充。
内存分配:由于c不记录字符串长度,对于包含了n个字符的字符串,底层总是一个长度n+1的数组,每一次长度变化,总是要对这个数组进行一次内存重新分配的操作。因为内存分配涉及复杂算法并且可能需要执行系统调用,所以它通常是比较耗时的操作。
redis内存分配:
1、空间预分配:如果修改后大小小于1MB,程序分配和len大小一样的未使用空间,如果修改后大于1MB,程序分配 1MB的未使用空间。修改长度时检查,够的话就直接使用未使用空间,不用再分配。
2、惰性空间释放:字符串缩短时不需要释放空间,用free记录即可,留作以后使用。
二进制安全
c字符串除了末尾外,不能包含空字符,否则程序读到空字符会误以为是结尾,这就限制了c字符串只能保存文本,二进制文件就不能保存了。
而redis字符串都是二进制安全的,因为有len来记录长度。
这就是redis中string的实现和要点,我大概都给他讲了一遍。然后他说你不用说了,又说到算法数据结构了,咱们聊点别的。
5)聊点实际的吧,你一直在吹redis,知道用redis会给你带来什么问题吗?
我有点懵,就给他说nosql和传动数据库的区别之类的,然后他说你不要给我说这些比较,举个例子,缓存雪崩听说过吗?我就明白他想聊什么了,又给他说了说以下内容。
缓存穿透
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就去后端系统查找(比如DB)。
一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。
如何避免?
1:对查询结果为空的情况也进行缓存,这样,再次访问时,缓存层会直接返回空值。缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
2:对一定不存在的key进行过滤。具体请看布隆过滤器
缓存击穿
是针对缓存中没有但数据库有的数据。
场景是,当Key失效后,假如瞬间突然涌入大量的请求,来请求同一个Key,这些请求不会命中Redis,都会请求到DB,导致数据库压力过大,甚至扛不住,挂掉。
解决办法
1、设置热点Key,自动检测热点Key,将热点Key的过期时间加大或者设置为永不过期,或者设置为逻辑上永不过期
2、加互斥锁。当发现没有命中Redis,去查数据库的时候,在执行更新缓存的操作上加锁,当一个线程访问时,其它线程等待,这个线程访问过后,缓存中的数据会被重建,这样其他线程就可以从缓存中取值。
缓存雪崩
是指大量Key同时失效,对这些Key的请求又会打到DB上,同样会导致数据库压力过大甚至挂掉。
解决办法
1)让Key的失效时间分散开,可以在统一的失效时间上再加一个随机值,或者使用更高级的算法分散失效时间。
2)构建多个redis实例,个别节点挂了还有别的可以用。
3)多级缓存:比如增加本地缓存,减小redis压力。
4)对存储层增加限流措施,当请求超出限制,提供降级服务(一般就是返回错误即可)
他说作为一个学生,知道这些知识就可以了,对我比较满意,说让三面。
三面面试官看样子是某个领导,问的比较随意。
6)输入网址到看到网页的过程
总结
一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。
这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。
最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!
Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
[外链图片转存中…(img-ayg9WV7k-1713578817759)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-FDgHVzGk-1713578817759)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!