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/…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
