java基础面试题 一

news2024/12/28 19:13:33

一、面向对象五大基本原则是什么

1.单一职责原则SRP(Single Responsibility Principle)

类的功能要单一,不能包罗万象,跟杂货铺似的。

2.开放封闭原则OCP(Open-Close Principle)

一个模块对于扩展是开放的,对于修改是封闭的

3.里式替换原则LSP(Liskov Substitution Principle LSP)

子类可以替换父类出现在父类能够出现的任何地方。比如你能代表你爸去你姥姥家干活。

4.接口分离原则ISP(Interface Segregation Principle ISP)

设计时采用多个与特定客户类有关的接口比采用一个通用的接口要好。就比如一个手机拥有打电话,看视频,玩游戏等功能,把这几个功能拆分成不同的接口,比在一个接口里要好的多。

5.依赖倒置原则DIP( Dependency Inversion Principle DIP)

高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。就是你出国要说你是中国人,而不能说你是哪个村子的。比如说中国人是抽象的,下面有具体的xx省,xx市,xx县。你要依赖的抽象是中国人,而不是你是xx村的。实现尽量依赖抽象,不依赖具体实现

二、BIO,NIO,AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,并发处理能力低。

NIO:Non IO 同步非阻塞 IO,客户端和服务器端通过Channel(通道)通讯,实现了多路复用。

AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非阻塞 IO,异步 IO 的操作基于事件和回调机制

同步,因为这种情况下你并不知道子任务的执行情况,虽然主子两个任务并行,但还是需要主任务手动去获取子任务的执行状态。异步多了个任务结束回调。

详细回答

BIO (Blocking I/O):  同步阻塞I/O模式数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。

NIO (New I/O):  NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了

NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的

N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O

作方法。 NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的

SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都

支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是

性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,

可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网

络)应用,应使用 NIO 的非阻塞模式来开发

AIO (Asynchronous I/O):  AIO 也就是 NIO 2。在 Java 7 中引入了 NIO

的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的

也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通

知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提

供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务

线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO

作本身是同步的。目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。

三、集合

1. Set

HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保

存元素

LinkedHashSet: LinkedHashSet 继承与 HashSet,并且其内部是通过 

LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基

于 Hashmap 实现一样,不过还是有一点点区别的。

TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树。)

2. Map

HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主

体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后

在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转

化为红黑树,以减少搜索时间。需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

HashMap 基于 Hash 算法实现的

1. 当我们往Hashmap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标

2. 存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中

3. 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。

4. 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比

在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;链表的特点是:寻址困难,但插入和删除容易;所以我们将数组和链表结合在一起,发挥两者各自的优势,使用一种叫做拉链法的方式可以解决哈希冲突。

拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。

LinkedHashMap:LinkedHashMap 继承自 HashMap,所以它的底层仍然是

基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面

结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序

同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。

HashTable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的

TreeMap: 红黑树(自平衡的排序二叉树)

四、Java集合的快速失败机制 “fail-fast”?

是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生 fail-fast 机制。

例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制。

原因:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。

解决办法:

1. 在遍历过程中,所有涉及到改变modCount值得地方全部加上synchronized。

2. 使用CopyOnWriteArrayList来替换ArrayList

五、怎么确保一个集合不能被修改?

可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合,这样改变集合的任何操作都会抛出 Java. lang.UnsupportedOperationException 异常。

六、能否使用任何类作为 Map 的 key?

1、可以使用任何类作为 Map 的 key,然而在使用之前,需要考虑以下几点:

如果类重写了 equals() 方法,也应该重写 hashCode() 方法。

2、类的所有实例需要遵循与 equals() 和 hashCode() 相关的规则。

如果一个类没有使用 equals(),不应该在 hashCode() 中使用它。

3、用户自定义 Key 类最佳实践是使之为不可变的,这样 hashCode() 

可以被缓存起来,拥有更好的性能。不可变的类也可以确保 hashCode() 

和 equals() 在未来不会改变,这样就会解决与可变相关的问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins基于docker cloud动态增减节点

jenkins可以按照jenkins容器启动去部署 Jenkins管理动态节点 动态节点可以在有job运行时,临时加入一个agent到jenkins master,然后等job执行完毕之后,所加入的agent再自动删除掉,达到一个动态的增删节点效果,使所有的…

引用第三方插件到分包中即如何把uni_modules文件夹中的插件放入分包中

网上搜索了很多,但都没有直接说明如何把node_modules中的第三方插件如何引入到分包中,首先为什么要在分包引入,原因就是小程序有包大小的限制,不能超过2M,超过2M的话,则不能发布或预览,于是不能…

SCT81620QSTER,升降压电源芯片

P2P替代 LM3478和LM3481SCT81620QSTER设备是一个宽输入、非同步升压控制器。该设备可用于增强、间隔和反馈转换器和拓扑结构。SCT81620Q设备的开关频率可以通过将SCT81620Q设备的开关频率调整到100 kHz到2.2MHz之间的任何值。电流模式控制提供了优越的带宽和瞬态响应&#xff0…

IDEA设置注释模板(详细版)

IDEA设置注释模板 类注释模板方法注释模板效果展示 1. 类注释模板 类注释模板是IDEA创建类时生成的注释 第一步、File -> Settings 第二步、Editor -> File and Code Templates -> Includes -> File Header 点apply,再点ok即可 模板参考如下&#…

拉格朗日插值原理及其Julia实现

文章目录数学原理算法化测试设函数yf(x)yf(x)yf(x)在区间[a,b][a,b][a,b]上有定义,且在点a⩽x0⩽x1…⩽xn⩽ba\leqslant x_0\leqslant x_1\ldots\leqslant x_n\leqslant ba⩽x0​⩽x1​…⩽xn​⩽b上的值y0,y1…yny_0, y_1 \ldots y_ny0​,y1​…yn​之间存在一个函…

规则引擎-drools-3.2-drl文件构成-rule部分-属性Attribute

文章目录drl文件构成-rule部分rule示例rule nameAttribute全部属性说明no-loop 和 lock-on-activeactivation-group 和 agenda-groupdrl文件构成-rule部分 drl文件构成,位于官网的第5章位置,也是drools作为规则引擎应用的最核心部分。 其中rule模块&…

谷歌浏览器无法翻译此网页,解决方法?(谷歌浏览器无法翻译成中文,谷歌翻译,最新方法)

谷歌浏览器自带的翻译功能,对我们来说用处很大,但有的时候突然就会变成“无法翻译此网页”,针对此问题这里提供几种解决方案(翻译插件),如下: 方法1: 蓝奏云文件https://wwot.lanzouw.com/iFc7d0hmrtpg 访问密码:slee 方法2: 脚本之家

分布式事务的4种模式

分布式事务理论基础 解决分布式事务,也有相应的规范和协议。分布式事务相关的协议有2PC、3PC。 由于三阶段提交协议3PC非常难实现,目前市面主流的分布式事务解决方案都是2PC协议。 有些文章分析2PC时,几乎都会用TCC两阶段的例子&#xff0…

Java开发基础入门之Java基础中的Stack类及其常用方法

一、Stack类 1.Stack是Vector的一个子类,它实现标准的后进先出堆栈。Stack只定义了创建空堆栈的默认构造方法。 Stack() 2.Stack类里面主要实现的有以下的几个方法: (1)boolean empty( )方法是判断堆栈是否为空。 (2)Object peek( )方法是返回栈顶端…

一夜爆火的现象级产品ChatGPT,是AI突破还是昙花乍现?

导语 | 编写代码、翻译小说、参加考试……2022 年末,人工智能聊天机器人 ChatGPT 风靡全网。自 2016 年 AlphaGo 击败围棋世界冠军李世石后,ChatGPT 再次掀起了人工智能发展应用的高潮。它将会给我们带来哪些影响?人工智能的颠覆性应用是否即…

MyBatis 二级缓存整合Redis【学习记录】

二级缓存整合Redis 上篇文章介绍了MyBatis自带的二级缓存,但是这个缓存是单服务器工作,无法实现分布式缓存。那么什么是分布式缓存呢?假设现在有两个服务器1和2,用户访问的时候访问了服务器1,查询后的缓存就会放在服务…

酒店预订订单的分析与建模【决策树、xgboost】

酒店预订订单的分析与建模【决策树、xgboost】 本项目包含 1.数据处理 2.数据探索性分析 3.网格搜索对决策树、xgboost进行模型参数调优 4.基于五折交叉验证的决策树、xgboost模型预测 专栏和往期项目 👉往期文章可以关注我的专栏 下巴同学的数据加油小站 会不…

《神经网络与深度学习》 邱希鹏 学习笔记(二)

正则化 所有损害优化的方法都是正则化。增加优化约束,干扰优化过程 优化约束包括 L1/L2约束,数据增强 干扰优化包括 随机梯度下降 权重衰减 提前停止 在上式中 y(n)为样本n,其展开形式为y^{(n)}为样本n,其展开形式为y(n)为样本…

【Axure教程】低代码可视化编辑器

低代码是一组数字技术工具平台,基于图形化拖拽、参数化配置等更为高效的方式,通过少量代码或不用代码实现数字化转型中的场景应用创新。例如在业务系统中,如果企业新增了一项业务,以往往往需要对系统继续开发和升级,但…

【Python学习笔记】9. Python3 解释器

前言 Linux/Unix的系统上,一般默认的 python 版本为 2.x,我们可以将 python3.x 安装在 /usr/local/python3 目录中。 Python3 解释器 Linux/Unix的系统上,一般默认的 python 版本为 2.x,我们可以将 python3.x 安装在 /usr/loca…

IDEA 常用插件跟配置提升开发效率

工欲善其事必先利其器 安装好 IntelliJ IDEA 后,进行如下的初始化操作,工作效率提升50倍。 一、插件 1. Codota 代码智能提示插件 只要打出首字母就能联想出一整条语句,这也太智能了,还显示了每条语句使用频率。原因是它学习了…

最全的视频转换器工具清单,这18款免费视频格式转换器记得收藏

审查和比较具有功能和定价的最佳视频转换器软件。从这个顶级付费和免费在线视频转换器工具列表中选择,以快速轻松地转换任何视频: 什么是视频转换器? 视频转换工具允许您将视频从一种格式转换为另一种格式。第一个商业上成功的视频格式是 Q…

11.1-股票基金历年收益率计算

文章目录1. 计算目标2. 关键问题3. 获取交易日历4. 逻辑编写1. 计算目标 我们想知道,一只股票标的,在之前的几年中,每一年的年化收益率是多少? 如果将每年的年化收益率进行求和汇总,截止到今年,总共年化收…

五、Mybatis详细教程

Mybatis概述 1 Mybatis概念 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github 官网&am…

Qt OpenGL(三十五)——Qt OpenGL 核心模式-点云(斯坦福兔子)

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十五)——Qt OpenGL 核心模式-点云(斯坦福兔子) 一、场景 我们在平时的项目中,有的时候会遇到,激光雷达等这些设置采集的数据集,不管是在机器人、…