Java 集合(数据结构)面试题总结

一、栈和队列的区别 具体的场景应用

栈(Stack)和队列(Queue)是两种基本的数据结构,它们在数据的存取顺序上有不同的规则。以下是它们的主要区别以及具体的应用场景。

1. 栈(Stack)

特点:

  • 后进先出(LIFO):最后进入栈的元素最先被移出。

  • 常用的操作是:

    • push:将元素压入栈顶。

    • pop:从栈顶弹出元素。

    • peek:查看栈顶元素但不移除。

适用场景:

  • 递归调用:函数调用是一个典型的栈应用,当一个函数调用另一个函数时,当前函数的状态会被保存到栈中,直到被调用的函数执行完毕返回。

  • 表达式求值与语法解析:如在编译器中使用栈来解析表达式、执行算术运算(如逆波兰表达式)。

  • 撤销操作:在很多应用程序(如文本编辑器、图像编辑器)中,用户可以执行撤销操作,撤销功能通常使用栈来记录每个操作,当用户选择撤销时,就从栈中弹出最近的操作。

  • 深度优先搜索(DFS):在图的遍历中,DFS 算法使用栈来追踪遍历的路径。

  • 括号匹配:检查括号是否成对出现,比如 {}, [], (),也是通过栈实现。

2. 队列(Queue)

特点:

  • 先进先出(FIFO):第一个进入队列的元素最先被移出。

  • 常用的操作是:

    • enqueue(offer/add):将元素添加到队列的尾部。

    • dequeue(poll/remove):从队列的头部移除元素。

    • peek:查看队列头部的元素但不移除。

适用场景:

  • 任务调度:操作系统中的任务调度器使用队列来管理进程或任务。比如 CPU 的任务调度就是按照某种优先级来管理进程的运行顺序,这些任务通常放在队列中排队等待执行。

  • 消息队列:在分布式系统中,消息队列(Message Queue)用于异步通信,生产者将消息放入队列,消费者从队列中读取消息。

  • 宽度优先搜索(BFS):在图的遍历中,BFS 使用队列来记录已经访问的节点。

  • 缓冲区(Buffer):网络应用中,数据流通常使用队列作为缓冲区。生产者不断将数据放入队列,消费者从队列中取数据进行处理。

  • 打印任务队列:当多个打印任务提交时,任务按照顺序进入队列,打印机按顺序处理任务。

二、set 的去重机制

1. HashSet 去重机制

HashSet 是基于哈希表(Hash Table)实现的,它通过元素的 哈希值(hash code)equals() 方法 来确定元素的唯一性。

主要原理:

  • 每个元素存储在哈希表中的位置由元素的哈希值决定。HashSet 先通过元素的 hashCode() 计算其哈希值,然后根据哈希值找到元素在哈希表中的存储位置。

  • 如果两个元素的哈希值相同(即哈希冲突),则 HashSet 会进一步调用这两个元素的 equals() 方法来判断它们是否真正相等。只有当 hashCode() 相等且 equals() 返回 true 时,HashSet 才认为两个元素是相同的元素,不会重复存储。

去重流程:

  1. 插入新元素时,先通过 hashCode() 计算出哈希值。

  2. 如果哈希值不同,直接插入到哈希表的不同位置。

  3. 如果哈希值相同,HashSet 会使用 equals() 进一步检查元素是否相等。如果相等,则不插入新元素;如果不相等,元素会被放入相同的哈希桶中(链表或红黑树),形成哈希冲突的解决机制。

2. TreeSet 去重机制

TreeSet 是基于红黑树(Red-Black Tree)实现的,它通过元素的 自然顺序自定义比较器 来保证集合的有序性和唯一性。

主要原理:

  • TreeSet 中的元素必须实现 Comparable 接口,或者在构造 TreeSet 时传入一个 Comparator,以确定元素之间的顺序。

  • 当插入新元素时,TreeSet 会根据比较器或者元素的 compareTo() 方法来判断元素之间的顺序。如果 compareTo() 返回 0(即两个元素相等),则新元素不会被插入,从而实现去重。

去重流程:

  1. 插入新元素时,TreeSet 会通过比较器或元素的 compareTo() 方法比较新元素和已有元素的大小。

  2. 如果新元素与某个已有元素比较结果为 0(表示相等),则该元素不插入,避免重复。

三、HashMap 的实现原理

HashMap 是 Java 中非常常用的数据结构之一,它基于 哈希表 实现,主要用于键值对(key-value)的存储和查找。它的主要特点是能在平均情况下以 O(1) 的时间复杂度进行插入、删除和查找操作。下面我们将详细解释 HashMap 的实现原理、工作机制及其底层结构。

1. 基本结构

HashMap 的底层实现基于 数组 + 链表/红黑树 的数据结构。

  • 数组HashMap 维护了一个 Entry 数组,数组的每一个位置称为一个 (bucket),用于存放键值对(Entry)。

  • 链表/红黑树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rcnhtin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值