关于设计模式、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)来对资源进行操作,使得不同应用程序能够相互通…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
