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

Java 集合 Collection常考面试题

理解集合体系图

collection中 list 是有序的,set 是无序的

什么是迭代器

主要遍历 Collection 集合中的元素,所有实现了 Collection 的集合类都有一个iterator()方法,可以返回一个 iterator 的迭代器。

ArrayList 和 Vector 的区别?

ArrayList 可以存放 null,底层是由数组实现的。

主要区别在于两者的线程安全性和性能。Vector 是同步的,因此它是线程安全的,但这使得它在多线程环境中相对于 ArrayList 来说性能较低。ArrayList 是非同步的,因此不是线程安全的,但它在单线程环境中提供更好的性能。

关于同步和异步的安全问题

同步操作在多线程程序中经常与“线程安全”这个词联系在一起,主要是因为同步机制(如互斥锁、信号量等)确保在同一时间只有一个线程可以访问某个特定的资源或执行某个特定的代码段。这种方式可以防止多个线程同时改变共享数据的状态,从而避免了竞态条件和数据不一致的问题。

异步操作本身并不自动提供线程安全保证。事实上,由于异步操作经常在不同的线程或执行环境中启动或完成,如果不采取适当的措施,就可能引发线程安全问题。

此外,Vector 默认情况下容量增长为当前的两倍,而 ArrayList 增长为原来的 1.5 倍。

关于容量增长问题

"容量增长为当前的两倍"这个表述是指集合(如 Vector)在元素添加过程中,当现有的存储空间不足以容纳更多元素时,集合会自动扩展其内部数据结构的容量。对于 Vector 来说,这意味着如果其内部数组已满,它会创建一个新的数组,其容量是原数组容量的两倍,然后将所有旧元素复制到这个新数组中。

这里是一个具体的例子来说明这个过程:

  1. 假设 Vector 的当前容量是 10(即它可以存储 10 个元素)。
  2. 当你尝试添加第 11 个元素时,Vector 会检测到容量不足。
  3. 于是,Vector 会分配一个新的数组,其容量是之前的两倍,即 20。
  4. Vector 将原有的 10 个元素复制到这个新的数组中,并添加新元素。

这种自动扩容机制确保了集合可以根据需要动态地增长,以容纳更多的元素。与 Vector 不同的是,ArrayList 在扩容时通常采用将容量增长为原来的 1.5 倍,这也是一种权衡性能和内存使用的策略。通过选择不同的增长因子,不同的集合类可以提供不同的性能特点:

  • Vector 的容量增长为两倍,意味着它在扩容时可能会更快地增加其内存使用,但减少了扩容操作的频率。
  • ArrayList 的容量增长为 1.5 倍,则是在增加容量和减少内存浪费之间找到一个中间值。

由于这些特性,通常推荐在单线程应用中使用 ArrayList(因为更快,而且不用考虑安全性的问题),在需要线程安全的环境中使用 Vector。

ArrayList和LinkedList的区别?

"ArrayListLinkedList 都实现了 Java 的 List 接口,但他们的内部数据结构和性能特点有所不同。

  • ArrayList 是基于动态数组的实现,它支持快速的随机访问和低成本的访问操作。然而,向列表中间插入和删除元素的操作可能会比较慢,因为这涉及到数组的复制和移动元素。

  • LinkedList 是基于双向链表的实现,它允许在列表中进行快速的插入和删除操作,尤其是在列表的开头和结尾,或者已知特定节点的情况下。但是,与 ArrayList 相比,LinkedList 的随机访问速度较慢,因为需要从头节点或尾节点开始遍历链表。

总的来说,如果你需要频繁的随机访问,应选择 ArrayList;如果你的应用需求更频繁地在列表中插入或删除元素,LinkedList 可能是更好的选择。"

HashMap与HashTable的区别?

"HashMapHashTable 都是 Java 中的集合类,用于存储键值对,但它们在实现和使用中有几个关键区别:

  1. 同步性

    • HashMap 是非同步的。
    • HashTable 是同步的。
  2. 空值支持

    • HashMap 允许一个 null 键和多个 null 值。
    • HashTable 不允许键或值为 null,尝试插入 null 键或值会抛出 NullPointerException
  3. 迭代器&

http://www.lryc.cn/news/457750.html

相关文章:

  • C++继承与菱形继承(一文了解全部继承相关基础知识和面试点!)
  • 谷歌DeepMind 德米斯·哈萨比斯 因蛋白质预测AI荣获诺贝尔化学奖
  • 内网笔记大全
  • peft.LoraConfig()参数说明
  • 串口(UART)的FPGA设计(接收与发送模块)
  • JSON 格式化工具:快速便捷地格式化和查看 JSON 数据
  • 【星汇极客】STM32 HAL库各种模块开发之1.8TFT屏幕
  • Excel中使用SQL语句的四种方法
  • 目标检测中的损失函数
  • list库实现
  • MFC工控项目实例二十三模拟量输入设置界面
  • 排序算法总结(三)希尔排序
  • 如何迁移 Linux 服务器 第一部分 - 系统准备
  • 网络IO模型都有哪些
  • 数据结构: 数组在算法中的应用
  • js快速转换时间(时间戳转换成年月日时分秒)
  • LeetCode15.三数之和
  • SpringBoot3.3 优雅启停定时任务
  • 数据结构之二叉搜索树(key模型与key_value模型)
  • 图说几何学2300年重大错误:附着在直线z上的直线段必是z的一部分
  • 汽车网关(GW)技术分析
  • Telnet命令详解:安装、用法及应用场景解析
  • C++之LIST模拟实现(代码纯享版)
  • 华为OD机试 - 括号匹配 - 栈(Python/JS/C/C++ 2024 E卷 100分)
  • 打破欧美10年芯片垄断,杨振宁教授关门弟子,仅用三年创造奇迹
  • OpenCV视频I/O(20)视频写入类VideoWriter之用于将图像帧写入视频文件函数write()的使用
  • 音视频入门基础:FLV专题(14)——FFmpeg源码中,解码Script Tag的实现
  • 小猿口算APP脚本(协议版)
  • 【长文梳理webserver核心】核心类篇
  • [实用工具]Docker安装nextcloud实现私有云服务和onlyoffice