多线程学习笔记02Lamda表达式与静态代理,前端面试必问的HashMap

19 阅读4分钟

ajax

1)ajax请求的原理/ 手写一个ajax请求? 2)readyState? 3)ajax异步与同步的区别? 4)ajax传递中文用什么方法?

ajax.PNG

前12.PNG

开源分享:docs.qq.com/doc/DSmRnRG…

理解Functional Interface (函数式接口)是学习Java8 lambda表达式的关键所在。

函数式接口的定义:

  • 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。

public interface Runnable{

public abstract void run();

}

  • 对于函数式接口,我们可以通过lambda表达式来创建该接口的对象。

推导lambda表达式:

/*

推导lambda表达式

*/

public class TestLambda1 {

//3.静态内部类

static class Like2 implements ILike {

@Override

public void lambda() {

System.out.println("i like lambda2==>静态内部类");

}

}

public static void main(String[] args) {

ILike like = new Like();

like.lambda();

like = new Like2();

like.lambda();

//4.局部内部类

class Like3 implements ILike {

@Override

public void lambda() {

System.out.println("i like lambda3==>局部内部类");

}

}

like = new Like3();

like.lambda();

//5.匿名内部类,没有类的名称,必须借助接口或父类

like = new ILike() {

@Override

public void lambda() {

System.out.println("i like lambda5==>匿名内部类");

}

};

like.lambda();

//6.用lambda简化

like = () -> {

System.out.println("i like lambda4==>用lambda简化");

};

like.lambda();

}

}

//1.定义一个函数式接口

interface ILike {

void lambda();

}

//2.实现类

class Like implements ILike {

@Override

public void lambda() {

System.out.println("i like lambda");

}

}

在这里插入图片描述

用静态内部类、局部内部类、匿名内部类实现的语句用lambda简化为like = () -> { System.out.println("i like lambda4==>用lambda简化"); };

静态内部类、局部内部类、匿名内部类可见文章《Java基础09面向对象之内部类(学习笔记 专题补充 深化理解)(非原创)》

Lambda简化:

public class TestLambda2 {

public static void main(String[] args) {

//1.lambda表示简化

ILove love = (int a) -> {

System.out.println("i love you-->" + a);

};

//简化1.参数类型

love = (a) -> {

System.out.println("i love you-->" + a);

};

//简化2.简化括号

love = a -> {

System.out.println("i love you-->" + a);

};

//简化3.简化花括号

love = a -> System.out.println("i love you-->" + a);

love.love(520);

}

}

interface ILove {

void love(int a);

}

几种简化均可正常运行

在这里插入图片描述

小结:

  • lambda表达式在只有一行代码的情况下才能简化为一行,如有多行代码,需用代码块包裹
  • 前提是接口为函数式接口(接口里只有一个方法)
  • 多个参数也可以去掉参数类型,要去掉就都去掉,多个参数必须加括号

静态代理

静态代理模式:

案例一:婚庆公司

//静态代理模式

public class staticProxy {

public static void main(String[] args) {

WeddingCompany weddingCompany = new WeddingCompany(new You());

weddingCompany.HappyMarry();

}

}

interface Marry {

void HappyMarry();

}

//真实角色

class You implements Marry {

@Override

public void HappyMarry() {

System.out.println("结婚");

}

}

//代理角色

class WeddingCompany implements Marry {

//代理谁 真实目标角色

private Marry target;

public WeddingCompany(Marry target) {

this.target = target;

}

@Override

public void HappyMarry() {

before();

this.target.HappyMarry();//这就是真实对象

after();

}

private void after() {

System.out.println("结婚之后收尾款");

}

private void before() {

System.out.println("结婚之前布置现场");

}

}

在这里插入图片描述

小结:

  • 真实对象和代理对象都要实现同一个接口
  • 代理对象要代理真实角色

好处:

  • 代理对象可以做很多真实对象做不了的事情
  • 真实对象专注做自己的事情

案例二:电影院

案例来源:《JAVA静态代理和动态代理理解》作者:周有才

电影是电影公司委托给影院进行播放的,但是影院可以在播放电影的时候,产生一些自己的经济收益,比如卖爆米花、可乐等,然后在影片开始结束时播放一些广告。

现在用代码来进行模拟。

首先得有一个接口,通用的接口是代理模式实现的基础。这个接口我们命名为 Movie,代表电影播放的能力。

public interface Movie {

void play();

}

然后,我们要有一个真正的实现这个 Movie 接口的类,和一个只是实现接口的代理类。

算法

  1. 冒泡排序

  2. 选择排序

  3. 快速排序

  4. 二叉树查找: 最大值、最小值、固定值

  5. 二叉树遍历

  6. 二叉树的最大深度

  7. 给予链表中的任一节点,把它删除掉

  8. 链表倒叙

  9. 如何判断一个单链表有环

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】