先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
上面的代码中,为什么可以直接在 reduce 方法中传入 Integer::sum 这个方法引用呢?这是因为 reduce 方法的入参就是 BinaryOperator 的函数式接口。
Optional reduce(BinaryOperator accumulator);
BinaryOperator
是继承自 BiFunction
,定义如下:
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
default BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t, U u) -> after.apply(apply(t, u));
}
}
可以看到,只要是符合R apply(T t, U u)
; 的方法引用,都可以传入 reduce 中。可以是上面代码中的 Integer::sum
,也可以是 Integer::max
。
字节码
首先写 2 个 Lambda 方法:
public class LambdaMain {
public static void main(String[] args) {
new Thread(() -> System.out.println(“1”)).start();
IntStream.range(0, 5).boxed().filter(i -> i < 3).map(i -> i + “”).collect(Collectors.toList());
}
}
之后 javac LambdaMain.java
编译成字节码文件,再通过javap -p LambdaMain
输出 class 文件的所有类和成员,得到输出结果:
Compiled from “LambdaMain.java”
public class test.jdk.LambdaMain {
public test.jdk.LambdaMain();
public static void main(java.lang.String[]);
private static java.lang.String lambda$main$2(java.lang.Integer);
private static boolean lambda$main$1(java.lang.Integer);
private static void lambda$main$0();
}
输出的 void lambda$main$0()
对应的是() -> System.out.println("1")
输出的 boolean lambda$main$1(java.lang.Integer)
对应的是i -> i < 3
输出的 java.lang.String lambda$main$2(java.lang.Integer)
对应的是 i -> i + ""
我们可以看出 Lambda 表达式在 Java 8 中首先会生成一个 私有的静态函数
。
为什么不使用匿名内部类?
如果要在 Java 语言中实现 lambda 表达式,生成匿名内部类就可以轻松实现。但是 JDK 为什么没有这么实现呢?这是因为匿名内部类有一些缺点。
每个匿名内部类都会在 编译时 创建一个对应的 class 文件 ,在 运行时 不可避免的会有加载、验证、准备、解析、初始化等 类加载 过程。
每次调用都会创建一个这个 匿名内部类 class 的实例对象 ,无论是有状态的(使用到了外部的变量)还是无状态(没有使用外部变量)的内部类。
invokedynamic
本来要写文字的,但是俺发现俺总结的思维导图还挺清晰的,直接提出来吧,囧。
详情见 Class LambdaMetafactory 官方文档 ,java.lang.invoke.LambdaMetafactory#metafactory 的实现。
public static CallSite metafactory(MethodHandles.Lookup caller,
String invokedName,
MethodType invokedType,
MethodType samMethodType,
MethodHandle implMethod,
MethodType instantiatedMethodType)
throws LambdaConversionException {
AbstractValidatingLambdaMetafactory mf;
mf = new InnerClassLambdaMetafactory(caller, invokedType,
invokedName, samMethodType,
implMethod, instantiatedMethodType,
false, EMPTY_CLASS_ARRAY, EMPTY_MT_ARRAY);
mf.validateMetafactoryArgs();
return mf.buildCallSite();
}
其主要的概念有如下几个:
-
nvokedynamic 字节码指令:运行时 JVM 第一次到某个地方的这个指令的时候会进行 linkage,会调用用户指定的 Bootstrap Method 来决定要执行什么方法,之后便不需要这个步骤。
-
Bootstrap Method: 用户可以自己编写的方法,最终需要返回一个 CallSite 对象。
-
CallSite: 保存 MethodHandle 的容器,里面有一个 target MethodHandle。
MethodHandle: 真正要执行的方法的指针。
测试一下 Lambda 函数生成的字节码,为了方便起见,java 代码改成如下:
public class LambdaMain {
public static void main(String[] args) {
new Thread(() -> System.out.println(“1”)).start();
}
}
先编译成 class 文件,之后再反汇编javap -c -p LambdaMain
看下输出:
Compiled from “LambdaMain.java”
public class test.jdk.LambdaMain {
public test.jdk.LambdaMain();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object.“”😦)V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/lang/Thread
3: dup
4: invokedynamic #3, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;
9: invokespecial #4 // Method java/lang/Thread.“”:(Ljava/lang/Runnable;)V
12: invokevirtual #5 // Method java/lang/Thread.start:()V
15: return
private static void lambda$main$0();
Code:
0: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #7 // String 1
技术学习总结
学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。
最后面试分享
大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-1713604904404)]
[外链图片转存中…(img-JbuOAoU5-1713604904404)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-7pYyMgej-1713604904405)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!