关于设计模式、Java基础面试题
前言
之前为了准备面试,收集整理了一些面试题。
本篇文章更新时间2023年12月27日。
最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv
设计模式
单例共有几种写法?
细分起来就有9种:懒汉(初始加载资源过多时使用)、饿汉、静态内部类、枚举(防止反序列化创建新对象)、ThreadLocal单例
建造者模式和工厂方法模式的区别是什么?
工厂模式注重创建一个产品,不关心创建细节;
建造者模式也是创建一个产品,同时关注组成的细节。
总结就是一个关注整体、一个关注细节。
简单工厂、工厂方法和抽象工厂之间的区别是什么?
使用场景有一些区别:
- 简单工厂:适用于类关系简单、不复杂 并且 确定之后几乎不扩展的情况。
- 工厂方法:适用于需要根据运行时上下文信息动态选择实现类的时候。
- 抽象工厂方法模式:适用于创建一组相关 或 相互依赖的对象时使用。
桥接模式与适配器模式的区别是什么?
从目的来看,桥接模式关注的是分离,适配器关注的是合并、配合。
适配器模式分为哪几类?每类的应用场景是什么?
类适配器、对象适配器、接口适配器。
装饰器模式与代理模式的区别是什么?
共同点:都是让两个类一起配合工作。
区别:目标、侧重不一样
- 装饰器模式:侧重扩展功能、增加职能;
- 代理模式:侧重对被代理对象的访问控制。
模板设计模式的适用场景是什么?
适用于流程固定但是具体实现有区别的场景。
策略模式的优缺点是什么?
优点:避免多重条件转移语句、算法实现跟使用者分离、避免重复代理。
缺点:必须要知道所有策略类
扩展:可结合工厂模式、享元模式。
责任链模式的优缺点有哪些?
优点:减少对象之间的耦合,灵活指派处理者。
缺点:较长的责任链,可能会影响性能。
访问者模式的适用场景及优缺点有哪些?
适用场景:数据结构 与 数据操作 分离 ;
优点:容易扩展新操作;
缺点:增加新接收比较麻烦。
泛型的上限限定和下限限定是什么?
上限限定:是某个类或其子类;
public static <T extends MyClass> void addToList(List<T> list) {}
下限限定:是某个类或其超类。
public static void addToList(List<? super AbstractMyClass> list) {}
泛型的类型擦除和侨界方法是什么?
类型擦除:编译期间将泛型替换为普通类型,没有指定上、下限定的话就是Object,否则就是指定的边界类。
Java基础
反射的适用场景有哪些?
应用场景:动态加载类和实例化对象、动态代理和AOP、获取注解信息、编写通用的框架和工具类。
反射的优点和缺点
优点:动态灵活;
缺点:1.性能开销:反射涉及动态解析类型和方法的调用,有一定的性能开销;2.安全性问题:绕过访问控制修饰符的限制;3.可读性变差。
静态嵌套类与内部类区别
静态嵌套类不依赖外部类就可以进行实例化;
内部类要进行实例化的话,需要先实例化外部类。
抽象方法不能被static、native、synchronized修饰?
对
当一个线程进入一个对象的 synchronized 方法 A 之后, 其它线程是否可进入此对象的 synchronized 方法 B?
不能。只能进入非synchronized的方法。
对于同一个对象或者class来说。
finally 中的代码一定会执行吗?
不一定,比如虚拟机终止时、try内死循环。
SPI 是什么
提供一套标准接口,让服务提供方(第三方)实现,然后使用合适的方式(比如 Service Loader)发现这个服务实现并调用。
SPI 和 API 有啥区别?
目的不一样:SPI 用于扩展,让第三方实现;API 是对外提供服务,不支持扩展。
序列化和反序列化是什么?
序列化:将对象持久化到磁盘、写到数据库或在网络传输时,需要将对象序列化成二进制流;
反序列化:将二进制流数据还原成对象。
BIO、NIO 和 AIO 的区别?
BIO:同步阻塞IO,知道数据准备就绪、拷贝完成才继续执行;
NIO:同步非阻塞IO,Java中采用IO多路复用模型,避免了CPU资源的浪费。它可以将多个通道(Channel)注册到选择器(Selector),选择器通过select系统调用进行监控,当数据准备好之后让用户线程继续执行。
在linux2.6内核,还支持epoll系统调用,能监控无限多的FD,而且不会随FD增多而降低效率。
AIO:异步IO,基于事件以及回调机制实现,当数据准备好的时候,系统通知用户线程进行后续操作。
什么是语法糖?
为了方便程序而设计的特殊语法。对编程功能没有影响,主要是让代码更加简洁。
什么是检查异常,不受检查异常,运行时异常?并分别举例说明
检查异常(Checked Exceptions):这类异常是Exception及其子类的成员,它们在编译时被强制要求处理,否则程序无法通过编译。例如,如果程序要访问一个文件,但该文件不存在,就会出现一个IOException,这是一个检查异常。
运行时异常(Runtime Exceptions):这类异常是RuntimeException类及其子类的成员,它们在程序运行时可能发生,但不强制要求处理。例如,如果程序中出现空指针异常(NullPointerException)或数组越界异常(IndexOutOfBoundsException),这些都是运行时异常。运行时异常通常是由程序的逻辑错误引起的,因此程序应该尽量避免这些错误。
不受检查异常:运行时发生,一般是程序逻辑问题引起的。
finally块一定会执行吗?
JVM停止时不执行;for循环内的break、return不会。
public static void main(String[] args) {for (int i = 0; i < 2; i++) {try {System.out.println("开始try块");if(i == 0) {
// break;return;}} catch (Exception e) {System.out.println("执行了catch块,异常信息为:" + e.getMessage());} finally {System.out.println("执行finally块");}}
}
try、catch、finally语句块的执行顺序
如上。
一个空Object对象的占多大空间?
64位操作系统下,等于对象头的大小,即16字节。关闭指针压缩则是32
对象的组成
对象头+实际数据+对其填充。
对象头组成
- Mark Word(标记字段):Mark Word是对象头的核心部分,它用于存储对象的标记信息和运行时状态。Mark Word的具体结构和含义可能会因不同的虚拟机实现而有所差异,但通常包括以下内容:
- 对象的哈希码(HashCode):用于支持对象的哈希操作,如在HashMap中使用。
- 锁状态标志(Lock State Flags):用于支持对象的同步操作,如加锁、解锁等。
- GC标记(GC Mark):用于垃圾回收器标记对象的存活状态。
- 偏向锁(Biased Lock):用于支持对象的偏向锁优化,以提高单线程访问对象的性能。
- 类型指针(Class Metadata Pointer):类型指针指向对象所属的类元数据(Class Metadata),包括对象的类型信息、方法表(Virtual Method Table)等。通过类型指针,虚拟机可以确定对象的类型和方法的调用。
拆箱和装箱的过程
Integer数值范围在[-128, 127]的,将从对象池中获取。
Integer a = 1
:自动装箱,从对象池中获取对象。
a++
;先拆箱,自增之后,装箱
多态实现原理
回顾多态的三个必要条件:
区分实现方式与实现原理,实现方式:继承+重写。
而多态的实现原理是:动态绑定 + 虚拟方法表
。
而非私有、非静态和非 final 的方法是动态绑定的;
同一个class的多个实例,共用同一张虚拟方法表。
虚拟方法表在链接阶段&初始化。
集合
ArrayList的优缺点
优点:高效的随机访问;尾插、尾删较快;1.5倍动态扩容;
缺点:动态扩容需要重新分配内存,影响性能;不是线程安全;删除、插入元素可能需要移动元素,会损失一些性能;可能会有一些空间的浪费。
ArrayList和ListList区别
ArrayList:基于数组实现,具有高效的随机访问能力;在插入、删除元素时,可能需要最差的情况下需要
ArrayList初始容量
使用无参构造器创建的ArrayList,默认是一个空数组,没有分配空间,直到调用add()方法,会将初始容量设置为10。
ArrayList扩容机制
每次扩容原来的一半。
以add(T t)
为入口,插入元素前先检查容量,如果不够,那就计算要扩容到多少大小,然后检查要扩容的大小是否超过限制,最后使用Arrays.copyOf
方法进行数组拷贝。
基层调用System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); // 每次扩容原来的一半。if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);}
LinkedList是双向链表还是单向链表
双向链表。这样删除、插入更高效;但是对比单向链表,需要的空间就多一些、实现也更复杂一些。
HashMap jdk1.7和1.8的实现有什么区别
- 数据结构:JDK8引入了红黑树解决链表过长问题,数组类型改为Node。
- 哈希冲突解决方式上:JDK7是采用头插法将元素插入链表,JDK8采用尾查法;
- 扩容机制:JDK7扩容是在put操作中进行,当链表大于8时将重建数组和链表,并重新散列;JDK8的话,扩容是在resize方法进行,当元素数量达到需要调整的阈值时(容量*0.75),将触发扩容方法,创建更大的数组,将旧元素重新hash分配到新数组。
HashMap 的长度为什么是 2 的幂次方
为了让HashMap存取高效,让数据分配得更均匀,减少哈希碰撞。
HashMap 多线程操作导致死循环问题
JDK7之前,当桶中有多个元素需要进行扩容的时候,多线程同时进行,可能会生产环形链表,导致死循环。
JDK8采用了尾插法避免环形链表。
比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同
- 相同:全部实现Set接口,都不是线程安全的;
- 区别:最大的区别是底层结构不同,
- HashSet:hash表;
- LinkedHashSet:链表 + hash表、
- TreeSet:红黑树。
HashMap底层结构
异同:
JDK8之后,new HashMap()不会创建一个长度为16的数组了。调用put的时候才创建。
JDK8之后,使用Node[]作为数组类型;
JDK8之后,使用数组+链表+红黑树,之前使用的是数组+链表。
下面是数据结构图:
JDK7
JDK8
HashMap什么时候转红黑树?
链表长度大于等于8并且数组长度大于等于64时。
HashMap红黑树为什么6的时候退回链表?
链表更简单、数据量小的时候,链表可能查得更快
ConcurrentHashMap底层结构
JDK7
JDK8
跟HashMap类似,采用CAS + synchronized
保证并发安全。
JDK 1.7 和 JDK 1.8 的 ConcurrentHashMap 实现有什么不同?
数据结构不同:JDK7采用分段数组 + 条目数组 + 链表;JDK8采用数组 + 链表 + 红黑树;
并发程度不同:JDK7并发程度由分段数量决定;JDK8对Node加锁,并发读更大。
ConcurrentHashMap 为什么 key 和 value 不能为 null?
从设计上来说:用null的话无法区分是找不到才返回空还是原本就是null;
从源码上来看:需要取hashCode,空的key会抛出空指针异常。
ConcurrentHashMap 能保证复合操作的原子性吗?
不能。但是提供了一些复合操作原子性的方法,如putIfXX、compute等。
相关文章:
关于设计模式、Java基础面试题
前言 之前为了准备面试,收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文:https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv 设计模式 单例共有几种写法? 细分起来就有9种:懒汉&#x…...
Python爱心光波完整代码
文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…...
PowerShell Instal 一键部署gitea
gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…...
C语言——指针题目“指针探测器“
如果你觉得你指针学的自我感觉良好,甚至已经到达了炉火纯青的地步,不妨来试试这道题目? #include<stdio.h> int main() {char* c[] { "ENTER","NEW","POINT","FIRST" };char** cp[] { c 3…...
Hive讲课笔记:内部表与外部表
文章目录 一、导言二、内部表1.1 什么是内部表1.1.1 内部表的定义1.1.2 内部表的关键特性 1.2 创建与操作内部表1.2.1 创建并查看数据库1.2.2 在park数据库里创建student表1.2.3 在student表插入一条记录1.2.4 通过HDFS WebUI查看数据库与表 三、外部表2.1 什么是外部表2.2 创建…...
Docker本地部署开源浏览器Firefox并远程访问进行测试
文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…...
PHP:服务器端脚本语言的瑰宝
PHP(Hypertext Preprocessor)是一种广泛应用于服务器端编程的开源脚本语言,它以其简单易学、灵活性和强大的功能而成为Web开发的瑰宝。本文将深入介绍PHP的历史、特性、用途以及与生态系统的关系,为读者提供对这门语言全面的了解。…...
【MySQL】数据库并发控制:悲观锁与乐观锁的深入解析
🍎个人博客:个人主页 🏆个人专栏: 数 据 库 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 悲观锁(Pessimistic Locking): 乐观锁(Optimistic Locking): 总结&#x…...
作业--day38
1.定义一个Person类,包含私有成员,int *age,string &name,一个Stu类,包含私有成员double *score,Person p1,写出Person类和Stu类的特殊成员函数,并写一个Stu的show函数ÿ…...
pytest 的 fixture 固件机制
一、前置说明 固件(fixture)是一些函数,pytest 会在执行测试函数之前(或之后)加载运行它们。pytest 使用 fixture 固件机制来实现测试的前置和后置操作,可以方便地设置和共享测试环境。 二、操作步骤 1. 编写测试代码 atme/demos/demo_pytest_tutorials/test_pytest_…...
分布式技术之分布式计算Stream模式
文章目录 什么是 Stream?Stream 工作原理Storm 的工作原理 实时性任务主要是针对流数据的处理,对处理时延要求很高,通常需要有常驻服务进程,等待数据的随时到来随时处理,以保证低时延。处理流数据任务的计算模式&#…...
2023年12月GESP Python五级编程题真题解析
【五级编程题1】 【试题名称】:小杨的幸运数 【问题描述】 小杨认为,所有大于等于a的完全平方数都是他的超级幸运数。 小杨还认为,所有超级幸运数的倍数都是他的幸运数。自然地,小杨的所有超级幸运数也都是幸运数。 对于一个…...
探索Apache Commons Imaging处理图像
第1章:引言 大家好,我是小黑,咱们今天来聊聊图像处理。在这个数字化日益增长的时代,图像处理已经成为了一个不可或缺的技能。不论是社交媒体上的照片编辑,还是专业领域的图像分析,图像处理无处不在。而作为…...
【11】ES6:async/await
一、概念 async/await 是 ES2017(ES8)的新特性,它是一种基于 Promise 实现的异步编程方式。async/await 也是一种语法糖。 1、async/await 实现了用同步方式来写异步代码(promise是链式调用形式写异步代码) 2、asyn…...
深入理解Java集合框架
导语: Java集合框架是Java提供的一组用于管理对象的类和接口,它是Java编程中非常重要的一部分。Java集合框架通过提供诸如List、Set、Map等数据结构,为程序员提供了一种方便、高效的管理对象的方式。本文将深入理解Java集合框架,包…...
极智嘉加快出海发展步伐,可靠产品方案获客户认可
2023年,国内本土企业加快出海征程,不少企业在出海发展中表现出了优越的集团实力与创新的产品优势,有力彰显了我国先进的科技研发实力。作为全球仓储机器人引领者,极智嘉(Geek)也在不断加快出海发展步伐&…...
运动目标检测方法的概述
目录 ① 光流法 ② 帧差法 ③ 背景差分法 ④ 混合高斯模型法 ⑤ 总结 运动目标检测技术的应用十分的广泛,尤其是在智能视频监控领域。运动目标检测为后续的图像处理等操作提供了基础,在某种程度上,决定了整个系统的性能。运动目标检测&a…...
【Qt-Edit】
Qt编程指南 ■ QTextEdit■ QLineEdit■ QLineEdit 设置正则表达式■ QPlainTextEdit■ QKeySequenceEdit■ QList<QLineEdit *> edits■■■ QTextEdit /* 实例和对象,设置位置和显示大小 */ textEdit = new QTextEdit(this)...
vue data变量不能以“_”开头,否则会产生很多怪异问题
1、 比如给子组件赋值,子组件无法得到这个值(也不是一直无法得到,设置后this.$forceUpdate() 居然可以得到), 更无法watch到 <zizujian :config"_config1"> </zizujian>this._config1 { ...…...
解释RestFUL API,以及如何使用它构建web程序
RESTful API(Representational State Transfer)是一种基于网络的软件架构风格,用于构建分布式系统。它利用 HTTP 协议中的各种方法(如 GET、POST、PUT、DELETE)来对资源进行操作,使得不同应用程序能够相互通…...
文件下载输出zip文件
文件下载输出成zip文件: 1、前端整个按钮,调js方法:(参数:param,需要下载的id,用逗号拼接) var param "?dto.id";//需要自己拼接param window.location.href "<%basePat…...
构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践
作者:柳下 概述 随着企业规模和数据量的增长,数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂,因此及时捕获和处理这些变化变得至关重要。为了满足这一需求,数据库 CDC(Change Data Captureÿ…...
鸿蒙开发(二)- 鸿蒙DevEco3.X开发环境搭建
上篇说到,鸿蒙开发目前势头旺盛,头部大厂正在如火如荼地进行着,华为也对外宣称已经跟多个厂商达成合作。目前看来,对于前端或客户端开发人员来说,掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…...
Openslide安装
文章目录 安装open-slide python下载openslide二进制文件解压到Anaconda的library目录下配置环境变量在py文件中添加以下语句即可 官网链接 安装open-slide python 表面上这样就可以导入了但事实上会遇到 Couldn’t locate OpendSlide DLL的问题,openslide必须独立安…...
【ES】Elasticsearch常见问题与解决(持续更新)
目录 Elasticsearch常见问题 1. 集群健康问题 2. 性能问题 3. 映射问题 4. 分片问题 5. 内存问题 6. 硬件问题 7. 配置问题 8. 安全问题 9. 网络问题 10. 版本不兼容 Elasticsearch日常使用小结 【Q】离线告警,有IP已离线 【Q】统计某个应用的某个索引…...
2023.12.29 Python面向对象 封装_继承_多台
目录 1.封装-私有与公开权限 2.继承 2.1多继承 2.2继承多层传递 2.3重写父类方法 2.4继承链 2.5禁止私有继承 3.多态 4.总结 1.封装-私有与公开权限 公开属性、公开方法:随便调用 私有属性、私有方法: 只能在类定义的内部调用 以两个下划线开头__的…...
通过自然语言处理增强推荐系统:协同方法
一、介绍 自然语言处理 (NLP) 是人工智能的一个分支,专注于使机器能够以有意义且有用的方式理解、解释和响应人类语言。它包含一系列技术,包括情感分析、语言翻译和聊天机器人。 另一方面,推荐系统(RecSys)是旨在向用户…...
大创项目推荐 深度学习OCR中文识别 - opencv python
文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习OCR中文识别系统 ** 该项目较为新颖,适合作为竞赛课题方向,…...
Python经典游戏 唤醒你童年记忆
这些游戏你玩过几个? 1.贪吃蛇2.吃豆人3.加农炮4.四子棋5. Fly Bird<font color #f3704ab>6.记忆:数字对拼图游戏(欢迎挑战!用时:2min)7.乒乓球8.上课划水必备-井字游戏(我敢说100%的人都…...
什么是骨传导耳机?骨传导能保护听力吗?
骨传导耳机是一种非常特殊的蓝牙耳机,它通过骨传导技术将声音直接传送到内耳。这种技术不同于传统耳机,它不通过空气传送声音,而是通过头骨的振动来传送声音。 并且骨传导耳机能够在一定程度上起到保护听力的作用,主要是因为它们不…...
网站增长期怎么做/推广平台都有哪些
在centos下要剪切文件或者文件夹的时候,一般都是使用的mv命令。 例如要移动a文件到b目录下。操作如下: #假设a和b处于同一级别的目录下 mv a b/ 如果要同时移动多个文件或者文件夹呢? 其实用的也是mv命令。 具体参数用的是-t 查看帮助解…...
哪个网站做欧洲旅行比较好/东莞网站优化关键词排名
参考文档: 11gR2 Clusterware and Grid Home - What You Need to Know (Doc ID 1053147.1)诊断 Grid Infrastructure 启动问题 (Doc ID 1623340.1) Oracle 11gR2 中对CRSD资源进行了重新分类: Local Resources 和 Cluster Resources,可以通过…...
wordpress 侧边栏浮动/网站优化推广费用
http://pan.baidu.com/s/1kTG9DVD GUI源码 转载于:https://www.cnblogs.com/ldxsuanfa/p/10685067.html...
wordpress 底部小工具/百度指数的使用方法
支持基本的分区建立、删除、隐藏等操作。建立新分区时可指定详细参数; 支持ide、scsi、sata等各种类型的硬盘。支持u盘、usb硬盘、存储卡(闪存卡); 支持fat12、fat16、fat32、ntfs文件系统; 可以快速格式化fat12、fat16、fat32、ntfs分区。格…...
wordpress 緩慢/石家庄seo外包公司
SpringBoot项目解决 log4j2 核弹漏洞! 事件情况 北京时间12月9号深夜,Apache Log4j2被曝出一个高危漏洞,攻击者通过jndi注入攻击的形式可以轻松远程执行任何代码。随后官方紧急推出了2.15.0和2.15.0-rc1新版本修复,依然未能完全…...
建设网站公司哪好/百度风云榜小说排行榜
将(r,g,b,a)变为(r*a,g*a,b*a,a)的操作称为alpha预乘。 对于alpha预乘的图片,应使用(One,OneMinusSrcAlpha)进行混合。 使用alpha预乘方式混合出来的结果图片也是alpha预乘的。所以在显示此结果图片时应该使用(One,OneMinusSrcAlpha)对其进行…...