2024滴滴后端校招面试真题汇总及其讲解(二)

4.【基础题】HashMap了解吗?介绍一下它对应的线程安全版本。

HashMap 是 Java 中一种键值对映射的集合,它使用哈希表来存储键值对。HashMap 具有插入和删除元素效率高的优势,但不是线程安全的。

ConcurrentHashMap 是 Java 中一种线程安全的 HashMap,它使用分段锁来保证线程安全。ConcurrentHashMap 具有 HashMap 的所有优势,并且还具有线程安全的特性。

ConcurrentHashMap 的工作原理是将哈希表分为多个段,每个段使用一个锁来保护。当多个线程同时访问同一个段时,会使用锁来同步访问,从而保证线程安全。

ConcurrentHashMap 的优点是线程安全,可以同时被多个线程访问。缺点是效率略低于 HashMap,因为需要使用锁来同步访问。

ConcurrentHashMap 的使用示例:

Java

import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {

  public static void main(String[] args) {
	  ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
	  map.put("a", 1);
	  map.put("b", 2);
	  map.put("c", 3);

	  System.out.println(map.get("a")); // 1
	  System.out.println(map.get("b")); // 2
	  System.out.println(map.get("c")); // 3
  }
}

123

在实际使用中,如果需要将 HashMap 用于多线程环境,建议使用 ConcurrentHashMap。

5.【基础题】讲讲红黑树

红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型用途是实现关联数组。它在1972年由鲁道夫·贝尔发明,被称为“对称二叉B树”,它现代的名字源于Leo J. Guibas和罗伯特·塞奇威克于1978年写的一篇论文。

红黑树的基本特性如下:

  • 每个节点要么是红色,要么是黑色。
  • 根节点是黑色的。
  • 叶节点(空节点)是黑色的。
  • 每个红色节点的两个子节点都是黑色的。
  • 从任意一个节点到其所有叶子节点的所有路径上,包含相同数目的黑色节点。

红黑树的插入和删除操作都需要进行旋转操作来维持红黑树的特性。

插入操作

红黑树的插入操作如下:

  1. 将新节点插入到二叉树中。
  2. 如果新节点的父节点是红色的,则进行旋转操作来维持红黑树的特性。

删除操作

红黑树的删除操作如下:

  1. 将要删除的节点的颜色设置为红色。
  2. 将要删除的节点替换为其后继节点。
  3. 将后继节点的颜色设置为黑色。
  4. 进行旋转操作来维持红黑树的特性。

红黑树的优点是:

  • 查找、插入和删除操作的时间复杂度都是 O(log n)。
  • 是一种自平衡二叉树,不需要进行额外的平衡操作。

红黑树的缺点是:

  • 节点需要额外存储一个颜色属性。
  • 旋转操作可能会导致额外的开销。

在实际使用中,红黑树是一种非常高效的数据结构,可以应用于各种场合。

6.【基础题】还知道哪些常用数据结构对应的线程安全版本?

除了 HashMap 的线程安全版本 ConcurrentHashMap 之外,Java 中还有其他常用数据结构的线程安全版本,包括:

  • List 的线程安全版本CopyOnWriteArrayList:使用写时复制策略来保证线程安全。Vector:使用同步机制来保证线程安全。
  • Set 的线程安全版本CopyOnWriteArraySet:使用写时复制策略来保证线程安全。ConcurrentSkipListSet:使用跳表来实现,具有线程安全和高效的查找性能。
  • Map 的线程安全版本ConcurrentHashMap:使用分段锁来保证线程安全。ConcurrentSkipListMap:使用跳表来实现,具有线程安全和高效的查找性能。

CopyOnWriteArrayList 和 CopyOnWriteArraySet

CopyOnWriteArrayList 和 CopyOnWriteArraySet 都使用写时复制策略来保证线程安全。写时复制策略是指在进行写操作时,先将原数据复制一份,然后在复制的数据上进行写操作,最后将原数据替换为复制的数据。

CopyOnWriteArrayList 和 CopyOnWriteArraySet 的优点是:

  • 不需要使用锁来同步访问,因此具有较高的并发性能。
  • 可以实现完全的线程安全。

CopyOnWriteArrayList 和 CopyOnWriteArraySet 的缺点是:

  • 在进行写操作时,需要复制一份数据,因此可能会导致性能下降。

ConcurrentSkipListSet

ConcurrentSkipListSet 使用跳表来实现,具有线程安全和高效的查找性能。跳表是一种数据结构,它将元素按顺序存储在多个链表中,每个链表中的元素按一定的规则排序。

ConcurrentSkipListSet 的优点是:

  • 具有线程安全的特性。
  • 查找性能高效,时间复杂度为 O(log n)。

ConcurrentSkipListSet 的缺点是:

  • 空间复杂度较高。

在实际使用中,应根据具体的需求选择合适的线程安全数据结构。

7.【数据库】数据库的类型,如何分类,各类都有哪些代表产品?

数据库可以根据不同的维度进行分类,常见的分类方式有以下几种:

按数据模型分类:关系型数据库、非关系型数据库、时序数据库、图数据库等。

按数据存储方式分类:内存数据库、磁盘数据库、云数据库等。

按数据访问方式分类:关系型数据库、NoSQL数据库等。

按数据库管理方式分类:集中式数据库、分布式数据库等。

按数据模型分类

根据数据模型的不同,数据库可以分为关系型数据库、非关系型数据库、时序数据库、图数据库等。

关系型数据库是最常见的数据库类型,它将数据存储在表格中,每个表由行和列组成。关系型数据库具有强一致性、完整性和可靠性等特点,适用于事务处理类应用。

代表产品:MySQL、Oracle、SQL Server、PostgreSQL等。

非关系型数据库不采用关系模型来存储数据,而是采用其他的数据模型,如文档模型、键值模型、图模型等。非关系型数据库具有灵活性、可扩展性等特点,适用于非事务处理类应用。

代表产品:MongoDB、Redis、Neo4j、HBase等。

时序数据库专门用于存储和处理时序数据,如温度、流量、位置等。时序数据库具有高性能、低延迟等特点,适用于物联网、工业互联网等应用。

代表产品:InfluxDB、TimescaleDB、Kafka Streams等。

图数据库专门用于存储和处理图形数据,如社交网络、交通网络、金融网络等。图数据库具有高效的图查询能力,适用于社交网络、推荐系统等应用。

代表产品:Neo4j、GraphDB、OrientDB等。

按数据存储方式分类

根据数据存储方式的不同,数据库可以分为内存数据库、磁盘数据库、云数据库等。

内存数据库将数据存储在内存中,具有高性能、低延迟等特点,适用于实时数据处理类应用。

代表产品:Redis、Couchbase、Memcached等。

磁盘数据库将数据存储在磁盘中,具有高可靠性、可扩展性等特点,适用于一般应用。

代表产品:MySQL、Oracle、SQL Server、PostgreSQL等。

云数据库是将数据库部署在云服务器上,具有按需使用、弹性扩展等特点。

代表产品:Amazon RDS、Microsoft Azure SQL Database、Google Cloud SQL等。

按数据访问方式分类

根据数据访问方式的不同,数据库可以分为关系型数据库、NoSQL数据库等。

关系型数据库采用 SQL 语言来访问数据,具有强一致性、完整性和可靠性等特点。

NoSQL 数据库不采用 SQL 语言来访问数据,具有灵活性、可扩展性等特点。

按数据库管理方式分类

根据数据库管理方式的不同,数据库可以分为集中式数据库、分布式数据库等。

集中式数据库将所有数据存储在一个数据库服务器上,适用于小型和中型应用。

分布式数据库将数据分布在多个数据库服务器上,适用于大型应用。

在实际应用中,应根据具体的需求选择合适的数据库类型。

8.【数据库】关系型数据库的特点和优势,适用于那些场景?

关系型数据库是目前使用最广泛的数据库类型,它具有以下特点和优势:

数据模型:关系型数据库使用关系模型来存储数据,关系模型是一种二维表格模型,每个表由行和列组成。关系模型具有良好的结构性和可理解性,便于数据管理和分析。

查询语言:关系型数据库采用 SQL 语言来访问数据,SQL 语言是一种强大的查询语言,可以对数据进行复杂的查询。

事务处理:关系型数据库支持事务处理,事务处理可以确保数据的完整性和一致性。

数据一致性:关系型数据库具有强一致性,即数据在同一时刻在所有数据库实例中都是相同的。

完整性约束:关系型数据库支持完整性约束,完整性约束可以确保数据的有效性。

可靠性:关系型数据库具有较高的可靠性,数据可以持久存储在磁盘上,不会丢失。

关系型数据库适用于以下场景:

事务处理:关系型数据库具有良好的事务处理能力,适用于需要保证数据完整性和一致性的应用,如订单管理、财务管理等。

数据分析:关系型数据库具有强大的查询能力,适用于需要对数据进行复杂分析的应用,如市场分析、客户分析等。

数据库开发:关系型数据库是数据库开发的基础,适用于各种数据库开发应用。

以下是一些关系型数据库的常见代表产品:

MySQL:开源关系型数据库,适用于小型和中型应用。

Oracle:商业关系型数据库,适用于大型应用。

SQL Server:商业关系型数据库,适用于大型应用。

PostgreSQL:开源关系型数据库,适用于中大型应用。

在实际应用中,应根据具体的需求选择合适的关系型数据库。

#我发现了面试通关密码##24届软开秋招面试经验大赏#

腾讯,字节跳动,阿里巴巴,百度,美团,快手,有赞,理想,蔚来,小鹏等大厂校招笔试真题,面试真题讲解。目标100家公司

全部评论

相关推荐

05-29 19:11
已编辑
北方民族大学 Java
😭😭😭😭本人26届双非本,后端选手。从25年秋招开始,一直到春招5月份,一共面了12次字节。可以说后面能继续投递面上字节大概率是因为前面一直累计的面评还不错,但是最终的结果往往不尽如人意,黄梁一梦。timeline:如标题,总共面了12次字节,4个不同的岗位。第一次:抖音生活服务测开二面完排序挂第二次:TikTok国际化电商测开三面完排序挂第三次:飞书后端安全团队三面完挂第四次:飞书后端偏基架团队三面完过,HR面完之后询问综合排序不推进。我知道像BAT这样的公司,双非本想拿到一张入场券有多难,也知道每次挂在排序/三面/HR面,那种差一步上岸又被打回原点的落差感有多磨人。可是最后一次字节的这个岗位,已经是5月中旬才开始面得了,春招末期的岗位,我本以为真的缺人,三面过的那天,我真的以为就差一步hr面就稳了,但是,最终的结果很遗憾,综合排序综合排序,不推进了。如果是技术能力的问题,我想也不会每一轮技术面给我通过。思来想去。难道真的就是因为我们双非有案底,所以最后的一切又算什么呢。付出这么多的时间精力,还是抵不过双非学历太差吗?既然如此一开始直接卡掉简历不用给面试不就行了嘛,每一轮面试都给我们生的希望,最后的最后又回到了那个必输的起点。12次字节,说不遗憾是假的,也无数次怀疑过自己:是不是我算法刷得还不够?是不是项目亮点讲得不够好?是不是学历就是一道跨不过去的坎?但回头看,这一年的秋招到春招,从面对面试官紧张到说话卡壳,到后来的从容面对,再到如今甚至能和面试官探讨AI&amp;大模型技术的一些方案思路,我已经比去年的自己强太多了。可能字节于我,真的是一场盛大的单恋,拼尽全力奔赴,却还是没能收到想要的回应。前路漫漫,字节的梦碎了,但我的路还在继续,希望下一站,会有属于我的一场徐风。
不愿吃饼的山羊很友好:你的心理素质是真的强大,如果是我碰到这样都会疯了
点赞 评论 收藏
分享
上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
牛客51274894...:意思是光刷力扣还不够卷
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
2
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务