Java面试题04
1.Array 和 ArrayList 有何区别?
Array是固定长度的,元素类型可以是基本类型,创建后大小不可改变;ArrayList是可变长 度的,只能存储对象,可以动态添加和删除元素。
区别1:
存储类型不同
Array:只可存储基本数据类型和对象
ArrayList:只能存储对象
区别2:
大小不同
Array:被设置为固定大小
ArrayList:是一个可变数组,大小可自动调整
区别3:
对象所包含的方法不同
Array:所包含的方法没有ArrayList多
ArrayList有很多操作方法:addAll、removeAll、iteration等
ArrayList可以存储基础类型。但是需要注意的是,当我们把基本数据类型存入ArrayList时,Java会自动为它创建一个包装类。例如,如果我们有一个ArrayList存储int类型的数据,Java实际上会把它当作Integer对象来处理。
ArrayList<Integer> list = new ArrayList<>();
list.add(1); // 自动装箱,实际上是list.add(Integer.valueOf(1));
int num = list.get(0); // 自动拆箱,实际上是int num = list.get(0).intValue();
2.在 Queue 中 poll()和 remove()有什么区别?
poll()方法从队列头部获取并删除元素,如果队列为空则返回null;remove()方法从队列头 部获取并删除元素,如果队列为空会抛出NoSuchElementException异常。
在 Java 的 Queue
接口中,poll()
和 remove()
方法都可以用于移除并返回队列的头部元素。然而,它们在处理队列为空的情况时表现出不同的行为:
remove()
: 当队列为空时,此方法会抛出一个NoSuchElementException
。也就是说,如果你尝试从一个空的队列中移除元素,remove()
会失败并报错。poll()
: 当队列为空时,此方法会返回null
而不是抛出异常。也就是说,如果你尝试从一个空的队列中移除元素,poll()
会静默地失败并返回null
。
3.哪些集合类是线程安全的?
Vector、Hashtable、Collections类的synchronizedXxx方法生成的集合,以及 ConcurrentHashMap等集合类是线程安全的。
在Java中,以下是一些线程安全的集合类:
Vector
:这是一个旧的集合类,线程安全,但是其性能低于ArrayList
。Vector
的所有方法都被synchronized
修饰,因此在多线程环境下是安全的。Hashtable
:类似于HashMap
,但是线程安全。所有公共的Hashtable
方法都使用synchronized
,所以多个线程可以共享单个Hashtable
。然而,与Vector
一样,Hashtable
也没有达到最高的性能。Collections.synchronizedList()
,Collections.synchronizedMap()
,Collections.synchronizedSet()
: Java Collections 框架提供了工具来转换其他集合为线程安全集合。通过在这些集合的所有公共方法上使用synchronized
关键字。CopyOnWriteArrayList
,CopyOnWriteArraySet
: 这些是专为多线程环境设计的集合类。它们采用了一种"写时复制"(copy-on-write)策略,当修改这些集合时,它们会创建底层数组的新副本,然后在新副本上进行修改。这使得这些集合在读取时不需要同步,从而提供了很高的读取性能。ConcurrentHashMap
: 这是一个线程安全的HashMap
实现,设计用于高并发场景。它使用了一种叫做分段锁的技术,允许多个修改操作并行进行。BlockingQueue
接口及其实现类(如ArrayBlockingQueue
,LinkedBlockingQueue
,PriorityBlockingQueue
,SynchronousQueue
,DelayQueue
,PriorityQueue
等):这些队列是线程安全的,可以在多线程环境中安全地使用。
以上就是Java中一些线程安全的集合类。在多线程环境下使用这些类可以避免并发问题。
4.迭代器 Iterator 是什么?
迭代器是一种用于遍历集合元素的接口,提供了统一的遍历方式,使得遍历过程更加简洁和 灵活。
迭代器(Iterator)是一种接口,它为各种不同的数据结构提供了统一的访问机制。迭代器允许程序以顺序方式访问容器(如列表、队列、集合、映射等)中的元素,而不必关心底层实现细节。
迭代器的基本用法是,首先使用 hasNext() 方法检查容器中是否有下一个元素,如果有,则使用 next() 方法获取下一个元素。这种迭代方式可以遍历整个容器,直到所有元素都被访问过。
迭代器在Java、C++等编程语言中都有广泛的应用,它使得程序可以以一致的方式处理不同的数据结构,提高了代码的可读性和可维护性。
5.Iterator 怎么使用?有什么特点?
通过调用集合的iterator()方法获取迭代器对象,然后使用hasNext()判断是否有下一个元 素,使用next()获取下一个元素。迭代器的特点是只能单向遍历,不支持修改操作
迭代器(Iterator)是一种设计模式,它使对象能够遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常用于列表、数组和其他类型的集合数据。
以下是使用迭代器的一些基本方法:
- 获取迭代器:通常可以通过调用集合对象的
iterator()
方法来获取迭代器。例如,在Java中,可以使用List
接口的iterator()
方法来获取迭代器。 - 判断是否还有下一个元素:通过调用迭代器的
hasNext()
方法,可以判断集合中是否有下一个元素。 - 获取下一个元素:通过调用迭代器的
next()
方法,可以获取下一个元素。
以下是使用迭代器遍历列表的Java代码示例:
List<String> list = new ArrayList<String>(); | |
list.add("apple"); | |
list.add("banana"); | |
list.add("orange"); | |
Iterator<String> iterator = list.iterator(); | |
while (iterator.hasNext()) { | |
String fruit = iterator.next(); | |
System.out.println(fruit); | |
} |
输出结果:
apple | |
banana | |
orange |
迭代器的主要特点包括:
- 简单易用:使用迭代器可以简化对集合数据的遍历操作,无需关心底层的实现细节。
- 统一访问方式:通过提供统一的访问方式,迭代器可以使程序代码更加清晰和易于理解。
- 分离结构:迭代器模式将数据的结构和行为分离,使开发人员可以独立地操作数据,而无需了解底层实现。
6.Iterator 和 ListIterator 有什么区别?
Iterator用于遍历集合,只能单向遍历,不支持修改操作;ListIterator是Iterator的扩展, 支持双向遍历,还可以在遍历过程中修改集合。
Iterator
和 ListIterator
都是用于遍历集合的接口,但是它们之间存在一些重要的区别:
- 接口不同:
Iterator
是集合的迭代器接口,它定义了遍历集合的方法,如hasNext()
和next()
。而ListIterator
是List
的迭代器接口,它继承自Iterator
接口并添加了一些专门用于列表的迭代方法,如hasPrevious()
、previous()
和add()
。 - 顺序不同:
Iterator
只能从前往后遍历集合,无法从后往前遍历。而ListIterator
可以从前往后或从后往前遍历列表。 - 功能不同:
Iterator
只能用于遍历,没有其他功能。而ListIterator
除了可以遍历列表外,还可以在列表中插入元素(通过add()
方法)和获取当前元素(通过next()
或previous()
方法)。
总的来说,ListIterator
是 Iterator
的一个特殊版本,专门用于遍历和操作列表。如果你需要遍历列表并可能需要在列表中插入元素,你应该使用 ListIterator
。如果你只需要遍历集合,可以使用 Iterator
。
7.怎么确保一个集合不能被修改?
可以使用Collections.unmodifiableXxx方法,将集合转换为不可修改的视图,尝试修改会 抛出UnsupportedOperationException异常。
在Java中,你可以通过使用 Collections.unmodifiableCollection()
或者 Collections.unmodifiableList()
方法来创建一个不可修改的集合。这样,你就能够确保集合的内容不会被改变。
例如:
List<String> list = new ArrayList<String>(); | |
list.add("Hello"); | |
list.add("World"); | |
List<String> unmodifiableList = Collections.unmodifiableList(list); | |
// 下面的代码会抛出 UnsupportedOperationException | |
// unmodifiableList.add("China"); |
如果你想要创建一个不可修改的集合,并且该集合是 Set
类型,你可以使用 Collections.unmodifiableSet()
方法。对于 Map
类型,你可以使用 Collections.unmodifiableMap()
方法。
这些方法都返回一个视图,表示由原始集合中的元素组成的不可修改的集合。原始集合不会被冻结,仍然可以修改。修改原始集合将立即反映在视图中,视图将抛出 UnsupportedOperationException
表示它不可修改。
相关文章:
Java面试题04
1.Array 和 ArrayList 有何区别? Array是固定长度的,元素类型可以是基本类型,创建后大小不可改变;ArrayList是可变长 度的,只能存储对象,可以动态添加和删除元素。 区别1: 存储类型不同 …...

海康Visionmaster-通讯管理:使用 Modbus TCP 通讯 协议与流程交互
使用 Modbus TCP 通讯协议与视觉通讯,当地址为 0000 的保持型寄存器(4x 寄存器)变为 1 时,触发视觉流程执行一次,同时视觉将地址为 0000 的寄存器复位(也即写为 0),视觉流程执行完成后,将结果数…...
assimp中如何判断矩阵是否是单位矩阵
对于一个矩阵元素为浮点型的矩阵,你是否还在使每个元素跟1.0f或0.0f进行比较,如果这样,只能说你的结果不一定正确,那我们看看assimp中是如何做的。 template <typename TReal> AI_FORCE_INLINE bool aiMatrix4x4t<TReal…...

大数据Doris(二十):数据导入(Broker Load)介绍
文章目录 数据导入(Broker Load)介绍 一、适用场景...
Docker快速安装kafka
创建zk docker run -d --name zookeeper-server \-e ALLOW_ANONYMOUS_LOGINyes \bitnami/zookeeper:latest创建kafka docker run -d --name kafka-server \-p 9092:9092 \-e ALLOW_PLAINTEXT_LISTENERyes \-e KAFKA_CFG_ZOOKEEPER_CONNECTzookeeper-server:2181 \-e KAFKA_CF…...

ChatGPT是什么?黑客试图淹没其服务
上线2个月,月活跃用户破亿,媒体人用它编辑文案,学生用它写作业,程序员用它编辑代码, 它是谁呢? 它就是火爆全网(chatgpt),chatgpt是什么呢,chatgpt是美国研发的一款人工…...

【Java 进阶篇】Java Web 开发之 Listener 篇:ServletContextListener 使用详解
欢迎大家来到 Java Web 开发的学习之旅!在前面的博客中,我们已经学习了 Servlet、JSP、Filter 等重要的概念和技术。今天,我们将深入探讨 Java Web 开发中另一个重要的组成部分——Listener(监听器),具体来…...

[C/C++]数据结构 链表OJ题:环形链表(如何判断链表是否有环)
题目描述: 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&…...
c#流程控制
c#分支语句 namespace ConsoleApp1 {internal class Program{static void Main(string[] args){Console.WriteLine("请输入学生成绩");string sConsole.ReadLine();int aint.Parse(s);//将字符类型强制转换为int类型if (a > 90){ Console.WriteLine("成绩优…...

基于SSM的学生二手书籍交易平台的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
xcode-工程设置
build settings Deployment Postprocessing 用于指定是否在构建完成后进行一些部署相关的处理。 当你在 Xcode 中构建你的应用程序时,构建设置决定了一些行为,其中一项是是否启用 Deployment Postprocessing。这个选项的主要作用是在构建完成后&#…...

Milvus Cloud——LLM Agent 现阶段出现的问题
LLM Agent 现阶段出现的问题 由于一些 LLM(GPT-4)带来了惊人的自然语言理解和生成能力,并且能处理非常复杂的任务,一度让 LLM Agent 成为满足人们对科幻电影所有憧憬的最终答案。但是在实际使用过程中,大家逐渐发现了通…...
百度智能云千帆大模型平台再升级,SDK版本开源发布!
SDK 前言一、SDK的优势二、千帆SDK:快速落地LLM应用三、如何快速上手千帆SDK1、SDK快速启动快速安装平台鉴权如何获取AK/SK以“Chat 对话”为调用示例 2. SDK进阶指引3. 通过Langchain接入千帆SDK为什么选择Langchain 开源社区 前言 百度智能云千帆大模型平台再次升…...
按键精灵中的数据类型转换
按键精灵中的数据类型有:整型、浮点数、布尔类型、字符串、数组这几种类型,主要的转换方式有以下这几种方式: 1. 转布尔类型 CBool Dim A 5 Dim B CBool(A)TracePrint B // true 2. 转字符串类型 CStr Dim MyInteger 437Dim MyStr…...
Golang Gorm 连接数据库
连接数据库 为了连接数据库,你首先要导入数据库驱动程序。例如: import _ "github.com/go-sql-driver/mysql"import ("gorm.io/driver/mysql""gorm.io/gorm" ) GORM 已经包含了一些驱动程序,为了方便的去记住…...

[C++随笔录] 红黑树
红黑树 红黑树的特点红黑树的模拟实现红黑树的底层结构insert的实现实现思路更新黑红比例的逻辑insert的完整代码 insert的验证 源码 红黑树的特点 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是 Red或 Black。…...
C 和 C++ 可变参数介绍
文章目录 前言概念C 的可变参数参数列表 #va_list 4组宏 C 的可变参数参数列表 #va_list 4组宏初始化列表 initializer_list<> 类模板可变参数模板 总结参考资料作者的话 前言 C 和 C 可变参数介绍。 概念 可变(长)/不定(长ÿ…...

【Git】gui图形化界面的使用、ssh协议以及idea集成Git
目录 gui图形化界面的使用 介绍 特点 gui图形的使用 ssh协议 介绍 步骤及概念 ssh协议的使用 配置公钥 idea集成Git idea配置git IDEA安装gitee IDEA中登入Git 编辑 项目分享 克隆分享的项目 编辑 编辑 idea上传远程 gui图形化界面的使用 介绍 GUI(…...

C语言之文件操作(详解版)
不知不觉我们已经学到C语言的文件操作部分了,这部分内容其实很有意思,因为它可以直接把我们代码中的数据写入硬盘,而不是我们关掉这个程序,代码就没有了,让我们开始学习吧! 目录 1.为什么使用文件 2.什么…...
解决mac 下 docker-compose 不是命令
docker-compose docker: ‘compose’ is not a docker command #6569 解决方法: mkdir -p /usr/local/lib/docker ln -s /Applications/Docker.app/Contents/Resources/cli-plugins /usr/local/lib/docker/cli-plugins参考: https://github.com/docker/…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...

李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...