先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
在大学期间,Java 语言一般会作为计算机专业类的课程,而且也不少学生会选择 Java 来作为学习编程的主要语言。在学习掌握基础知识之后,通过大量的编程练习题,手写代码,是巩固基础知识,锻炼编程思维的重要手段之一。下面介绍 Java 语言练习实例50例,题目+解题思路 + 解法。
题目:假设一块板上有三根针 A、B、C。A 针上套有 64 个大小不等的圆盘,按照大的在下、小的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动一个圆盘,移动过程可以借助 B 针。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。从键盘输入需移动的圆盘个数,给出移动的过程。
分析:利用递归实现圆盘的整个移动过程;当只移动一个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n>1),则分成几步走:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后一个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。
package com.nobody;
/**
-
@Description
-
@Author Mr.nobody
-
@Date 2021/5/31
-
@Version 1.0
*/
public class Demo {
public static void main(String[] args) {
// 将3个盘子从A移动到C
hanoi(3, ‘A’, ‘B’, ‘C’);
}
/**
-
汉诺塔转移过程
-
@param n 盘子数量
-
@param from 起点柱子
-
@param inter 中转柱子
-
@param to 终点柱子
*/
public static void hanoi(int n, char from, char inter, char to) {
// 只剩一个盘子的时候直接从from移动到to
if (n == 1) {
System.out.println("盘子1从 " + from + " 移动到 " + to);
} else {
// 将最上面的n-1个盘子从起点借助终点移动到中转柱子
hanoi(n - 1, from, to, inter);
// 将当前最大的盘子直接从起点移动终点
System.out.println(“盘子” + n + "从 " + from + " 移动到 " + to);
// 再将刚才n-1个盘子从中转点借助起点移动到终点
hanoi(n - 1, inter, from, to);
}
}
}
演示代码的输出结果如下:
盘子1从 A 移动到 C
盘子2从 A 移动到 B
盘子1从 C 移动到 B
盘子3从 A 移动到 C
盘子1从 B 移动到 A
盘子2从 B 移动到 C
盘子1从 A 移动到 C
题目:斐波那契数列的第1项是0,第2项是1,第3项开始,每一项的值都是前两项之和。例如第3项是第1项和第2项之和,即 0+1=1,第4项是第2项和第3项之和,即 1+1=2。它是这样一个数列 0,1,1,2,3,5,8,13,21,…
分析:因为前2项比较特殊,所以单独处理,从第3项开始,通过前两项之和来求出下一项的值即可。有2种解法实现,一种解法是通过2个变量,不断保存前两项的值,然后求它们之和即可。另一种解法是通过递归算法,从当前项开始,不断递归求算前两项的值,直到第1项和第2项的值,即可回推。
package com.nobody;
/**
-
@Description 递归解法
-
@Author Mr.nobody
-
@Date 2021/5/31
-
@Version 1.0
*/
public class Demo {
public static void main(String[] args) {
// 输出前20个数
int num = 20;
for (int i = 1; i <= num; i++) {
System.out.println(“斐波那契数列第” + i + “项是” + fibonacci(i));
}
}
public static long fibonacci(long number) {
// 第1项和第2项特殊处理,即返回0和1
if (number == 1 || number == 2) {
return number - 1;
} else {
// 排除第1项和第2项,都是前两项的和
return fibonacci(number - 2) + fibonacci(number - 1);
}
}
}
package com.nobody;
/**
-
@Description 非递归解法
-
@Author Mr.nobody
-
@Date 2021/5/31
-
@Version 1.0
*/
public class Demo {
public static void main(String[] args) {
// 输出前20个数
int num = 20;
// 保存前两项的值
int x = 0, y = 1;
// 当前项的值
int curData;
for (int i = 1; i <= num; i++) {
// 第1项和第2项特殊处理,即返回0和1
if (i == 1 || i == 2) {
System.out.println(“斐波那契数列第” + i + “项是” + (i - 1));
} else { // 排除第1项和第2项,都是前两项的和
curData = x + y;
System.out.println(“斐波那契数列第” + i + “项是” + curData);
x = y;
y = curData;
}
}
}
}
演示代码的输出结果如下:
斐波那契数列第1项是0
斐波那契数列第2项是1
斐波那契数列第3项是1
斐波那契数列第4项是2
斐波那契数列第5项是3
斐波那契数列第6项是5
斐波那契数列第7项是8
斐波那契数列第8项是13
斐波那契数列第9项是21
斐波那契数列第10项是34
斐波那契数列第11项是55
斐波那契数列第12项是89
斐波那契数列第13项是144
斐波那契数列第14项是233
斐波那契数列第15项是377
斐波那契数列第16项是610
斐波那契数列第17项是987
斐波那契数列第18项是1597
斐波那契数列第19项是2584
斐波那契数列第20项是4181
题目:输出九九乘法表。
分析:使用两层 for
循环遍历输出九九乘法表。
package com.nobody;
/**
-
@Description 九九乘法表
-
@Author Mr.nobody
-
@Date 2021/5/31
-
@Version 1.0
*/
public class Demo {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + “×” + i + “=” + i * j + “\t”);
}
System.out.println();
}
}
}
演示代码的输出结果如下:
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
题目:将字符串的某一子串替换为另外的字符串。例如将 陈皮的JavaLib
的 Java
子串替换为 C
,则最终变为 陈皮的CLib
。
分析:Java 类库中有许多实用的类,定义了许多通用的方法,可以使用 String 类的 replace 方法。
package com.nobody;
/**
-
@Description
-
@Author Mr.nobody
-
@Date 2021/5/31
-
@Version 1.0
*/
public class Demo {
public static void main(String[] args) {
String str = “我是陈皮,我的公众号【陈皮的JavaLib】”;
System.out.println(“全部替换陈皮
为狗蛋
之后的字符串:” + str.replace(“陈皮”, “狗蛋”));
System.out.println(“全部替换陈皮
为狗蛋
之后的字符串:” + str.replaceAll(“陈皮”, “狗蛋”));
System.out.println(“只替换一个陈皮
为狗蛋
之后的字符串:” + str.replaceFirst(“陈皮”, “狗蛋”));
}
}
演示代码的输出结果如下:
全部替换陈皮
为狗蛋
之后的字符串:我是狗蛋,我的公众号【狗蛋的JavaLib】
全部替换陈皮
为狗蛋
之后的字符串:我是狗蛋,我的公众号【狗蛋的JavaLib】
只替换一个陈皮
为狗蛋
之后的字符串:我是狗蛋,我的公众号【陈皮的JavaLib】
题目:将字符串反转,例如 abcde
反转为 edcba
。
分析:直接调用 StringBuffer
类的 reverse
方法。
package com.nobody;
/**
-
@Description
-
@Author Mr.nobody
-
@Date 2021/5/31
-
@Version 1.0
*/
public class Demo {
public static void main(String[] args) {
String str = “abcde”;
String reverse = new StringBuffer(str).reverse().toString();
System.out.println(str + “反转后:” + reverse);
}
}
演示代码的输出结果如下:
abcde反转后:edcba
题目:打印倒立的三角形,使用 *
号来打印。
分析:倒立的三角形,我们使用一行行往下打印的方法,注意的是每打印一行的时候,需要计算每一行前面需要打印多少个空格。
package com.nobody;
/**
-
@Description 打印倒立的三角形
-
@Author Mr.nobody
-
@Date 2021/5/31
-
@Version 1.0
*/
public class Demo {
public static void main(String[] args) {
// 打印6行的倒立的三角形
for (int i = 1; i <= 6; i++) {
// 打印每一行前的空格,下一行总会比上一行多一个空格
for (int j = 0; j <= i; j++) {
System.out.print(" ");
}
// 打印*
for (int k = 1; k <= 11 - 2 * (i - 1); k++) {
System.out.print(“*”);
}
System.out.println();
}
}
}
演示代码的输出结果如下:
题目:url 地址是有几部分组成的,例如协议,IP,端口,文件名等。请从 URL 中提取出来。
分析:通过 URL
类,里面定义了许多方法,分别用于提取 URL 中相应的信息。
package com.nobody;
import java.net.URL;
/**
-
@Description 解析 URL
-
@Date 2021/5/31
-
@Version 1.0
*/
public class Demo {
public static void main(String[] args) throws Exception {
URL url = new URL(“http://www.nobody.com/html/index.html”);
System.out.println(“URL:” + url.toString());
System.out.println(“协议:” + url.getProtocol());
System.out.println(“主机:” + url.getHost());
System.out.println(“端口号:” + url.getPort());
System.out.println(“文件名:” + url.getFile());
System.out.println(“路径:” + url.getPath());
System.out.println(“默认端口号:” + url.getDefaultPort());
}
}
演示代码的输出结果如下:
URL:http://www.nobody.com/html/index.html
协议:http
主机:www.nobody.com
端口号:-1
文件名:/html/index.html
路径:/html/index.html
默认端口号:80
题目:水仙花数 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,153 = 1^3 + 5^3 + 3^3.
分析:遍历100-999 之间的数,计算每位数字的立方是否等于其本身。
package com.nobody;
/**
-
@Description 水仙花数
-
@Date 2021/5/31
-
@Version 1.0
*/
public class Demo {
public static void main(String[] args) {
int x, y, z;
for (int i = 100; i <= 999; i++) {
x = i % 10;
y = i / 10 % 10;
z = i / 100 % 10;
if (i == (x * x * x + y * y * y + z * z * z)) {
System.out.println(i);
}
}
}
}
演示代码的输出结果如下:
153
370
371
407
题目:杨辉三角的两个腰边的数都是 1,其它位置的数都是上顶上两个数之和。
总目录展示
该笔记共八个节点(由浅入深),分为三大模块。
高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。
一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。
高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。
篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)
由于内容太多,这里只截取部分的内容。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
题目:杨辉三角的两个腰边的数都是 1,其它位置的数都是上顶上两个数之和。
总目录展示
该笔记共八个节点(由浅入深),分为三大模块。
高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。
一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。
高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。
篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)
[外链图片转存中…(img-lJcB0lw8-1713462297109)]
[外链图片转存中…(img-yRZyJXFh-1713462297109)]
由于内容太多,这里只截取部分的内容。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-Ms2VBNrs-1713462297110)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!