当前位置: 首页 > news >正文

Java数据结构面试题以及答案

本专栏记录Java后端开发相关的面试题,欢迎大家阅读专栏的其他文章。

目录

1.B树和B+树的区别?B树和B+树的优点分别是?

2.排序算法的种类和复杂度

3.HashMap和Hashtable的原理、区别、应用场景

4.ConcurrentHashMap的原理、应用场景

5.ArrayList和LinkedList的区别?原理?应用场景?

6.String、StringBuilder和StringBuffer的区别,应用场景

7.ArrayList和Vector的区别

8.Collection下有哪些子类

9.Comparable和Comparator的区别


 

1.B树和B+树的区别?B树和B+树的优点分别是?

B树和B+树详细解析_星空是梦想的博客-CSDN博客

1.1 B树和B+树的区别

B树特征:

  • 关键字集合分布在整颗树中
  • 每个结点都存放有若干个 key 和 value
  • 任何一个关键字出现且只出现在一个结点中
  • 搜索有可能在非叶子结点结束
  • 其搜索性能等价于在关键字全集内做一次二分查找

B+树特征:

  • 非叶子结点不保存数据,只保存 key,所有数据都保存在叶子节点
  • 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接
  • 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字
  • 通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点
  • 同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素

B树和B+树区别:

  • B+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”
  • b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢)
  • 对于范围查找来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历

1.2 B树的优点

相比于普通的二叉树来说,B树是平衡二叉树,它增加和删除节点对树的整体结构来说,改动非常小,适合用来存储大数据

1.3 B+树的优点

  • b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”
  • b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢)
  • 对于范围查找来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历

2.排序算法的种类和复杂度

2.1 什么是算法的空间复杂度

算法的空间复杂度是指:算法在运行过程中,除了存储算法基本数据的空间外,需要耗费的额外空间。

2.2 排序算法的时间和空间复杂度

排序算法的时间和空间复杂度
算法名称时间复杂度空间复杂度
冒泡排序O(n^2)O(1)
直接插入排序O(n^2)O(1)
直接选择排序O(n^2)O(1)
快速排序O(n*logn)O(n*logn)
希尔排序O(n*logn)O(1)
堆排序O(n*logn)O(1)

计数排序

介绍

O(d(n+k))O(n+k)
归并排序O(n*logn)

O(n)

 

 

        

 

 

 

 

 

 

 

 

3.HashMap和Hashtable的原理、区别、应用场景

3.1 原理

  1. HashMap 和 Hashtable 的底层结构都是 数组+链表结构实现的。数组用于存储链表头节点,新增元素都会添加到对应位置的链表末尾,链表节点数量超过 8 时,链表会转化为红黑树。
  2. 它们的链表节点中有一个 hash 变量,用于存储该结点的 hash 值,通过 hash值 可以快速定位元素位置。

3.2 区别

HashMap 和 Hashtable 的主要区别是:

  1. Hashtable 是线程安全的,HashMap 是线程不安全的,主要原因是 Hashtable 的主要方法都加了 synchronized锁,实现了访问互斥。
  2. HashMap 的 key 和 value 都允许为 null,Hashtable 的 key 和 value 都不允许为空。

3.3 应用场景

HashMap 用于非并发场景,Hashtable 用于并发场景,但是并发场景推荐使用concurrentHashMap。

4.ConcurrentHashMap的原理、应用场景

4.1 原理

  1. ConcurrentHashMap 的底层结构也是 基于 数组+链表 实现的,数组用于存储链表的链表头,链表节点包含 key、value、hash值、next变量等,每次新插入的元素都会添加到对应下标的链表末尾,当链表长度超过 8 时,链表将转化为红黑树。
  2. ConcurrentHashMap 跟 Hashtable 一样是线程安全的,但是 ConcurrentHashMap 的锁是细粒度锁,需要进行修改操作时,它只对数组的一项进行加锁,而不是对整个数组加锁。

4.2 应用场景

多线程情况下对 HashMap 进行添加、删除操作时使用。虽然 Hashtable 和 ConcurrentHashMap 的应用场景差不多,但是还是尽量使用 ConcurrentHashMap。

5.ArrayList和LinkedList的区别?原理?应用场景?

5.1 ArrayList原理

小学生也能看懂的ArrayList底层原理_怎么看arraylist的底层_星空是梦想的博客-CSDN博客

ArrayList 底层使用 char数组 实现,除了数组,还有一个记录数组大小的 size 变量,添加数组元素时,当数组已满时,会进行扩容,将容量扩大为 1.5 倍。

5.2 LinkedList原理

学透 LinkedList 底层实现原理,狂虐面试官!_星空是梦想的博客-CSDN博客

LinkedList 底层使用 双向链表 实现,LinkedList类中有头节点(first)、尾节点(last)和记录链表长度的 size。

LinkedList 的节点结构为:item(存储节点值)、next(存储下一个节点)和 prev(存储上一个节点)。

5.3 两者区别

  • ArrayList 使用char数组实现,LinkedList 使用链表实现;
  • ArrayList 和 LinkedList 都是非线程安全的;
  • 随机 get 和 set 访问,ArrayList 比 LinkedList 好,因为 LinkedList 访问要移动指针;
  • 插入和删除操作,LinkedList 比 ArrayList 好,因为 ArrayList 要大量移动数据。

5.4 应用场景

  • 如果涉及到“栈”、“队列”、“链表”等操作,应该选择使用 List;

  • 如果需要快速删除、插入元素,应该使用 LinkedList ;

  • 如果需要快速访问元素,应该使用 ArrayList。

6.String、StringBuilder和StringBuffer的区别,应用场景

6.1 运行速度比较

运行速度测试代码

StringBuilder > StringBuffer > String

解释:

创建 String 对象后,因为 String 对象是不可变的,每次需要改变 String 的值,都要重新建立一个新对象,再将引用指向该对象,浪费内存,而且无用对象多了 jvm 会引发 GC,系统就变慢了。

StringBuilder 和 StringBuffer 是可变的字符串变量,在进行字符串拼接时,不会创建新对象,而是直接对原对象进行操作,速度上比 String 拼接快很多;另外,由于 StringBuffer 底层实现都加了 synchronized 修饰,执行速度上稍微比 StringBuilder 慢一点。

6.2 是否线程安全

  • StringBuilder 是线程不安全的;
  • StringBuffer 是线程安全的。

解释:

StringBuffer 底层的很多方法(例如append 和 inser)都使用 synchronized 关键字修饰,保证了多线程情境下的线程安全。

6.3 适用场景

  • String:适用于少量字符串操作情况。
  • StringBulider:适用于单线程在字符串缓存区进行大量操作。
  • StringBuffer:适用于多线程在字符串缓存区进行大量操作。

6.4 底层实现

StringBuilder和StringBuffer:

  1. 底层使用 char数组 实现;
  2. append(str)方法:内部先判断 str 是否为空,为空的话在 char数组后添加“null”,不为空则将 str 拷贝到 char数组。

7.ArrayList和Vector的区别

7.1 相同点

ArrayList 和 Vector 都实现了List接口,都是有序可重复集合。

7.2 不同点

  • 线程安全:Vector是 线程安全 的,也就是说是它的方法之间是线程同步的;ArrayList是 线程序不安全 的,它的方法之间是线程不同步的。
  • 动态扩容倍数:当存储空间不足时,两种都会动态增长。Vector增长为原来的 2 倍,ArrayList增加为原来的 1.5 倍。

8.Collection下有哪些子类

List

  • Vector
  • ArrayList
  • LinkedList

Set

  • HashSet
  • TreeSet

9.Comparable和Comparator的区别

  1. Comparable和Comparator都可以实现对象比较和对象集合的排序。
  2. 类通过实现Comparable接口和compareTo方法,实现比较逻辑,可以实现和同个类对象进行比较,通过Collections.sort(List)实现类集合的排序。
  3. Comparator可以不改变类本身而进行比较和排序,需要创建另一个类实现该接口,然后实现compareTo方法,对目标类进行比较,另外,可以使用Collections.sort(List, Comparator)对类集合进行排序。

 

 

 

 

 

 

 

 

相关文章:

Java数据结构面试题以及答案

本专栏记录Java后端开发相关的面试题,欢迎大家阅读专栏的其他文章。 目录 1.B树和B树的区别?B树和B树的优点分别是? 2.排序算法的种类和复杂度 3.HashMap和Hashtable的原理、区别、应用场景 4.ConcurrentHashMap的原理、应用场景 5.Arra…...

Java——它要求用户输入一个整数(实际上是一个字符串),然后计算该整数的平方值,并将结果输出。

这是一个Java程序,它要求用户输入一个整数(实际上是一个字符串),然后计算该整数的平方值,并将结果输出。程序的基本流程如下: 首先,声明并初始化变量data和result,它们的初始值都为…...

【科研论文配图绘制】task6直方图绘制

【科研论文配图绘制】task6直方图绘制 task6 主要掌握直方图的绘制技巧,了解直方图含义,清楚统计指标的添加方式 1.直方图 直方图是一种用于表示数据分布和离散情况的统计图形,它的外观和柱形图相近,但它所 表达的含义和柱形图…...

Leetcode刷题:395. 至少有 K 个重复字符的最长子串、823. 带因子的二叉树

Leetcode刷题:395. 至少有 K 个重复字符的最长子串、823. 带因子的二叉树 1. 395. 至少有 K 个重复字符的最长子串算法思路参考代码和运行结果 2. 823. 带因子的二叉树算法思路参考代码和运行结果 1. 395. 至少有 K 个重复字符的最长子串 题目难度:中等 标签&#…...

java八股文面试[多线程]——Synchronized的底层实现原理

笔试:画出Synchronized 线程状态流转实现原理图 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized 翻译为中文的意思是同步,也称之为”同步锁“。 synchronized的作用是保证在同一时刻, 被修饰的代码块或方…...

C#,《小白学程序》第三课:类、类数组与排序

类class把数值与功能巧妙的进行了结合&#xff0c;是编程技术的主要进步。 下面的程序你可以确立 分数 与 姓名 之间关系&#xff0c;并排序。 1 文本格式 /// <summary> /// 同学信息类 /// </summary> public class Classmate { /// <summary> /…...

史上最全AP、mAP详解与代码实现

文章目录 前言一、mAP原理1、mAP概念2、准确率3、精确率4、召回率5、AP: Average Precision 二、mAP0.5与mAP0.5:0.951、mAP0.52、mAP0.5:0.95 三、mAP代码实现1、真实标签json文件格式2、模型预测标签json文件格式3、mAP代码实现4、mAP结果显示 四、模型集成mAP代码1、模型mai…...

百数应用中心——生产制造管理解决方案解决行业难题

传统生产制造业面临着许多挑战&#xff0c;其中一些主要问题包括效率低下、交期压力大、需求预测不准确、生产模式复杂、异常响应慢、库存高和计划脱节等。这些问题不仅影响了生产效率和质量&#xff0c;也导致了不必要的成本和客户满意度下降。 生产制造管理应用对于企业的生产…...

《存储IO路径》专题:IO虚拟化初探

大家好&#xff0c;欢迎来到今天的科技小课堂。今天我们要聊聊的是一项非常有趣且实用的技术——I/O虚拟化&#xff08;Input/Output Virtualization&#xff0c;简称IOV&#xff09;。想象一下&#xff0c;如果把物理硬件资源比作一道丰盛的大餐&#xff0c;那么IOV就是那位神…...

Springboot2.0快速入门(第一章)

目录 一&#xff0c;SpringBoot简介1.1&#xff0c;回顾什么是Spring1.2&#xff0c;Spring是如何简化Java开发的1.3&#xff0c;什么是SpringBoot 二&#xff0c;Hello&#xff0c;World2.1&#xff0c;准备工作2.2&#xff0c;创建基础项目说明2.3&#xff0c;创建第一个Hell…...

Flink流批一体计算(17):PyFlink DataStream API之StreamExecutionEnvironment

目录 StreamExecutionEnvironment Watermark watermark策略简介 使用 Watermark 策略 内置水印生成器 处理空闲数据源 算子处理 Watermark 的方式 创建DataStream的方式 通过list对象创建 ​​​​​​使用DataStream connectors创建 使用Table & SQL connectors…...

javeee spring cglib动态代理

cglib动态代理 依赖 <dependency><groupId>cglib</groupId><artifactId>cglib-nodep</artifactId><version>3.2.4</version></dependency>代理类 package com.test.cglibProxy;import net.sf.cglib.proxy.Enhancer; import …...

【Docker】Dockerfile介绍

Dockerfile是一个文本文件&#xff0c;其中包含了一系列的指令&#xff0c;用于构建Docker镜像。这些指令可以用来自动化镜像的构建过程&#xff0c;并创建自定义镜像。 以下是一些常用的Dockerfile指令及其功能&#xff1a; FROM&#xff1a;指定基础镜像。这是Dockerfile中…...

两个hdfs之间迁移传输数据

本文参考其他大数据大牛的博文做了整理和实际验证&#xff0c;主要解决hdfs跨集群复制/迁移问题。 在hdfs数据迁移时总会涉及到两个hdfs版本版本问题&#xff0c;致力解决hdfs版本相同和不同两种情况的处理方式&#xff0c;长话短说&#xff0c;进正文。 distcp: hadoop自带的…...

C++ 缺失的数字

有n个数字&#xff0c;值就是1~n&#xff0c;现发现丢失了2个数字&#xff0c;请你根据剩余的n-2个数字&#xff0c;编程计算一下&#xff0c;缺失的是哪两个数字呢&#xff1f; &#xff08;使用桶排&#xff0c;标记输入过的数字&#xff09; #include<bits/stdc.h> us…...

JVM,JRE和JDK的区别

JVM&#xff0c;JRE和JDK的区别 JVM(Java Virtual Machine&#xff0c;Java虚拟机)JREJRE目录结构 JDK JVM(Java Virtual Machine&#xff0c;Java虚拟机) Java程序的跨平台特性主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行&#xff0c;Java虚拟机中…...

合宙Air724UG LuatOS-Air LVGL API控件--日历 (Calendar)

日历 (Calendar) LVGL 提供了一个用来选择和显示当前日期的日历控件。 示例代码 – 高亮显示的日期 highlightDate lvgl.calendar_date_t() – 日历点击的回调函数 – 将点击日期设置高亮 function event_handler(obj, event) if event lvgl.EVENT_VALUE_CHANGED then da…...

[python]问题:pandas处理excel里的多个sheet

Pandas 可以很容易地处理 Excel 文件中的多个工作表。首先,你需要安装 pandas 和 openpyxl(用于读取 .xlsx 文件)库。你可以使用以下命令安装这两个库: pip install pandas openpyxl接下来,你可以使用以下代码来处理 Excel 文件中的多个工作表: import pandas as pd# 读…...

[MySQL] MySQL基础操作汇总

文章目录 前言1.数据库概述1.1 数据库相关概念1.2登录MySQL&#xff1a;1.3 MySQL常用命令1.4表&#xff1a;1.5SQL语句分类&#xff1a; 2.CRUD操作2.1 DQL1.基础查询基础查询&#xff08;简单查询&#xff09;条件查询&#xff1a;排序查询&#xff1a;分组查询&#xff1a;分…...

C语言每日一题 ---- 打印从1到最大的n位数(Day 1)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C语言天天练 &#x…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...