Java高级面试题积累(二)

简述23种设计

  1. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  2. 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
  3. 桥梁模式(Bridge):将抽象部分与他的实现部分分离,使他们都可以独立的变化。
  4. 建造模式(Builder):将一个复杂对象的构建与他的标表示分离,使同样的构建过程可以创建不同的表示。
  5. 责任链模式(Chain of Responsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有几乎处理这个请求。将这些对象连成一条链,并沿着这条链传递给请求,知道有一个对象处理他。
  6. 命令模式(Command):将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排列或记录请求日志,以及支持可取消的操作。
  7. 合成模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
  8. 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,他能生成子类的方式更为灵活。
  9. 门面模式(Facade):为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容器使用。
  10. 工厂方法(Factory Mehtod):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
  11. 享元模式(Flyweight):运用共享技术以有效地支持大量细粒度的对象。
  12. 解释器模式(Interpreter):给定一个语言,定义他的语法的一种表示,并定义一个解释器,该解释器使用该表示解释语言中的句子。
  13. 迭代子模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。
  14. 调停者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的内部表示。
  15. 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
  16. 观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动刷新。
  17. 原始模型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这个原型创建新的对象。
  18. 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。
  19. 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问他的全局访问点。
  20. 状态模式(State):允许一个对象在其内部状态改变时改变他的行为。对象看起来似乎修改了他所属的类。
  21. 策略模式(Strategy):定义一系列的算法,把他们一个个封装起来,并且使他们可相互替换。本模式使得算法的变化可独立使用他的客户。
  22. 模板模式(Template Mehtod):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  23. 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的做。该模式可以实现在不改变各元素的类的前提下定义作用于这些元素的新操作。

结合项目说一下设计模式

模板方法模式结合实例说的话,在提交订单的抽象类,将提交订单固定的方法实现例如,检查购物车,支付方式,检查用户地址,生成发票等方法。
由于会根据订单类型不同(例如web端订单,ios端订单,andorid端订单等)而具体实现不同所以具体的提交订单用抽象方法定义让具体子类来实现提交订单方法。
工厂模式在做电商系统时由于根据订单类型创建的订单实例不同。
所以运用了工厂模式,通过订单类型获取对应订单实例。
策略模式之前做电商系统时候有规则引擎,通过不同的算法规则来执行不同的策略。
观察者模式定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新
被观察者拥有所有的观察者实例,当被观察者状态变更时循环所有观察者来通知变更。
常用语事件监听中。
适配器模式是把一个类的接口变成客户端所期待的另一种接口。分为类适配器和对象适配器。
类适配器实现通过继承部分实现的实现类来实现需要适配的接口。
对象适配器是通过实现类中包含部分实现的实现类实体来实现需要适配的接口。
当想适用积存的类,但接口不符合需求时可以选择适配器模式。
单例模式spring容器就是一个典型的单例模式,实现的话就是定义static final 变量指向实例,并且私有化构造函数,
提供public方法来提供实例,确保该类只有一个实例。

gc的算法了解吗

gc的基本算法有引用计数,复制,编辑-清扫,编辑-压缩,分代等。
引用计数: 通过为每一个对象添加一个计数器,通过计数器记录该对象的活跃引用数量。
若计数器为0就说明这个对象没有被任何变量引用,gc就可以进行垃圾收集。
复制:是把内存空间划分为2个相等的区域,每次只使用一个区域。垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另外一个区域。
编辑-清扫:第一阶段遍历所有的引用,将有活的对象进行标记,第二阶段对堆进行遍历,把未标记的对象进行清除。但是需要暂停整个应用、并且会产生内存碎片。
标记-压缩:第一阶段标记活的对象,第二阶段把未标记的对象压缩并按顺序放入堆中的某一块中。
分代:基于对象生命周期分析得出的垃圾回收算法,把对象分为年轻代、年老代、持久代,对不同生命周期使用不同的算法进行回收。

spring核心容器原理

Spring内部最核心的是IOC容器。就是具有依赖注入功能的容器。由容器根据配置文件去创建实例并创建各个实例之间的依赖关系。
由Spring容器初始化、装配及管理的对象称为Bean。代表接口为BeanFactory。提供了IOC容器的最基本功能。
而ApplicationContext继承BeanFactory,增加了更多企业级功能的支持。
由于ioc的支持企业级普遍采用面向接口的开发模式。
顺便说一下spring的AOP面向切面编程,其实是通过动态代理来截取消息的方式,对消息进行装饰,取代原有对象的行为的执行。
一般用于权限,缓存,日志处理,事务,同步等场所应用。

JVM内存管理机制


JVM内存分布参考图

程序计数器是用来指示执行哪条指令的。多线程是由CPU切换来执行的。所以在切换线程后为了恢复在切换之前的线程执行为止,所以每个线程都需要有自己独立的程序计数器。
虚拟机 栈是java方法执行的内存模型。栈中存储的是栈帧,每个栈帧对应被调用的方法,在栈帧中包括局部变量表、操作数栈、指向当前方法所属的类的运行时常量池的引用、方法返回地址等。当线程执行方法时会随之创建一个对应的栈帧,并将简历的栈帧压栈,当方法执行完毕后将栈帧出栈。
局部变量表是用来存储方法中的局部变量。对于基本数据类型的变量,则直接存储值,对于引用类型的变量,则存储指向对象的引用。
操作数栈的作用是程序中的所以计算过程都是借助于操作数栈来完成的。
指向运行时常量池的引用,由于方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用指向运行时常量。
方法返回地址,作用是当一个方法执行完毕后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址。
由于每个线程正在执行的方法可能不同,因此每个线程都会有独立的虚拟机栈。
本地方法栈与虚拟机栈的作用和原理相似。区别在于服务对象。虚拟机栈是服务于java方法,本地方法栈服务于本地方法。
是用来存储对象本身,以及数组等。资源是线程共享的,虚拟机栈中的引用指向堆中的具体实例,JVM中只有一个堆。
方法区也是线程共享的区域,存储了每个类的信息(比如类的名称、方法信息、字段信息等)、静态变量、常量以及编译器编译后的代码。

Java 线程池的作用

为了解决一个服务器接受到大量短小线程的请求时避免产生很多创建和销毁线程动作,减少服务器在创建和销毁线程上花费的时间和消耗的系统资源。


赋:欢迎广大java程序猿将自身经历的面试题留言,博主会更新到文章中,谢谢支持~


你可能感兴趣的:(java,基础,面试题,高级)