Day5 | Java基础 | 5 设计模式、Java 8新特性

问题回答版


设计模式

谈谈你知道的设计模式

学习链接

按照模式的应用目标分类,可以分为三类:

  • 创建型模式:对对象创建过程的各种问题和解决方案的总结。包括各种工厂模式、单例模式、构建器模式、原型模式。
  • 结构型模式:对软件设计结构的总结,关注类、对象继承、组合方式的实践经验。包括桥接模式、适配器模式、装饰者模式、代理模式、组合模式、外观模式、享元模式等。
  • 行为型模式:从类或对象之间交互、职责划分等角度总结的模式。比较常见的行为型模式有策略模式、解释器模式、迭代器模式、模板方法模式、访问者模式。

Spring等框架中使用了哪些模式?

框架使用的设计模式
BeanFactory、ApplicationContext工厂模式
Spring在Bean的创建中单例模式、原型模式等
AOP领域代理模式、装饰器模式、适配器模式等
各种事件监听器观察者模式(典型应用)
类似JdbcTemplate等模板模式

设计模式也不是银弹,要避免滥用或者过度设计。

手撕单例模式。(双检锁单例模式要会默写)

学习链接

单例模式的核心:保证一个类仅创建一个实例,并提供一个访问它的全局访问点。

三个基本要点:1. 这个类只能有一个实例;2. 它必须自行创建这个实例;3. 它必须自行向整个系统提供这个实例。

**为什么需要单例模式?**在一个系统中,一个类经常会被使用在不同的地方。通过单例模式,我们可以避免多次创建多个实例,从而节约系统资源。

一个简单的双检锁单例:

//懒汉模式 + synchronized同步锁 + double-check
public final class Singleton {
	private volatile static Singleton instance = null;//不实例化
	public List<String> list = null;//list属性
	private Singleton(){
		list = new ArrayList<String>();
	}//构造函数
	public static Singleton getInstance(){//加同步锁,通过该函数向整个系统提供实例
		if(null == instance){//第一次判断,当instance为null时,实例化对象,否则直接返回对象
			synchronized (Singleton.class){//同步锁,放在if内,可以减少同步锁资源竞争
				if(null == instance){//第二次判断
					instance = new Singleton();//实例化对象
				}
			}
		}
		return instance;//返回已存在的对象
	}
}

这里需要考虑到 Happens-Before 规则:前一个操作的结果可以被后续的操作获取。这条规则规范了编译器对程序的重排序优化。如果类中有其他的属性也需要实例化,这时,除了实例化单例类本身,还需要对其他属性也进行实例化,这时虚拟机可能发生重排序优化。所以在double-check懒汉单例实现时,使用volatile关键字修饰instance,阻止局部重排序的发生,因为volatile变量的操作指令都不会被重排序。这样就可以保证这个双检索懒汉单例万无一失了。

为什么要加两次判断?只加一次不行吗?

如果只加一次,当多个线程进入到if判断条件里,虽然有同步锁,但是进入到判断条件里面的线程依然会一次获取到锁创建对象,然后再释放同步锁。所以我们还需要在同步锁里面再加一个判断条件。

(也可以通过内部类实现:在Singleton类中创建一个内部类来实现成员变量的初始化,就可以避免多线程下重复创建对象的情况发生,这里先略过)

Java 8 新特性

lambda表达式、方法引用、stream API、Optional类。

lambda有什么好处?应用场景是什么?

Java Lambda 表达式的各种形态和使用场景
Java 中的Lambda 表达式

好处:简化函数式接口。只有一个抽象方法的接口被称为函数式接口。只要接口中只存在一个抽象方法(即使接口包含默认方法和静态方法),这个接口就能用lambda实现。

应用场景

  • 引用类的静态方法
  • 引用lambda参数的方法
  • 引用外部实例方法
  • 引用构造方法

方法引用是什么?有什么好处?应用场景是什么?

方法引用
视频链接

方法引用::通过方法的名字来指向一个方法。

好处:可以使语言的构造更紧凑简洁,减少冗余代码。

应用场景:构造器引用、静态方法引用、特定类的任意对象的方法引用、特定对象的方法引用。

Java中的Stream流知道吗?有哪些功能?

Java 中的流、并行流3小时Java-Stream流从入门到精通
Stream如何提高遍历集合效率?高频使用的两大类 Stream 操作

在 Java8 中,Collection 新增了两个流方法,分别是 Stream() 和 parallelStream()。

Java 的 Stream 使一个能够对其元素进行内部迭代的组件,这意味着它可以自己迭代其元素。

功能

  • 从大的设计方向上来说:将整个操作分解为了链式结构,不仅简化了遍历操作,还为实现并行计算打下了基础。
  • 从小的分类方向上来说:将遍历元素的操作和对元素的计算分为中间操作和终结操作,而中间操作又根据元素之间状态有无干扰分为有状态和无状态操作,实现了链结构中的不同阶段。

stream应用场景是什么?

项目开发中高频使用的 Stream操作

  • 求两个对象集合的并交集
  • 排序对象集合
  • 在 Stream 迭代中实用元素索引
  • 把对象 List 转换为 Map

Optional是什么?应用场景是什么?

Java 中的 Optional
解决空指针问题的优雅之选

null在编程中常常是一个令人头疼的问题,处理不好就会导致NullPointerException(空指针异常)。为了避免空指针异常,代码中就会充斥着繁琐的null检查和条件嵌套。Optional的出现帮我们解决了这个问题。它让我们可以更安全、优雅地处理可能为空的值。

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值