技术标签: 面试 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)
原则是尽量使用合成/聚合的方式,而不是使用继承
迪米特法则建议“只和朋友说话,不要陌生人说话”,以此来减少类之间的耦合。
文章浏览阅读6.3k次。1、问题经过这里只进行一下记录【不想看的直接看下面步骤】: IntelliJ IDEA从2018.2.1就开始支持clickhouse数据库的访问,但是我的idea 208.2.2却没自动提示驱动下载,接着自己添加clickhouse-jdbc驱动,怪异的是,从gradle依赖视图一看,一大堆依赖,click-house居然还引用着slf4j的包,因为报错就是找不到slf4j的类。 ..._idea中provided driver怎么下载clickhouse驱动
文章浏览阅读5.1k次。agent中的plugin是一种辅助的采集数据的方式。 在plugin的脚本中向stdout打印metric信息,agent会自动收集并上报给transfer。下面介绍其使用方式。1. 配置agent, 使能plugin编辑agent/config/cfg.json设置”enabled”为true,配置dir,git 等。其中,dir 是相对于open-falcon的根目录的路径,如果根目录是/_openfalon plugin的作用
文章浏览阅读1.1k次。前言:该模块基于I2C光数字转换器TSL2561,用于将光强度转换为数字信号。 与传统的模拟光传感器不同,Grove - 光传感器,该数字模块具有可选择的光谱范围,由于其双光敏二极管:红外和全光谱。您可以在三种检测模式之间切换以读取读数。 它们是红外模式,全光谱和人类可见模式。 当在人类可见模式下运行时,此传感器将给您刚刚接近您的眼睛感觉的读数。 高分辨率16位数字输出,400 k_grove light sensor calibration
文章浏览阅读335次。原文地址:https://www.cnblogs.com/lizhonghua34/p/7307139.html jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]注意:使用的jdk版本是jdk8.类加载统计:C:\Users\Administrator>..._jstat time
文章浏览阅读4.9k次。lock.json是源于lockfileVersion@2;npm是lockfileVersion@1的,但。方法1、升级一下npm。_this version of npm is compatible with lockfileversion@1, but package-lock.j
文章浏览阅读2.6k次。#include "stdafx.h"#include <math.h>#define PI 3.141592653/*该程序根据GPS.G1-X-00006.pdf文档,实现了WGS84和ECEF坐标的转换*/void LLAtoECEF(double latitude, double longitude, double..._ecef转载体坐标
文章浏览阅读1.4w次,点赞44次,收藏39次。C++简单封装MySQL操作函数_c++编译封装mysql的
文章浏览阅读3.6k次。FFMPEG是目前被应用最广泛的编解码软件库,支持多种流行的编解码器,它是C语言实现的,不仅被集成到各种PC软件,也经常被移植到多种嵌入式设备中。使用面向对象的办法来设想这样一个编解码库,首先让人想到的是构造各种编解码器的类,然后对于它们的抽象基类确定运行数据流的规则,根据算法转换输入输出对象。在实际的代码,将这些编解码器分成encoder/decoder,muxer/demuxer和de_ffmpeg 依赖 x264
文章浏览阅读23次。混合策略灰狼算法是基于传统灰狼算法(Grey Wolf Optimization,GWO)的改进版本。它结合了多种策略,包括随机搜索、局部搜索和全局搜索,以提高算法的收敛性和搜索能力。算法的基本思想是模拟灰狼群体的行为,通过模拟狼群中个体之间的协作和竞争来搜索最优解。以上就是使用混合策略灰狼算法求解单目标优化问题的 MATLAB 代码和相应的解释。读者可以根据自己的问题进行适当的修改和调整,并应用于实际的优化场景中。函数首先进行参数的初始化,然后初始化种群,并计算初始适应度。_灰狼优化算法的混合策略是什么
文章浏览阅读2.3k次。C++ 实现运动目标的追踪一、介绍本次实验将使用利用 OpenCV 来实现对视频中动态物体的追踪。涉及的知识点C++ 语言基础 g++ 的使用 图像基础 OpenCV 在图像及视频中的应用 Meanshift 和 Camshift 算法实验效果本次实验要实现的效果是追踪太阳系中运动的行星(图中选择了浅绿颜色轨道上的土星,可以看到追踪的目标被红色的椭圆圈住):二..._c++物体跟踪
文章浏览阅读446次。注意下面那个复选框不要选择,要把module安装在解释器环境设定好的路径,比如这个项目的D:\changyong\CODE\运维半自动化工具V2.0.2.5\Python38\Lib\site-packages。对于D:\changyong\CODE\运维半自动化工具V2.0.2.5\Python38\Lib\site-packages路径,pycharm有相应的module管理器。module的解释器都在这两个文件夹里面,缺什么补什么,比如 module pandas。选择该项目的解释器环境。..._modulenotfounderror: no module named 'generate_multi_plate
文章浏览阅读779次,点赞25次,收藏18次。四轮技术面+一轮hr面结束,学习到了不少,面试也是一个学习检测自己的过程,面试前大概复习了 一周的时间,把以前的代码看了一下,字节跳动比较注重算法,面试前刷了下leetcode和剑指offer, 也刷了些在牛客网上的面经。大概就说这些了,写代码去了~祝大家都能收获大厂offer~开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】篇幅有限,仅展示部分内容。