技术标签: 面试 java Java面试题及答案整理 单例模式
Java面试题及答案(2022版),每道都是认真筛选出的高频面试题,助力大家能找到满意的工作!
Java设计模式面试题及答案
单例模式(Singleton pattern)用于 Runtime,Calendar 和其他的一些类中。工厂模式
(Factory pattern)被用于各种不可变的类如 Boolean,像 Boolean.valueOf,观察者模式
(Observer pattern)被用于 Swing 和很多的事件监听中。装饰器设计模式(Decorator
design pattern)被用于多个 Java IO 类中。
设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法。设计模式是代码可用性的延伸
单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用中只维护一个特定类实例,它被所有组件共同使用。Java.lang.Runtime 是单例模式的经典例子。从 Java5 开始你可以使用枚举(enum)来实现线程安全的单例。
观察者模式是基于对象的状态变化和观察者的通讯,以便他们作出相应的操作。简单的例子就是一个天气系统,当天气变化时必须在展示给公众的视图中进行反映。这个视图对象是一个主体,而不同的视图是观察者。
工厂模式的最大好处是增加了创建对象时的封装层次。如果你使用工厂来创建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要在调用层做任何修改。
装饰模式增加强了单个对象的能力。Java IO 到处都使用了装饰模式,典型例子就是Buffered 系列类如 BufferedReader 和 BufferedWriter,它们增强了 Reader 和 Writer 对象,以实现提升性能的 Buffer 层次的读取和写入。
Java 中不能从静态上下文访问非静态数据只是因为非静态变量是跟具体的对象实例关联的,而静态的却没有和任何实例关联。
比如设计金融系统来说,必须知道它们应该在任何情况下都能够正常工作。不管是断电还是其他情况,ATM 应该保持正确的状态(事务) , 想想 加锁(locking)、事务(transaction)、错误条件(error condition)、边界条件(boundary condition) 等等。尽管你不能想到具体的设计,但如果你可以指出非功能性需求,提出一些问题,想到关于边界条件,这些都会是很好的。
如果你看到一个类的不同实现有着不同的方式来做同一件事,那么就应该用重写(overriding),而重载(overloading)是用不同的输入做同一件事。在 Java 中,重载的方法签名不同,而重写并不是。
接口和抽象类都遵循”面向接口而不是实现编码”设计原则,它可以增加代码的灵活性,可以适应不断变化的需求。下面有几个点可以帮助你回答这个问题:在 Java 中,你只能继承一个类,但可以实现多个接口。所以一旦你继承了一个类,你就失去了继承其他类的机会了。
接口通常被用来表示附属描述或行为如:Runnable、Clonable、Serializable 等等,因此当你
使用抽象类来表示行为时,你的类就不能同时是 Runnable 和 Clonable(注:这里的意思是指如果把 Runnable 等实现为抽象类的情况),因为在 Java 中你不能继承两个类,但当你使用接口时,你的类就可以同时拥有多个不同的行为。
在一些对时间要求比较高的应用中,倾向于使用抽象类,它会比接
口稍快一点。如果希望把一系列行为都规范在类继承层次内,并且可以更好地在同一个地方进行编码,那么抽象类是一个更好的选择。有时,接口和抽象类可以一起使用,接口中定义函数,而在抽象类中定义默认的实现。
1、普通⼯⼚模式:建⽴⼀个⼯⼚类,对实现了同⼀接⼝的⼀些类进⾏实例的创建;
接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态的默认方法,这种方法是具体的。
1.一个类可以实现多个接口 ,但却只能继承最多一个抽象类。
2.抽象类可以包含具体的方法 , 接口的所有方法都是抽象的。
3.抽象类可以声明和使用字段 ,接口则不能,但接口可以创建静态的final常量。
4.接口的方法都是public的,抽象类的方法可以是public,protected,private或者默认的package;
5.抽象类可以定义构造函数,接口却不能。
这需要根据你的经验来回答。一般情况下,你可以说依赖注入,工厂模式,装饰模式或者观察者模式,随意选择你使用过的一种即可。不过你要准备回答接下的基于你选择的模式的问题。
1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承
迪米特法则建议“只和朋友说话,不要陌生人说话”,以此来减少类之间的耦合。
文章浏览阅读3.7k次。准备工作: 1.在编写memory monitor库前必须对lua c api要熟悉,否则会无从下手,这是一个痛苦的过程,还好风云大大对这个api进行的翻译,相对来说写lua c 库就轻松很多了,api翻译地址为:https://www.codingnow.com/2000/download/lua_manual.html#lua_getstack。 2.在扩展snapshot库时会用到uth..._luamemorymonitor
文章浏览阅读1.5w次,点赞4次,收藏14次。Stanford CoreNLP由Java语言开发,是斯坦福大学自然语言处理小组的研究成果。 包含自然语言处理的基本任务:分词、词性标注、依存句法分析、命名实体识别等等,支持多语言。项目地址:GitHub本文主要记录使用注意事项。Stage 1首先我们要下载 CoreNLP Java包。 然后在Eclipse里面的Classpath里面引入jar文件。如下图红色框所示: CoreNLP只需_stanford corenlp 3.6.0 功能
文章浏览阅读1.2k次。在manifest的application节点外加入<queries> <package android:name="com.tencent.mm" /></queries>同理,支付宝也一样<queries> <package android:name="com.eg.android.AlipayGphone" /> <package android:name="hk.alipay.wallet.._android r(11) app targetsdkversion30遇到的那些坑之——相册选择图片黑屏现象
文章浏览阅读3.8k次。信息学奥赛C++编程:(循环结构)奥运奖牌计数_信息学奥赛c++编程
文章浏览阅读6.5k次。Springboot RabbitMq源码解析之配置类Springboot RabbitMq源码解析之消息发送Springboot RabbitMq源码解析之消费者容器SimpleMessageListenerContainerSpringboot RabbitMq源码解析之consumer管理和AmqpEventSpringboot RabbitMq源码解析之RabbitListener..._rabbitmq onmessage
文章浏览阅读140次。为什么Lisp没有流行起来本文探讨的是为什么Lisp语言不再被广泛使用的。很久以前,这种语言站在计算机科学研究的前沿,特别是人工智能的研究方面。现在,它很少被用到,这一切并不是因为古老,类似古老的语言却被广泛应用.其他类似的古老的语言有 FORTRAN, COBOL, LISP, BASIC, 和ALGOL 家族,这些语言的唯一不同之处在于,他们为谁设计,FORTRAN是为科学家和工程师设计的,他..._pascal 没有过时
文章浏览阅读1.6w次,点赞5次,收藏53次。VS2022 项目打包VS2022 打包更改.Net Framework 目标包版本问题。1. 安装Visual Studio Installer Projectvs2022中-->扩展-->联机-->搜索Microsoft Visual Studio Installer Project2. 新建Setup Project右键解决方案-->新增项目-->选择Setup Project3. 将net Framework 打包安装(离线)右键setup _setup project
文章浏览阅读974次。1.如何调出开发者工具按F12调出右键检查(或快捷键Ctrl+Shift+i)调出2.开发者工具初步介绍chrome开发者工具最常用的四个功能模块:元素(ELements)、控制台(Console)、源代码(Sources),网络(Network)。元素(Elements):用于查看或修改HTML元素的属性、CSS属性、监听事件、断点等。css可以即时修改,即时显示。大大方便了开发者调试页面控制台..._谷歌浏览器f12控制台network
文章浏览阅读4.2w次,点赞13次,收藏12次。有时候一不小心,就把在编辑好的的代码在脚本窗口误删了 那这个时候应该怎么办呢? 一般运行过的程序都会在History中有保存 只需要在其中将想要恢复的代码选中,然后点上面绿色的箭头(To Source),这样代码就会重新回到脚本窗口里面 To Source 前面的按键是To Console,如果选中代码然后按这个的话,代码会立即运行!![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101012361644.jpg#pic_center)..._r语言撤回上一步
文章浏览阅读6.2k次,点赞5次,收藏21次。平面反射通常指的是在镜子或者光滑地面的反射效果上,如下图所示,上图是一个光滑的平面,平面上的物体在平面上有对称的投影。一、平面反射的原理对于光照射到物体表面然后发生完美镜面反射的示意图,如下所示,对于平面反射,假设平面上任意一点都会发生完美的镜面反射。因此,眼睛看到物体的一点的反射信息是从反射向量处得到的,这个可以用下图来表示,这个实际上相当于,眼睛从平面的下面看向反射向量,如下图所示,因此,如上图所示,我们可以把摄像机根据平面对称变换到A点所示的位置,然后再渲染一遍场景到RenderT_unity 平面反射
文章浏览阅读1.6k次。前言大部分场景下,我们都会在项目中实现自定义 Realm 搭配 UsernamePasswordToken 来完成用户的登录认证流程,但是如果登录方式包括“第三方登录”、“手机号登录”等,仅凭 UsernamePasswordToken 就难以实现了,因为以上的两种登录方式都是免密登录,而 UsernamePasswordToken 却必须要有 username 和 password,因此需要自定..._shiro 多种登录验证
文章浏览阅读1.1k次,点赞2次,收藏2次。倒置字符串函数reverse:用于倒置字符串s中的各个字符的位置,如原来字符串中如果初始值为123456,则通过reverse函数可将其倒置为654321,程序如下:#include#includevoid reverse(char s[]){ int c,j,i; for(i=0,j=strlen(s)-1;i { c=s[i]; s[i]=s[j];_完成函数reverse