Java面试:集合框架体系
一、ArrayList
1.数组(Array)
是一种用连续的内存空间存储相同数据类型数据的线性数据结构
数组如何获取其他元素的地址值?
寻址公式:a[i] = baseAddress + i * dataTypeSize
- baseAddress:数组的首地址
- dataTypeSize:代表数组中元素类型的大小,例如int型,dataTypeSize = 4个字节
面试题1:为什么数组索引从0开始呢?假如从1开始不行吗?
- 在根据数组索引获取元素的时候,会用索引和寻址公式来计算内存所对应的元素数据,寻址公式是:数组的首地址+索引 * 存储数据的类型大小
- 如果数组的索引从1开始,寻址公式中就需要增加一次减法操作,对于CPU来说就多了一次指令,影响性能
面试题2:操作数组的时间复杂度
- 查找:随机查询(根据索引查询) O(1)
- 查找:未知索引查询 O(n)
- 查找:未知索引查询(将数组排序后) 二分查找O(log n)
- 插入/删除:O(n)
2.ArrayList源码分析
(1)成员变量
(2)构造方法
(3)添加和扩容操作
面试题1:ArrayList底层的实现原理是什么?
- ArrayList底层是用动态的数组实现的
- ArrayList初始容量为0,当第一次添加数据的时候才会初始化容量为10
- ArrayList在进行扩容的时候是原来容量的1.5倍,每次扩容都需要拷贝数组
- ArrayList在添加数据的时候:
- 确保数组已使用长度(size)加1之后足够存下下一个数据;
- 计算数组的容量,如果当前数组已使用长度+1后的长度大于当前的数组长度,则调用grow方法扩容(原来的1.5倍);
- 确保新增的数据有地方存储之后,则将新元素添加到位于size的位置上;
- 返回添加成功布尔值。
面试题2:ArrayList list = new ArrayList(10)中的list扩容几次?
- 该语句只是声明和实例了一个ArrayList,指定了容量为10,未扩容
面试题3:如何实现数组和List之间的转换?
- 数组转List,使用JDK中java.util.Arrays工具类的asList方法
- List转数组,使用List的toArray方法。无参toArray方法返回Object数组,传入初始化长度的数组对象,返回该对象数组
追问:用Arrays.asList转List后,如果修改了数组内容,list受影响吗?List用toArray转数组后,如果修改了List内容,数组受影响吗?
- Arrays.asList转换List之后,如果修改了数组的内容,list会受影响,因为它的底层使用的是Arrays类中的一个内部类ArrayList来构造的集合,在这个集合的构造器中,把我们传入的这个集合进行了包装而已,最终指向的都是同一个内存地址
- list用了toArray转数组后,如果修改了list内容,数组不会影响,当调用了toArray以后,在底层是其进行了数组的拷贝,与原来的元素无关,所以即使list修改了以后,数组也不受影响
二、LinkedList
1.链表
查询 | 新增删除 | |
单向链表 | 头O(1),其他O(n) | 头O(1),其他O(n) |
双向链表 | 头尾O(1),其他O(n), 给定节点O(1) | 头尾O(1),其他O(n), 给定节点O(1) |
2.LinkedList源码分析
面试题1:ArrayList和LinkedList的区别是什么?
(1)底层数据结构
- ArrayList是动态数组的数据结构实现
- LinkedList是双向链表的数据结构实现
(2)操作数据效率
- ArrayList按照下标查询的时间复杂度O(1)【内存是连续的,根据寻址公式】,LinkedList不支持下表查询
- 查找(未知索引):ArrayList需要遍历,链表也需要遍历,时间复杂度都是O(n)
- 新增和删除:
- ArrayList尾部插入和删除为O(1),其他为O(n)
- LinkedList头尾节点增删为O(1),其他为O(n)
(3)内存空间占用
- ArrayList底层是数组,内存连续,节省内存
- LinkedList是双向链表需要存储数据,和两个指针,更占用内存
(4)线程安全
- ArrayList和LinkedList都不是线程安全的
- 如果需要保证线程安全,有两种方案:
- 在方法内使用,局部变量则是线程安全的
- 使用线程安全的ArrayList和LinkedList
补充:线程安全是编程中的术语,指某个函数、函数库在并发环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。
三、HashMap
1.二叉树
2.红黑树
3.散列表
4.HashMap源码分析
(1)常见属性
(2)添加数据
(3)扩容
(4)寻址(不会)
面试题1:说一下HashMap的实现原理?
- 数据结构:底层使用hash表,即数组和链表或红黑树
- 当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
- 存储时,如果出现hash值相同的key:
- 如果key相同,则覆盖原始值;
- 如果key不同(出现冲突),则将当前的key-value放入链表或红黑树中
- 获取时,直接找到hash值对应的下标。在进一步判断key是否相同,从而找到对应值
补充:链表的长度大于8且数组长度大于64时,转换为红黑树
追问:HashMap的jdk1.7和jdk1.8有什么区别?
- JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可
- jdk1.8在解决哈希冲突时,当链表长度大于阈值(默认为8)且数组长度达到64时,将链表转化为红黑树,以减少搜索时间。扩容resize()时,红黑树拆分成的树的结点数小于等于临界值6个,则退化成链表
面试题2:HashMap的put方法的具体流程?
- 判断键值对数组table是否为空或为null,否则执行resize()进行扩容(初始化)
- 根据键值key计算hash值得到数组索引
- 判断table[i] == null条件成立,直接新建节点添加
- 如果table[i] == null不成立:
- 判断table[i]的首个元素是否和key一样,如果相同直接覆盖value
- 判断table[i]是否为treeNode(即红黑树),如果是红黑树,则直接在树中插入键值对
- 遍历table[i],链表的尾部插入数据,然后判断链表长度是否大于8,如果大于8,将链表转换为红黑树,在红黑树中执行插入操作,遍历过程中若发现key已经存在则直接覆盖value
- 插入成功后,判断实际存在的键值对数量size是否超过了最大容量,如果超过,进行扩容
面试题3:讲一讲HashMap的扩容机制
- 在添加元素或初始化的时候需要调用resize方法进行扩容,第一次添加数据初始化数组长度为16,以后每次扩容都是达到了扩容阈值(数组长度*0.75)
- 每次扩容的时候,都是扩容之前容量的两倍
- 扩容之后,会新创建一个数组,需要把老数组中的数据挪动到新的数组中:
- 没有hash冲突的节点,则直接使用e.hash&(newCap - 1)计算新数组的索引位置
- 如果是红黑树,进行红黑树的添加
- 如果是链表,则需要遍历链表,可能需要拆分链表,判断(e.hash&oldCap)是否为0,该元素的位置要么停留在原始位置,要么移动到(原始位置+增加的数组大小)这个位置上
面试题4:hashMap的寻址算法(不会)
相关文章:
Java面试:集合框架体系
一、ArrayList 1.数组(Array) 是一种用连续的内存空间存储相同数据类型数据的线性数据结构 数组如何获取其他元素的地址值? 寻址公式:a[i] baseAddress i * dataTypeSize baseAddress:数组的首地址dataTypeSize&am…...
【八股文】ArrayList和LinkedList的区别
先讲讲两者是如何实现的 ArrayList public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {transient Object[] elementData; private int size; } 通过源码可以看出,ArrayLis…...
sentinel限流算法
限流算法:固定窗口算法、滑动时间窗口、令牌桶和漏桶这四种常见限流算法的原理: 限流算法原理 固定窗口: 固定窗口算法将时间划分为固定大小的窗口,并在每个窗口内限制请求的数量。在每个窗口开始时,计数器重置&#…...
Spring生态下的中台架构设计:如何构建可扩展业务系统?
一、中台战略的架构觉醒 在数字化转型的浪潮中,企业面临的核心矛盾日益凸显:前端业务的快速迭代需求与后端系统刚性架构之间的矛盾。中台架构的提出,本质上是对传统单体架构和过度微服务化的辩证扬弃。Spring生态以其模块化设计理念,恰好为中台建设提供了绝佳的技术土壤。…...
Project回调函数qsort②进阶应用
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h>//库函数strcmp头文件 //使用qsort排序结构体 struct Stu { char name[20]; int age; }; //按照年龄排序 int cmp_stu_by_age(const void* e1,const void* e2) { return ((struc…...
【推荐项目】052-用水监控管理系统
052-用水监控管理系统 介绍 用水监控管理系统 springboot java vuejs jdk1.8 当然,以下是一个简洁的用水监控管理系统的功能模块划分,基于Spring Boot(JDK 1.8)后端和Vue.js前端: 用水监控管理系统功能模块 后端&…...
Hive SQL 精进系列:PERCENTILE_APPROX 搞定分位数
目录 一、引言二、percentile_approx 函数基础2.1 基本语法参数解释返回值简单示例 三、应用场景3.1 数据分析与报告3.2 数据清洗与异常值检测3.3 性能监控与优化 四、使用注意事项4.1 数据类型要求4.2 精度与性能平衡4.3 空值处理 五、总结 一、引言 百分位数作为一种常用的统…...
使用Hbuilder发布小程序显示发布失败?
接受了一个新uniapp项目 但是在Hbuilder中发行报错 小程序发行失败 试了几次还是不行 写代码的人也走了,头疼。 不用Hbuilder小程序的主包体积又太大哎 开发工具无法上传~ 后来想看一下 这个发布失败到底有没有生成打包好的文件 如果生成了可以试一下 直接导入到微信…...
甲骨文找回二次验证的方法(超简单)
因为更换手机丢失了二次验证。 然后给客服沟通,获得了找到二次验证的办法,希望对你有用。 1、登录到账号登陆界面,查看地址栏当中自己的IDCE地址(yourIDCS_Stripe_here)部分,并复制。 https://idcs-yourID…...
Tcp网络通信的基本流程梳理
先来一张经典的流程图 接下介绍一下大概流程,各个函数的参数大家自己去了解加深一下印象 服务端流程 1.创建套接字:使用 socket 函数创建一个套接字,这个套接字后续会被用于监听客户端的连接请求。 需要注意的是,服务端一般有俩…...
C++相关基础概念之入门讲解(上)
1. 命名空间 C中的命名空间(namespace)是用来避免命名冲突问题的一种机制。通过将类、函数、变量等封装在命名空间中,可以避免不同部分的代码中出现相同名称的冲突。在C中,可以使用namespace关键字来定义命名空间。 然后我们在调…...
Redis能否替代MySQL作为主数据库?深入解析两者的持久化差异与适用边界——基于AOF持久化与关系型数据库的对比
一、Redis的持久化机制与可靠性分析 AOF持久化原理与策略 Redis的AOF(Append Only File)通过记录所有写操作命令实现持久化,支持三种策略: **always模式**:每条命令执行后立即同步到磁盘,理论上数据丢失…...
Hive函数大全:从核心内置函数到自定义UDF实战指南(附详细案例与总结)
目录 背景一、Hive函数分类与核心函数表1. 内置函数分类2. 用户自定义函数(UDF)分类二、常用函数详解与实战案例1. 数学函数2. 字符串函数3. 窗口函数4. 自定义UDF实战三、总结与优化建议1. 核心总结2. 性能优化建议3. 常问问题背景 Hive作为Hadoop生…...
如何修改 Ubuntu 软件源(镜像源)
如何修改 Ubuntu 软件源(镜像源) 前言 在使用 Ubuntu 时,默认的软件源可能速度较慢,影响软件安装和系统更新的效率。我们可以通过修改 sources.list 文件或使用图形界面更换更快的镜像源,提升软件包管理的速度。 本…...
在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢
文章目录 引言1. 什么是DeepSeek?2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代,企业越来越重视数据的价值。为了…...
AP AR
混淆矩阵 真实值正例真实值负例预测值正例TPFP预测值负例FNTN (根据阈值预测) P精确度计算:TP/(TPFP) R召回率计算:TP/(TPFN) AP 综合考虑P R 根据不同的阈值计算出不同的PR组合, 画出PR曲线,计算曲线…...
Vue 中的 MVVM、MVC 和 MVP 模式深度解析
文章目录 1. 模式概览与核心概念1.1 模式定义1.2 架构对比图 2. MVC 模式详解2.1 MVC 流程图2.2 Vue 中的 MVC 实现 3. MVP 模式详解3.1 MVP 流程图3.2 Vue 中的 MVP 实现 4. MVVM 模式详解4.1 MVVM 流程图4.2 Vue 中的 MVVM 实现 5. 模式对比分析5.1 职责对比5.2 通信方式对比…...
WVP前后端部署
使用默认的构建,能够直接访问18080,我以为二者是一起的。实际上这不影响前后端分离。 前端服务器 构建war之后,部署到另外一台机器上,比如使用apache2。 后端服务器 修改src/main/resources/static/static/js/config.js&#…...
VSTO(C#)Excel开发9:处理格式和字体
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
蓝耘MaaS平台:阿里QWQ应用拓展与调参实践
摘要:本文深入探讨了蓝耘MaaS平台与阿里QWQ模型的结合,从平台架构、模型特点到应用拓展和调参实践进行了全面分析。蓝耘平台凭借其强大的算力支持、弹性资源调度和全栈服务,为QWQ模型的高效部署提供了理想环境。通过细化语义描述、调整推理参…...
【统计学相关笔记】2. 多元正态的Cochran定理
fisher 引理 如何说明一个线性变换和二次型独立: 二次型矩阵和线性变换阵乘积0即可。...
Vuex 基础概念与环境搭建
Vuex 是实现数据集中式状态管理的插件。所有组件共享 Vuex 中的数据,当任意组件修改数据时,其他组件会同步更新。与全局事件总线的区别在于: 全局事件总线:数据传递但未真正共享Vuex:数据存储在中央仓库,实…...
使用 BookMarkHub 插件进行书签同步
前言: 通过 BookMarkHub 插件,你可以方便地将书签同步到 GitHub Gist,实现跨设备管理书签。以下是详细的步骤: 使用 BookMarkHub 插件进行书签同步 1. 安装 BookMarkHub 插件2. 获取 GitHub Token3. 获取 Gist ID4. 配置 BookMarkHub 插件5.完…...
用Lua脚本实现Redis原子操作
1. 环境准备 依赖:在pom.xml中添加Spring Data Redis: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>配置RedisTemplate&#…...
【算法】位运算
文章目录 1. 常见位运算总结(图片包含五道算法题)2. leetcode 面试题 01.01 判断字符是否唯一2.1 题目2.2 思路2.3 代码 3.leetcode 268. 丢失的数字3.1 题目3.2 思路3.3 代码 4. leetcode 371.两整数之和4.1 题目4.2 思路4.3 代码 5.leetcode 137.只出现…...
HTML块级元素和内联元素(简单易懂)
在HTML中,元素可以分为块级元素(Block-level elements)和内联元素(Inline elements)。这两类元素在页面布局和样式应用上有不同的特点和用途。 一、块级元素(Block-level elements) 1. 定义 …...
【论文精读】DifFace: Blind Face Restoration with Diffused Error Contraction
文章目录 0.前言1.当前问题2.怎么解决问题3.具体做法(Method)3.1 受什么的启发?(Motivation)3.2具体的模型设计(Design)3.3 整体算法 4.实验效果4.1 Synthetic(CelebA-Test)4.2 Real World (LFW, WebPhoto, and WIDER) 0.前言 这篇文章是被 …...
[新能源]新能源汽车快充与慢充说明
接口示意图 慢充接口为交流充电口(七孔),快充接口为直流充电口(九孔)。 引脚说明 上图给的是充电口的引脚图,充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…...
AI智能分析网关V4将HTTP消息推送至安防监控视频汇聚EasyCVR平台的操作步骤
TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入,可兼容市面上常…...
程序代码篇---STM32串口通信
文章目录 前言1. 头文件和全局变量2. 串口1初始化函数3. 串口1发送字节函数4. 串口1发送字符串函数5. 串口1发送数字函数6. 重定义fputc函数7. 串口数据解析函数8. 串口2中断服务程序总结 前言 本次将介绍一个基于STM32微控制器的串口通信实现,包含了串口的初始化、…...
PECL(Positive Emitter-Coupled Logic)电平详解
一、PECL电平的定义与核心特性 PECL(正射极耦合逻辑)是一种基于 射极耦合逻辑(ECL)技术 的高速差分信号标准,采用 正电源供电(如5V或3.3V)。其核心特性包括 高速传输、低噪声、强抗干扰能力&am…...
1、操作系统引论
一、操作系统 会使用linux系统 建议大家先学会linux的基础指令,可以看菜鸟教程网站进行学习。 1、各种定义 操作系统定义 管理计算机的 硬件 和软件资源, 能对各类作业进行调度,方便用户使用计算机的程序集合。操作系统运行在内核态…...
L1-7 统一命名规范(java)
你所在的公司刚刚招收了几位程序员,然而这些程序员之前在不同的公司工作,所以他们习惯的变量命名规范可能存在差异,需要让他们都习惯公司要求的命名规范,然而这样可能会降低他们的工作效率。 你的上司找到了你,希望你…...
LVS + Keepalived 高可用集群
一、LVSKeepalived 原理 1.1.LVS 负载均衡原理 LVS(Linux Virtual Server)是一种基于 Linux 内核的负载均衡技术,它通过 IPVS(IP Virtual Server)模块来实现。LVS 可以将客户端的请求分发到多个后端服务器上…...
使用MySQL的Binlog来同步数据到ES当中
一、技术选型与核心原理 核心组件 • MySQL Binlog:ROW模式记录数据变更事件(INSERT/UPDATE/DELETE),提供原子性变更流 • Canal/OpenReplicator:伪装MySQL Slave订阅Binlog(本文以Canal 1.1.6为例…...
沐数科技数据开发岗笔试题2025
描述性统计 标准差 答案: A 解析: 标准差 衡量数据集中数值变化或离散程度的一种度量。它反映了数据集中的各个数值与数据集的平均值(均值)之间的偏离程度。标准差越大,表明数据的分布越分散;标准差越小,表明数据…...
什么是 HTML?
HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言: HyperText Markup LanguageHTML 不是一种编程语言,而是一种标记语言标记语言是一套标记标签 (markup tag)HTML 使用标记标签来描述网页HTML 文档包含了HTML 标签及文本内容HTML文档也叫做 web 页面 HT…...
coding ability 展开第四幕(滑动指针——巩固篇)超详细!!!!
文章目录 前言水果成篮思路 找到字符串中所有字母异位词思路 串联所有单词的子串思路 最小覆盖子串思路 总结 前言 本专栏上一篇博客,带着大家从认识滑动窗口到慢慢熟悉 相信大家对滑动窗口已经有了大概的认识 其实主要就是抓住——一段连续的区间 今天来学习一些滑…...
【Linux我做主】基础命令完全指南上篇
Linux基础命令完全指南【上篇】 Linux基础命令完全指南github地址前言命令行操作的引入Linux文件系统树形结构的根文件系统绝对路径和相对路径适用场景Linux目录下的隐藏文件 基本指令目录和文件相关1. ls2. cd和pwdcdpwd 3. touch4. mkdir5. cp6. mv移动目录时覆盖写入的两种特…...
101.在 Vue 3 + OpenLayers 使用 declutter 避免文字标签重叠
1. 前言 在使用 OpenLayers 进行地图开发时,我们经常需要在地图上添加点、线、区域等图形,并给它们附加文字标签。但当地图上的标注较多时,文字标签可能会发生重叠,导致用户无法清晰地查看地图信息。 幸运的是,OpenL…...
面试vue2开发时怎么加载编译速度(webpack)
可以输入命令获取默认 webpack 设置 vue inspect > set.js 1.使用缓存 configureWebpack: {cache: {type: filesystem, // 使用文件系统缓存类型buildDependencies: {config: [__filename] // 缓存依赖,例如webpack配置文件路径}}}, 2.启用 vue-loader (测试明…...
大模型推理后JSON数据后处理
大模型推理后JSON数据后处理 flyfish LLM 通常指的是 Large Language Model,也就是大语言模型,针对 JSON格式的输出,可以在大模型推理前、推理中、推理后进行处理,这里是在推理后进行处理。 针对模型输出结果,可采用结…...
面试总结:2024前端面试题
前几天写了一篇对面试官的吐槽,今天来总结一下最近面试的一些题目。题目不分具体公司了,毕竟题目的重复率不会特别高,就多做准备吧。 技术面还是离不开“八股文”,个人不喜欢也没办法,硬着头皮上,下面分几个…...
剑指 Offer II 083. 没有重复元素集合的全排列
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20083.%20%E6%B2%A1%E6%9C%89%E9%87%8D%E5%A4%8D%E5%85%83%E7%B4%A0%E9%9B%86%E5%90%88%E7%9A%84%E5%85%A8%E6%8E%92%E5%88%97/README.md 剑指 Offer II 083. 没…...
SFT数据处理部分的思考
SFT数据及处理的业内共识 1.prompt的质量和多样性远重要于数据量级,微调一个 30 b 量级的base model只需要 10 w 量级的数据即可 参考:《LIMA:Less Is More for Alignment》 2.合成数据很重要!一般需要通过…...
c++三级(枚举问题)
菲波那契数列(2) 题目描述 菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。 给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。 输入格式 第1行是测试数据的组数n,后面跟着n行…...
vb编程有哪些相关的IDE开发工具vb.net,Basic语言?
在编程领域,VB 系列拥有丰富多样的 IDE 开发工具,为不同需求的开发者提供了广泛的选择,以下为你详细介绍: 兼容 VB6 源码的开发工具 twinbasic:属于 VB7 系列,它几乎能 100% 兼容 VB6 源码,这…...
XSS跨站脚本攻击
1、什么是XSS攻击 XSS全称(Cross Site Scripting)跨站脚本攻击,为了避免与css层叠样式表名称冲突,所以改为xss,是最常见的web应用程序安全漏洞之一。它指的是恶意攻击者往web页面里插入恶意html代码(JavaS…...
Uniapp 开发 App 端上架用户隐私协议实现指南
文章目录 引言一、为什么需要用户隐私协议?二、Uniapp 中实现用户隐私协议的步骤2.1 编写隐私协议内容2.2 在 Uniapp 中集成隐私协议2.3 DCloud数据采集说明2.4 配置方式3.1 Apple App Store3.2 Google Play Store 四、常见问题与解决方案4.1 隐私协议内容不完整4.2…...
mapbox高阶,结合threejs(threebox)添加extrusion挤出几何体,并添加侧面窗户贴图和楼顶贴图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox extrusion挤出几何体二、🍀…...