动态代理有几种实现?
- java的动态代理技术的实现主要有两种方式:
1.JDK原生动态代理
2.CGLIB动态代理 - JDK原生动态代理是Java原生支持的,不需要任何外部依赖,但是它只能基于接口进行代理(需要代理的对象必须实现于某个接口)
- CGLIB通过继承的方式进行代理(让需要代理的类成为Enhancer的父类),无论目标对象有没有实现接口都可以代理,但是无法处理final的情况。
参考:
动态代理的几种实现方式及优缺点
常见的数据结构有哪些?
问题回答:
- 一共八大数据结构分类
1.数组
2.队列
3.链表
a.单链表
b.双向链表
c.循环链表
4.树
5.散列表
6.堆
7.栈
8.图
**ps:**关于数据结构,肯定是不能一言半语说清楚的,一般数据结构在面试中往往和算法一起来考察,关于数据结构,推荐大家看一本书《大话数据结构》,这本书我在大学的时候读了2遍,挺不错的,推荐给大家。
下面给大家简单说下几个数据结构:
数组:
数组是一种特殊的变量,他由多个数组元素构成,可以保存多个不同类型的数据,你可以把它想象成一个盒子,盒子里面可以装东西,但是这个盒子是固定大小的
栈:
先进后出、
先进先出
链表
单链表:
链表中的元素的指向只能指向链表中的下一个元素或者为空,元素之间不能相互指向。也就是一种线性链表。
双向链表:
是这样一个有序的结点序列,每个链表元素既有指向下一个元素的指针,又有指向前一个元素的指针,其中每个结点都有两种指针,即left和right。left指针指向左边结点,right指针指向右边结点。
循环链表 :
是在单向链表和双向链表的基础上,将两种链表的最后一个结点指向第一个结点从而实现循环。
树
散列表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
堆
堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:
堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。
图
图是由结点的有穷集合V和边的集合E组成
按照顶点指向的方向可分为无向图和有向图
参考资料
数据结构:八大数据结构分类
常见设计模式知道哪些?
问题回答:
单例模式(Singleton)
构建模式(Builder)
抽象工厂模式(Abstract Factory)
工厂方法模式(Factory Method)
观察者模式(Observer)
模板方法模式(Template Method)
装饰者模式(Decorator)
代理模式(Proxy)
ps:这些设计模式是大家一定要会知道的,因为spring里面很多都是用了这些设计模式,说到这些是什么的时候,你说不知道就尴尬了,面试时至少要会手写其中的几种设计模式,比如单列模式
知道设计模式的分类吗?
问题回答:
- 创建型的设计模式:
1.单例模式(Singleton)
2.构建模式(Builder)
3.原型模式(Prototype)
4.抽象工厂模式(Abstract Factory)
5.工厂方法模式(Factory Method) - 行为设计模式:策略模式(Strategy)
1.状态模式(State)
2.责任链模式(Chain of Responsibility)
3.解释器模式(Interpreter)
4.命令模式(Command)
5.观察者模式(Observer)
6.备忘录模式(Memento)
7.迭代器模式(Iterator)
8.模板方法模式(Template Method)
9.访问者模式(Visitor)
10.中介者模式(Mediator) - 结构型设计模式
1.装饰者模式(Decorator)
2.代理模式(Proxy)
3.组合模式(Composite)
4.桥连接模式(Bridge)
5.适配器模式(Adapter)
6.蝇量模式(Flyweight)
7.外观模式(Facade)
下面做下简单解释:
单例模式(Singleton):确保有且只有一个对象被创建。
抽象工厂模式(Abstract Factory):允许客户创建对象的家族,而无需指定他们的具体类。
工厂方法模式(Factory Method):由子类决定要创建的具体类是哪一个。
装饰者模式(Decorator):包装一个对象,以提供新的行为。
状态模式(State):封装了基于状态的行为,并使用委托在行为之间切换。
迭代器模式(Iterator):在对象的集合之中游走,而不暴露集合的实现。
外观模式(Facade):简化一群类的接口。
策略模式(Strategy):封装可以互换的行为,并使用委托来决定要使用哪一个。
代理模式(Proxy):包装对象,以控制对此对象的访问。
适配器模式(Adapter):封装对象,并提供不同的接口。
观察者模式(Observer):让对象能够在状态改变时被通知。
模板方法模式(Template Method):有子类决定如何实现一个算法中的步骤。
组合模式(Composite):客户用一致的方法处理对象集合和单个对象。
命令模式(Command):封装请求成为对象。
说下设计模式的原则?
问题回答:
- 设计模式的六大原则
1.开闭原则(Open Close Principle)
2.里氏代换原则(Liskov Substitution Principle)
3.依赖倒转原则(Dependence Inversion Principle)
4.接口隔离原则(Interface Segregation Principle)
5.迪米特法则,又称最少知道原则(Demeter Principle)
6.合成复用原则(Composite Reuse Principle)
下面详细说下几种原则
1、开闭原则(Open Close Principle)
开闭原则的意思是:对扩展开放,对修改关闭。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则是面向对象设计的基本原则之一。
里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversion Principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。
它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
5、迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。
ps:被问到设计模式的时候最好结合你的项目说下那个地方用了设计模式,为什么要用到这个设计模式,解决了什么问题
如何加分:很多人都听过设计模式,但是不知道反设计模式,设计模式是一种在前人的设计经验上总结出来的对于一些普遍存在的问题提供的通用的解决方案,但是设计模式可能使用的低效,不良。这种一般是由于项目开发久了而产生的