Java面试题七
一、Java中的集合框架是如何组织的?列举几个常用的集合类。
Java中的集合框架是一个设计用来存储和操作对象集合的统一架构。它主要由两大接口派生出来:Collection和Map。这两个接口及其子接口和实现类共同构成了Java集合框架的主体。
集合框架的组织结构
-
Collection接口:
- 是最基本的集合接口,代表一组元素的集合。
- 它有三个主要的子接口:
List、Set和Queue。
-
List接口:
- 代表有序的、可重复的元素集合。
- 常见的实现类有:
ArrayList、LinkedList和Vector。
-
Set接口:
- 代表不可重复的集合,即集合中不允许有重复元素。
- 常见的实现类有:
HashSet、LinkedHashSet和TreeSet。
-
Queue接口:
- 是一种特殊的集合,主要用于维护元素的顺序,通常按照先进先出(FIFO)的原则进行元素的插入和移除。
- 常见的实现类有:
LinkedList(作为FIFO队列)、PriorityQueue(优先队列)和ArrayDeque。
-
Map接口:
- 存储键值对的集合,键不允许重复,但值可以重复。
- 常见的实现类有:
HashMap、LinkedHashMap、TreeMap和Hashtable。
常用的集合类
-
ArrayList:
- 基于动态数组实现的列表,支持快速随机访问,但在频繁插入和删除元素时性能可能有所下降。
-
LinkedList:
- 基于链表实现的列表,支持在任意位置插入和删除元素,但在访问特定位置的元素时可能会慢一些。同时,它也可以作为FIFO队列使用。
-
HashSet:
- 基于哈希表实现的集合,不允许重复元素,提供了快速的查找和插入操作。
-
TreeSet:
- 基于红黑树实现的集合,能够保持元素的排序状态,不允许重复元素。
-
HashMap:
- 基于哈希表实现的键值对集合,提供了快速的插入、删除和查找操作。键和值可以为
null,但不保证键值对的顺序。
- 基于哈希表实现的键值对集合,提供了快速的插入、删除和查找操作。键和值可以为
-
TreeMap:
- 基于红黑树实现的键值对集合,能够保持键的自然顺序或指定的比较器顺序,不允许重复的键。
-
LinkedHashMap:
- 继承自
HashMap,但保留了元素的插入顺序或访问顺序。
- 继承自
-
Vector:
- 类似于
ArrayList的动态数组类,但具有线程安全的特性。所有方法都是同步的,适用于多线程环境,但性能可能不如ArrayList。
- 类似于
-
Hashtable:
- 一个早期的实现了
Map接口的类,类似于HashMap,但所有方法都是同步的,适用于多线程环境。然而,由于其所有方法都进行同步处理,可能会导致性能上的一些损失。
- 一个早期的实现了
-
PriorityQueue:
- 基于堆实现的优先队列,元素按照优先级进行排序。插入元素和获取最高优先级元素的操作具有较高的效率。
这些集合类和接口提供了不同的功能和性能特点,开发者可以根据具体的需求选择适当的集合类来使用。
二、ArrayList和LinkedList有什么区别?在什么场景下更适合使用?
ArrayList和LinkedList是Java集合框架中两个常用的实现List接口的类,它们各自具有不同的特点和适用场景。
数据结构与内存管理
-
ArrayList:
- 基于动态数组实现。
- 元素在内存中是连续存储的,因此具有较快的随机访问速度。
- 当添加元素到ArrayList时,如果数组已满,则需要创建一个更大的数组,并将现有元素复制到新数组中,这可能会导致一定的性能开销。
- 提供了动态的增加和减少元素的功能,但需要维护一个数组来存储元素,并可能涉及数组的扩容和复制。
-
LinkedList:
- 基于链表实现,具体来说是双向链表。
- 元素在内存中不是连续存储的,每个元素(节点)包含数据部分以及指向前一个节点和后一个节点的引用。
- 插入和删除操作只需要调整相邻节点的引用,因此具有较高的效率,特别是在列表的头部或尾部进行操作时。
- 由于链表节点是分散存储的,随机访问速度较慢,因为需要从头节点开始遍历链表以找到目标元素。
性能特点
-
ArrayList:
- 随机访问(通过索引访问元素)性能较高,因为可以直接通过数组下标访问元素。
- 插入和删除操作在元素数量较多时可能效率较低,因为需要移动插入或删除点之后的所有元素。
-
LinkedList:
- 插入和删除操作(特别是在列表两端)性能较高,因为只需要调整相邻节点的引用。
- 随机访问性能较低,因为需要从头节点开始遍历链表。
适用场景
-
ArrayList:
- 适用于需要频繁进行随机访问或修改操作,而对插入和删除操作要求不高的场景。
- 例如,存储用户列表、缓存数据等。
- 当元素数量在初始化时就能确定或大致确定时,使用ArrayList也是合适的。
-
LinkedList:
- 适用于需要频繁进行插入和删除操作,而对随机访问要求不高的场景。
- 例如,实现栈、队列等数据结构。
- 由于LinkedList可以在任意位置进行高效的添加/删除操作,因此也适用于需要有序集合并对元素进行排序的场景。
总结
ArrayList和LinkedList各有优劣,选择哪个更适合取决于具体的使用场景。如果需要频繁进行随机访问操作,ArrayList是更好的选择;而如果需要频繁进行插入和删除操作,特别是对列表两端进行操作时,LinkedList则更具优势。在选择时,还需要考虑数据量和操作类型对性能的影响,以及线程安全性和内存占用等因素。
相关文章:
Java面试题七
一、Java中的集合框架是如何组织的?列举几个常用的集合类。 Java中的集合框架是一个设计用来存储和操作对象集合的统一架构。它主要由两大接口派生出来:Collection和Map。这两个接口及其子接口和实现类共同构成了Java集合框架的主体。 集合框架的组织结…...
linux网络编程3——http服务器的实现和性能测试
http服务器的实现 本文使用上一篇博文实现的epollreactor百万并发的服务器实现了一个使用http协议和WebSocket协议的WebServer。 完整代码请看我的github项目 1. 水平触发(Level Trigger)与边沿触发(Edge Trigger) 1.1 水平触发 水平触发是一种状态驱动机制。当文件描述符&a…...
Docker部署Kamailio,并使用LinPhone实现网络通话
前提条件 准备一个路由器,一个服务器,两个终端设备(手机或电脑) docker部署安装 我使用的是windows系统,docker desktop 先启动Docker desktop打开cmd,输入docker命令docker run --name kamailio --rm…...
JAVA-石头迷阵小游戏
采用企业式项目结构,接下来我将分享全部代码和结构,希望大家点点关注! 这是我的结构。首先使用IDE创建一个Module,命名stone-maze,接着把自带src下的main方法删除,接着在src下创建包,包名为com.wmuj,接着创建APP类代码如下: package com.wmuj;public class App {publ…...
鸿蒙--进度条通知
主要介绍如何使用通知能力和基础组件,实现模拟下载文件,发送通知的案例。 效果 代码结构 ├──entry/src/main/ets // 代码区 │ ├──common │ │ ├──constants │ │ │ └──CommonConstants.ets // 公共常量类 │ │ └──utils │ │ ├──Logger.ets //…...
搜维尔科技:varjo xr-4开箱测评,工业用途头显,一流视觉保真度
varjo xr-4开箱测评,工业用途头显,一流视觉保真度 搜维尔科技:varjo xr-4开箱测评,工业用途头显,一流视觉保真度...
mysql数据量分库分表
一、分库分表参考阈值 分库分表是解决大规模数据和高并发访问问题的常用策略。虽然没有绝对的阈值来决定何时进行分库分表,但以下是一些参考阈值和考虑因素,可以帮助你做出决策: 1.1 数据量阈值 单表数据行数:当单表的数据行数…...
Vite创建Vue3项目以及Vue3相关基础知识
1.创建Vue3项目 1.运行创建项目命令 # 使用 npm npm create vitelatest2、填写项目名称 3、选择前端框架 4、选择语法类型 5、按提示运行代码 不出意外的话,运行之后应该会出现 下边这个页面 6.延伸学习:对比webpack和vite(这个是面试必考…...
Elasticsearch封装公共索引增删改查
什么是索引? 定义:索引是 Elasticsearch 中用于存储数据的逻辑命名空间。它由多个文档组成,每个文档是一个 JSON 格式的结构化数据对应关系:在关系数据库中,索引类似于表;而在 Elasticsearch 中࿰…...
Python异常检测:Isolation Forest与局部异常因子(LOF)详解
这里写目录标题 Python异常检测:Isolation Forest与局部异常因子(LOF)详解引言一、异常检测的基本原理1.1 什么是异常检测?1.2 异常检测的应用场景 二、Isolation Forest2.1 Isolation Forest的原理2.1.1 算法步骤 2.2 Python实现…...
Git的原理和使用(二)
1. git的版本回退 之前我们也提到过,Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本 回退的功能…...
docker 发布镜像
如果要推广自己的软件,势必要自己制作 image 文件。 1 制作自己的 Docker 容器 基于 centos 镜像构建自己的 centos 镜像,可以在 centos 镜像基础上,安装相关的软件,之后进行构建新的镜像。 1.1 dockerfile 文件编写 首先&…...
投了15亿美元,芯片创新公司Ampere为何成了Oracle真爱?
【科技明说 | 科技热点关注】 一个数据库软件公司却想要操控一家芯片厂商,这样的想法不错。也真大胆。 目前,全球数据库巨头甲骨文Oracle已经持有Ampere Computing LLC 29%的股份,并有可能通过未来的投资选择权获得对这家芯片制造…...
vue 报告标题时间来自 elementUI的 el-date-picker 有开始时间和结束时间
要在Vue中使用 Element UI 的 el-date-picker 来选择开始时间和结束时间,并将其展示在报告中,以下是详细的实现步骤。 实现思路: 使用 Element UI 的 el-date-picker 组件,让用户选择时间范围(开始时间和结束时间&am…...
简单几何问题的通解
来,这道题怎么做?边长为2的正方形内,2个扇形的交集面积是多少?这道题一定要画辅助线,因为要用到两个扇形的交点,如果不画辅助线,这个交点相关的4个子图一个都无法求出面积,只能求出子…...
DBeaver导出数据表结构和数据,导入到另一个环境数据库进行数据更新
在工作中,我们会进行不同环境之间数据库的数据更新,这里使用DBeaver导出新的数据表结构和数据,并执行脚本,覆盖另一个环境的数据库中对应数据表,完成数据表的更新。 一、导出 右键点击选中想要导出的数据表࿰…...
【Golang】合理运用泛型,简化开发流程
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
OpenCV单目相机内参标定C++
基于OpenCV 实现单目相机内参标定: a.使用OpenCV库实现内参标定过程。通过角点检测、亚像素角点定位、角点存储与三维坐标生成和摄像机标定分别获取左右相机的内参。 b.具体地,使用库函数检测两组图像(左右相机拍摄图像)中棋盘格…...
基于MATLAB(DCT DWT)
第三章 图像数字水印的方案 3.1 图像数字水印的技术方案 在数据库中存储在国际互联网上传输的水印图像一般会被压缩,有时达到很高的压缩比。因此,数字水印算法所面临的第一个考验就是压缩。JPEG和EZW(Embedded Zero-Tree Wavelet࿰…...
渗透基础-rcube_webmail版本探测
简介 本文介绍了开源产品RoundCube webmail邮件系统的版本探测思路,并用go语言实现工具化、自动化探测。 正文 0x01 探测思路研究 探测系统版本,最理想的方法就是系统主页html代码中有特定的字符串,比如特定版本对应的hash在主页的html代…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
