-
说说List,Set,Map三者的区别?
List(用于顺序):List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象。 Set(注重独一无二的性质):不允许重复的集合,不会有多个元素引用相同的对象。 Map(用Key来搜索):使用键值对存储,Map会维护与Key有关联的值。俩个Key可以引用相同的对象,但Key不能重复。典型的Key是String类型,但也可以是任意的对象。
-
类的生命周期?
类的生命周期包括几个部分:加载、连接、初始化、使用和卸载,其中前三部是类的加载过程。 加载,查找并加载类的二进制数据,在java堆中也创建一个java.lang.class类的对象。 连接,连接又包含三块内容:验证、准备、初始化。1)验证,文件格式、元数据、字节码、符号引用验证;2)准备,为类的静态变量分配内存,并将初始化为默认值;3)解析,把类中的符号引用转换为直接引用。 初始化:为类的静态变量赋予正确的初始值 使用,new出的对象程序中使用 卸载,执行垃圾回收
-
有哪些垃圾收集算法?
GC最基础的算法有三种:标记-清除算法、复制算法、标记-压缩算法,我们常用的垃圾回收器一般都采用分代收集算法 标记-清除算法:“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。 复制算法:“复制”的收集算法,它将可用内存按容量划为大小相等的两块,每次只能使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另一块上面。然后再把已经使用过的内存空间一次清理掉。 标记-压缩算法 分代收集算法。。
-
产生死锁的四个必要条件?
互斥条件:一个资源每次只能被一个线程使用 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放 不剥夺条件:进程已经获得的资源,在未使用完成之前,不能强行剥夺 循环等待条件:诺干个线程之间形成一种头尾相接的循环等待资源关系
-
如何避免死锁?
指定获取锁的顺序? 比如某个线程只有获得A锁或B锁才能对资源进行操作,多线程条件下,获得锁的顺序是一定的,可以规定,只有获得A锁的线程才有资格获取B锁,按顺序获取锁就可以避免死锁。
-
为什么重写equals必须重写hashCode?
如果重写equals不重写hashCode它与散列集合无法正常工作。 会引起与散列集合(HashMap、HashSet、HashTable、ConcurrentHashMap)的冲突
设计模式复习巩固
-
说说什么是单例模式?
答:单例模式是一种常用的软件设计模式,在这个模式中,单例模式对象的类必须保证只有一个实例存在。 优点:不会频繁的创建和销毁对象,这样可以节省系统的资源。 几种单例模式的写法: 饿汉式:线程安全 懒汉式:非线程安全 双重检查锁:线程安全
package Singleton; /* * @Author: jun * @Date:2023/2/19 15:31 * @概述: */ /** * 饿汉式 * 1.类加载时就初始化,比较浪费内存,不能够延迟加载 * 2.基于classloader机制避免多线程的同步问题,线程安全 * 3.无需上锁,调用效率高 */ public class SingletonByHunger { //私有实例,类初始化就加载 private static SingletonByHunger instance = new SingletonByHunger(); //私有构造方法 private SingletonByHunger(){}; //公共和静态的获取实例方法 public static SingletonByHunger getInstance() { return instance; } }
package Singleton; /* * @Author: jun * @Date:2023/2/19 15:47 * @概述: */ /** * 懒汉式 * 此方法线程不安全,但可实现延迟加载 */ public class SingletonByLazy { //私有化实例,初始化时不加载,即延迟加载 private static SingletonByLazy instance; //私有构造方法 private SingletonByLazy(){}; //公共获取实例方法(线程不安全),这里没有上锁 public static SingletonByLazy getInstance() { if (instance == null){ instance = new SingletonByLazy(); } return instance; } }
package Singleton; /* * @Author: jun * @Date:2023/2/19 15:52 * @概述: */ /** * 懒汉模式 * 通过关键字synchronized声明公共的获取实例的方法getInstance(),可以确保线程安全,能做到延迟加载,缺点是效率低 */ public class SingletonByLazyAndLock { //私有化实例,初始化时不加载 private static SingletonByLazyAndLock instance; //私有构造方法 private SingletonByLazyAndLock(){}; //公共获取实例方法(线程安全,调用效率低) public synchronized static SingletonByLazyAndLock getInstance() { if (instance == null){ instance = new SingletonByLazyAndLock(); } return instance; } }
package Singleton; /* * @Author: jun * @Date:2023/2/19 16:03 * @概述: */ /** * 双重检查锁 * 双重判断检查,延迟加载 * 线程安全 * 要求是jdk1.5+ */ public class SingletonByDoubleCheckLock { //私有实例,volatile关键字,禁止指令重排 private volatile static SingletonByDoubleCheckLock instance; //私有构造 private SingletonByDoubleCheckLock(){}; //公共获取实例方法(线程安全) public static SingletonByDoubleCheckLock getInstance() { if (instance == null){//第一次检查,加锁之前判断是否为空,可以确保instance不为空的情况下,不加锁直接返回实例 synchronized (SingletonByDoubleCheckLock.class){ if (instance == null){//第二次检查 instance = new SingletonByDoubleCheckLock(); } } } return instance; } }
代码转载自:https://blog.csdn.net/qq_41863849/article/details/106299726
-
说说你对代理模式的理解?
代理模式是给某一个对象提供一个对象,并由代理对象控制对原对象的引用 优点: 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度 可以灵活的隐藏被代理对象的部分功能和服务,也增加了额外的功能和服务 缺点: 由于使用了代理模式,因此程序的性能没有直接调用性能高 使用代理模式提高了代码的复杂度
-
说说工厂模式。
简单工厂模式又叫静态工厂方法模式,就是建立一个工厂类,对实现了同一个结构的一些类进行实例的创建。比如,一台咖啡机就可以理解为一个工厂模式,你只需要按下想喝咖啡品类的按钮,它就会给你生产一杯相应的咖啡,你不需要管它内部的具体实现,只需要告诉它你的需求就可以。 优点: 1.工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品,简单工厂模式通过这种方式实现了对责任分割,它提供了专门的工厂类用于创建对象。 2.客户端无须知道所创建的具体产品类和类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。 缺点: 1.不易扩展 2.较为复杂,不易维护
-
抽象工厂模式
抽象工厂模式是在简单工厂的基础上将未来可能需要修改的代码抽象出来,通过继承的方式让子类去做决定。
-
说一下使用Spring的优势?
Spring通过DI、AOP和消除样板代码来简化企业级Java开发 Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它将Spring扩展到不同的邻域,如Web服务,REST,移动开发以及NoSQL 独立于各种应用服务器,基于Spring框架的使用,可以真正实现WriteOnce,Run AnyWhere SpringIoc容器降低了业务对象替换的复杂性,提高了组件之间的解耦 Spring高度开放,
-
Spring是如何简化开发的?
基于POJO的轻量级和最小侵入性编程 通过依赖注入和面向接口实现松耦合 基于切面和惯例进行声明式编程 通过切面和模板减少样板式代码
-
Spring、SpringMVC、SpringBoot的区别。
Spring和SpringMVC: 1.spring是一个一站式的轻量级java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的web层,业务层、持久层都提供了多种配置解决方案 2.SpringMVC是Spring基础之上的一个MVC框架,主要是处理web开发的路径映射和视图渲染,属于Spring框架中WEB层开发的一部分 SpringMVC和SpringBoot: 1.SpringMVC属于一个企业级WEB开发的MVC框架,涵盖面包括前端视图开发,文件配置,后台接口逻辑开发,XML、config等配置文件相对比SpringBoot更加繁琐。 2.SpringBoot框架相对于SpringMVC框架来说,更专注于开发微服务后台接口,不开发前端视图,相比于SpringMVC,配置更加简化