关于设计模式、Java基础面试题

news2025/1/16 2:01:59

前言

之前为了准备面试,收集整理了一些面试题。
本篇文章更新时间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

对象的组成

对象头+实际数据+对其填充。
image.png

对象头组成

  1. Mark Word(标记字段):Mark Word是对象头的核心部分,它用于存储对象的标记信息和运行时状态。Mark Word的具体结构和含义可能会因不同的虚拟机实现而有所差异,但通常包括以下内容:
    1. 对象的哈希码(HashCode):用于支持对象的哈希操作,如在HashMap中使用。
    2. 锁状态标志(Lock State Flags):用于支持对象的同步操作,如加锁、解锁等。
    3. GC标记(GC Mark):用于垃圾回收器标记对象的存活状态。
    4. 偏向锁(Biased Lock):用于支持对象的偏向锁优化,以提高单线程访问对象的性能。
  2. 类型指针(Class Metadata Pointer):类型指针指向对象所属的类元数据(Class Metadata),包括对象的类型信息、方法表(Virtual Method Table)等。通过类型指针,虚拟机可以确定对象的类型和方法的调用。

image.png

拆箱和装箱的过程

Integer数值范围在[-128, 127]的,将从对象池中获取。
Integer a = 1:自动装箱,从对象池中获取对象。
a++;先拆箱,自增之后,装箱

多态实现原理

回顾多态的三个必要条件:

区分实现方式与实现原理,实现方式:继承+重写。

而多态的实现原理是:动态绑定 + 虚拟方法表

而非私有、非静态和非 final 的方法是动态绑定的;
同一个class的多个实例,共用同一张虚拟方法表。

虚拟方法表在链接阶段&初始化。

image.png

集合

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 code
        int 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
image.png
JDK8
image.png

HashMap什么时候转红黑树?

链表长度大于等于8并且数组长度大于等于64时。

HashMap红黑树为什么6的时候退回链表?

链表更简单、数据量小的时候,链表可能查得更快

ConcurrentHashMap底层结构

JDK7
image.png
JDK8
跟HashMap类似,采用CAS + synchronized保证并发安全。
image.png

JDK 1.7 和 JDK 1.8 的 ConcurrentHashMap 实现有什么不同?

数据结构不同:JDK7采用分段数组 + 条目数组 + 链表;JDK8采用数组 + 链表 + 红黑树;
并发程度不同:JDK7并发程度由分段数量决定;JDK8对Node加锁,并发读更大。

ConcurrentHashMap 为什么 key 和 value 不能为 null?

从设计上来说:用null的话无法区分是找不到才返回空还是原本就是null;
从源码上来看:需要取hashCode,空的key会抛出空指针异常。

ConcurrentHashMap 能保证复合操作的原子性吗?

不能。但是提供了一些复合操作原子性的方法,如putIfXX、compute等。

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

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

相关文章

信号与线性系统翻转课堂笔记15——离散LTI系统模型分析

信号与线性系统翻转课堂笔记15——离散LTI系统模型分析 The Flipped Classroom15 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff0c;重点&…

Java 基础学习(十八)多线程进阶、网络编程基础

1 并发工具包 1.1 并发工具包概述 1.1.1 什么是并发工具包 Java并发工具包是指java.util.concurrent&#xff08;简称JUC&#xff09;&#xff0c;在Java 5 版本中添加。JUC中包含了大量在并发应用开发中非常实用的工具类。 行业中说的JUC一般包含java.util.concurrent包、…

C# WPF上位机开发(报表导出)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于在工厂上班的小伙伴来说&#xff0c;导出生产数据、生成报表&#xff0c;这是很习以为常的一个工作。之前的文章中&#xff0c;虽然我们也介绍…

【10】ES6:Promise 对象

一、同步和异步 1、JS 是单线程语言 JavaScript 是一门单线程的语言&#xff0c;因此同一个时间只能做一件事情&#xff0c;这意味着所有任务都需要排队&#xff0c;前一个任务执行完&#xff0c;才会执行下一个任务。但是&#xff0c;如果前一个任务的执行时间很长&#xff…

踩坑RV1106板端部署rknn模型

文章目录 1、交叉编译2、板上跑通3、验证自己模型 1、交叉编译 官方给的一个流程: RKNN 模型推理测试为了避免踩坑在开头提出来 按照官方的流程可以跑通&#xff0c;他自己提供的yolov5s.rknn&#xff08;640*640&#xff09;的模型&#xff0c;但是跑自己的模型的时候加载就会…

SAP VA01 创建带wbs号的销售订单包 CJ067的错误

接口错误提示如下 SAP官方 CJ067 124177 - VA01: CJ067 during WBS acct assgmt with a different business area S4的core 刚好能用上 实施 这个note后成功

「Kafka」生产者篇

「Kafka」生产者篇 生产者发送消息流程 在消息发送的过程中&#xff0c;涉及到了 两个线程 ——main 线程和Sender 线程。 在 main 线程中创建了 一个 双端队列 RecordAccumulator。 main线程将消息发送给RecordAccumulator&#xff0c;Sender线程不断从 RecordAccumulator…

多线程编程(三)互斥量

因为他继承于QObject类所以需要构造函数和析构函数。 有几个人就创建几个线程。

【SAM系列】Auto-Prompting SAM for Mobile Friendly 3D Medical Image Segmentation

论文链接&#xff1a;https://arxiv.org/pdf/2308.14936.pdf 核心&#xff1a; finetune SAM,为了不依赖外部prompt&#xff0c;通过将深层的特征经过一个编-解码器来得到prompt embedding&#xff1b;finetune完之后做蒸馏

Visual Studio Code安装下载及安装自用版

Visual Studio Code安装下载及安装自用版 vscode 我愿称之为最强&#xff0c;赶紧下载吧&#xff0c;用起来再说。微软牛逼。 安装过程也非常简单。 一、下载 Visual Studio Code下载地址 1.选择要下载的客户端的版本&#xff0c;直接下载稳定版的 注意&#xff1a; 下载后&…

OpenEular23.09(欧拉)操作系统为企业搭建独立的K8S集群环境,详细流程+截图

1.环境&#xff1b; win10&#xff0c;vmware16 pro&#xff0c;openeular23.09 集群模式&#xff1a;一主二从 主机硬件配置 主机名IP角色CPU内存硬盘k8s-master01192.168.91.100master4C4G40Gk8s-worker02192.168.91.101worker(node)4C4G40Gk8s-worker03192.168.91.102work…

Matlab:非线性规划

1、语法&#xff1a; xfmincon(fun,x0,A,b) xfmincon(fun,x0,A,b,Aeq,beq) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) xfmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) xfmincon(problem) [x,fval]fmincon(___) [x,fval,exitflag,…

如何在Mac中设置三指拖移,这里有详细步骤

三指拖移手势允许你选择文本&#xff0c;或通过在触控板上用三指拖动窗口或任何其他元素来移动它。它可以用于快速移动或调整窗口、文件或图像在屏幕上的位置。 然而&#xff0c;这个手势在默认情况下是禁用的&#xff0c;因此在本教程中&#xff0c;我们将向你展示如何在你的…

掌汇云 | 公司库聚合企业,为垂直领域提供产品与服务展示窗口

11月29日晚&#xff0c;拼多多美股盘中市值首次超越阿里巴巴。拼多多是赢了&#xff0c;但也有人说阿里未必就输了&#xff0c;因为阿里拼的是整个阿里生态。 阿里生态使其庞大且屹立不倒&#xff0c;拼多多将社交用于撮合交易&#xff0c;通过平台连接消费者和供应商&#xf…

基于STM8S103F3P6的超声波测距仪设计

大三的时候给大四学长做的毕业设计题目 文章目录 1 绪论1.1 设计背景1.2 设计的主要任务 2 超声波测距基本理论及总体架构2.1 基本知识2.1.1 超声波特性2.1.2 超声波传感器2.1.3 超声波测距原理 2.2 总体架构2.2.1 设计原则2.2.2 总体方案介绍 2.3 主要器件选择与介绍2.3.1 主控…

【快速全面掌握 WAMPServer】03.玩转安装和升级

网管小贾 / sysadm.cc 大多数情况我们在了解和学习任何一款软件之前都会先去尝试一下软件的安装&#xff0c;毕竟只有安装好了软件&#xff0c;再通过使用它来进一步学习和掌握。 那么同样的道理&#xff0c;我们要学习和掌握如何动手搭建 PHP 的调试环境&#xff0c;那么作为…

R语言学习笔记-R包的安装

推荐在线安装&#xff0c;可以解决包与包之间的依赖关系。 1.首先在RGui&#xff1a; 2.在RStudio 的console下&#xff1a; 如安装ggplot2包&#xff0c;则&#xff1a; install.packages("ggplot2") 生信方面&#xff1a; 首先安装&#xff1a; install.packa…

openGauss学习笔记-176 openGauss 数据库运维-实例主备切换

文章目录 openGauss学习笔记-176 openGauss 数据库运维-实例主备切换176.1 操作场景176.2 操作步骤176.3 示例176.4 错误排查176.5 异常处理 openGauss学习笔记-176 openGauss 数据库运维-实例主备切换 176.1 操作场景 openGauss在运行过程中&#xff0c;数据库管理员可能需要…

陈可之|三峡|《河水不犯井水的游戏》

《河水不犯井水的游戏》 尺寸&#xff1a;130x90cm 陈可之2007年绘 油画《河水不犯井水的游戏》是陈可之先生三峡系列作品之一&#xff0c;巧借古代传说&#xff0c;并具象化为螃蟹、乌龟、长江水&#xff0c;描绘了一幅和谐共生的画面。 画面右侧&#xff0c;蜿蜒宽阔的长江水…

打造完备数据生态,「开放互信、合作共赢」: 拓数派亮相2023龙蜥操作系统大会

拓数派始终持「开放互信&#xff0c;合作共赢」的理念&#xff0c;通过积极建立合作伙伴生态网络、构建生态工具、打造活跃的技术和用户社区等方式&#xff0c;构筑更加完善的数据生态体系&#xff0c;为用户带来更加便捷的使用体验。2023年12月17-18日&#xff0c;由开放原子开…