2023秋招得物面经 8.31总结

news2024/12/23 4:16:53

1.数据结构中有哪些树

在数据结构中,常见的树包括:

  1. 二叉树(Binary Tree):每个节点最多有两个子节点,用于表示有层次关系的数据结构,如二叉搜索树、堆等。

  2. 二叉搜索树(Binary Search Tree):是一种特殊的二叉树,左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值,用于支持高效的查找、插入和删除操作。

  3. 平衡二叉树(Balanced Binary Tree):是一种二叉搜索树,保持左右子树的高度差不超过一个固定的值,例如红黑树、AVL树等,用于提高二叉搜索树的性能。

  4. B树(B-Tree):是一种多路搜索树,每个节点可以有多个子节点,用于高效地存储和检索大量的数据,常用于文件系统和数据库索引。

  5. B+树(B+ Tree):是一种B树的变体,除了叶子节点包含所有的关键字和指针外,内部节点只包含关键字,用于提高范围查询的性能。

  6. Trie树(Trie Tree):也称为字典树或前缀树,用于高效地存储和检索字符串集合,常用于搜索引擎的关键字匹配。

  7. 哈夫曼树(Huffman Tree):用于数据压缩,根据字符出现的频率构建最优的前缀编码树,将出现频率高的字符用较短的编码表示。

  8. 红黑树(Red-Black Tree):是一种平衡二叉搜索树,通过对节点进行颜色标记和旋转操作来保持树的平衡,用于高效地插入、删除和查找操作。

  9. AVL树:是一种自平衡二叉搜索树,通过对节点进行旋转操作来保持树的平衡,用于高效地插入、删除和查找操作。

2.OSI7层网络,每一层具体做什么的

OSI(开放系统互联)参考模型是一个通信协议的框架,将网络通信分为七个不同的层级。每一层负责不同的功能,协同工作以实现可靠的数据传输。以下是每一层的具体功能:

  1. 物理层(Physical Layer):负责在物理媒介上传输原始比特流,包括电压、电流和光信号等。它定义了物理连接的规范,如传输速率、电压等。

  2. 数据链路层(Data Link Layer):负责将原始比特流组织成数据帧,并在物理网络上进行传输。它提供了可靠的点对点数据传输,通过错误检测和纠正来确保数据的完整性。

  3. 网络层(Network Layer):负责将数据包从源主机传输到目标主机,通过路由选择算法来确定最佳路径。它处理数据包的路由和转发,实现不同网络之间的互联。

  4. 传输层(Transport Layer):负责在端到端的通信中提供可靠的数据传输。它将数据分割成较小的数据段,并为每个数据段提供序列号和确认机制,以确保数据的可靠性和顺序性。

  5. 会话层(Session Layer):负责建立、管理和终止会话(会话是两个应用程序之间的通信会话)。它提供了会话控制和同步功能,以确保应用程序之间的通信顺序和可靠性。

  6. 表示层(Presentation Layer):负责数据的格式化和转换,以确保不同系统之间的数据交换的兼容性。它处理数据的加密、压缩和解压缩等操作。

  7. 应用层(Application Layer):负责应用程序之间的通信和数据交换。它定义了各种应用程序的协议,如HTTP、FTP、SMTP等,以提供特定的应用服务。

3.HTTP和HTTPS的区别

HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是两种不同的网络协议,它们在数据传输的安全性方面有以下区别:

  1. 安全性:HTTP是明文传输协议,数据在传输过程中不进行加密,容易被攻击者窃取或篡改。而HTTPS通过使用SSL(安全套接层)或TLS(传输层安全)协议对数据进行加密和身份验证,确保数据在传输过程中的安全性。

  2. 端口号:HTTP默认使用80端口进行通信,而HTTPS默认使用443端口进行通信。这是因为HTTPS需要进行加密和解密操作,需要额外的计算资源和处理时间。

  3. 证书:HTTPS使用数字证书来验证服务器的身份。数字证书由受信任的第三方机构颁发,用于证明服务器的真实性和可信度。而HTTP没有提供类似的身份验证机制,容易受到中间人攻击。

  4. 加密:HTTPS使用公钥加密和私钥解密的方式对数据进行加密和解密。公钥由服务器发送给客户端,私钥由服务器保留。这样可以确保数据在传输过程中只能被合法的服务器解密。

  5. 性能:由于HTTPS需要进行加密和解密操作,相比HTTP会增加一定的计算和处理时间,导致性能稍微下降。但是随着计算能力的提升,这种差距逐渐减小。

总结来说,HTTPS相比HTTP在数据传输的安全性方面更加可靠,适用于对数据保密性要求较高的场景,如在线支付、个人信息传输等。而HTTP适用于不涉及敏感信息传输的场景,如浏览网页、查看新闻等。

4.有哪些方式做多线程开发,需要注意哪些点

在多线程开发中,有以下几种方式可以实现多线程:

  1. 使用线程类:在编程语言中,通常会提供线程类或线程库,可以直接使用这些类或库来创建和管理线程。

  2. 继承Thread类:某些编程语言允许用户创建自定义的线程类,继承自内置的Thread类,并重写run()方法来定义线程的执行逻辑。

  3. 实现Runnable接口:某些编程语言中,可以实现Runnable接口来定义线程的执行逻辑,并将实现了Runnable接口的对象传递给线程类来创建线程。

  4. 使用线程池:线程池是一种管理和复用线程的机制,可以提高线程的效率和性能。通过线程池,可以将任务提交给线程池,由线程池来管理线程的创建、执行和销毁。

在进行多线程开发时,需要注意以下几点:

  1. 线程安全:多个线程同时访问共享数据时可能会导致数据不一致或冲突的问题,需要采取合适的同步机制(如锁、信号量等)来保证线程安全。

  2. 线程间通信:不同线程之间可能需要进行数据交换或协作,需要使用合适的线程间通信机制(如管道、阻塞队列等)来实现。

  3. 死锁:当多个线程互相等待对方释放资源���,可能会导致死锁问题,需要避免死锁的发生。

  4. 上下文切换:线程之间的切换会带来一定的开销,如果线程切换过于频繁,可能会降低程序的性能。因此,需要合理控制线程的数量和调度策略。

  5. 资源管理:多线程开发中,需要合理管理和释放资源,避免资源泄露或竞争的问题。

  6. 异常处理:多线程开发中,异常的处理需要特别注意,避免异常导致线程中断或程序崩溃。

5.线程用一次就创建一次,然后销毁,怎么解决

创建和销毁线程是一个开销较大的操作,频繁地创建和销毁线程会导致系统资源的浪费和性能下降。因此,通常情况下不建议在每次使用线程时都创建和销毁线程。

解决这个问题的常见做法是使用线程池。线程池是一种管理和复用线程的机制,可以提高线程的效率和性能。通过线程池,可以将任务提交给线程池,由线程池来管理线程的创建、执行和销毁。

使用线程池的好处有以下几点:

  1. 线程复用:线程池中的线程可以被多个任务复用,避免了频繁创建和销毁线程的开销。

  2. 资源管理:线程池可以限制线程的数量,避免线程数量过多导致系统资源耗尽。

  3. 提高响应速度:线程池中的线程可以立即执行任务,不需要等待线程的创建和启动过程,提高了任务的响应速度。

  4. 控制并发度:线程池可以限制并发执行的线程数量,避免系统负载过重。

  5. 提供任务队列:线程池可以提供一个任务队列,用于存储等待执行的任务,保证任务的顺序性。

通过使用线程池,可以有效地解决频繁创建和销毁线程的问题,提高多线程程序的效率和性能。

6.IOC和DI

IOC(Inversion of Control,控制反转)是一种设计模式,它将对象的创建和依赖注入的控制权从应用程序代码转移到外部容器中。在传统的编程模式中,应用程序代码通常负责创建和管理对象之间的依赖关系,而在IOC模式中,这些任务由外部容器负责。IOC模式可以提高代码的可维护性和可测试性,减少代码之间的耦合。

DI(Dependency Injection,依赖注入)是实现IOC模式的一种具体技术。它通过将依赖关系作为参数传递给对象,或通过容器自动注入依赖对象,来实现对象之间的解耦。依赖注入可以通过构造函数注入、属性注入或方法注入来实现。

总结来说,IOC是一种设计模式,它将对象的创建和依赖注入的控制权转移到外部容器中,而DI是实现IOC模式的一种具体技术,它通过注入依赖对象来实现对象之间的解耦。

ioc好处:

IoC(Inversion of Control)是控制反转的意思,这是一种面向对象编程的设计思想。在不采用这种思想的情况下,我们需要自己维护对象与对象之间的依赖关系,很容易造成对象之间的耦合度过高,在一个大型的项目中这十分的不利于代码的维护。IoC则可以解决这种问题,它可以帮我们维护对象与对象之间的依赖关系,降低对象之间的耦合度。

7.Set 怎么去保证去重的

Set数据结构通过其特性来保证元素的去重。Set是一个无序且不重复的集合,它的实现类在添加元素时会自动判断是否已经存在相同的元素,如果存在则不会重复添加。

无论是HashSet还是TreeSet,它们的去重原理都是基于元素的hashCode()和equals()方法

HashSet是基于哈希表实现的,它使用元素的hashCode()方法来确定存储位置,并使用equals()方法来判断元素是否重复。当添加元素时,HashSet会计算元素的哈希值,然后根据哈希值找到对应的存储位置,如果该位置已经存在元素,会使用equals()方法与新元素进行比较,如果equals()方法返回true,则认为两个元素相同,新元素不会被添加进HashSet。

TreeSet是基于红黑树实现的,它使用元素的compareTo()方法(自然顺序)或者传入的Comparator接口来进行元素的排序和去重。当添加元素时,TreeSet会根据元素的比较结果来判断是否重复。如果新元素与已有元素相等(根据自然顺序或Comparator接口的定义),则新元素不会被添加进TreeSet。

因此,无论是HashSet还是TreeSet,它们都是通过hashCode()和equals()方法来保证元素的去重。这也是为什么在使用Set时,元素的类必须正确实现了hashCode()和equals()方法。

8.Set 里面保存的是一个自定义的对象的话,对象应该有什么动作?

拓展:所有类都公共的有可以重写的方法,其中包括了hashCode()和equals()方法

解题:如果你要将自定义的对象保存在Set中,并且希望Set正确地去重和比较对象的相等性,你需要确保你的对象正确实现了hashCode()和equals()方法。

hashCode()方法用于计算对象的哈希值,它在Set中用于确定对象的存储位置。equals()方法用于比较两个对象是否相等,它在Set中用于判断是否重复。

在实现hashCode()方法时,你需要确保相等的对象返回相同的哈希值,这样才能保证对象在Set中的去重效果。在实现equals()方法时,你需要根据对象的属性来比较,确保在属性相等的情况下返回true。

以下是一个示例代码,演示了如何正确实现hashCode()和equals()方法:

public class Person {
    private String name;
    private int age;
​
    // 构造方法和其他方法省略
​
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age;
        return result;
    }
​
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person other = (Person) obj;
        return name.equals(other.name) && age == other.age;
    }
}

在上述示例中,Person类实现了hashCode()和equals()方法。hashCode()方法根据name和age属性计算哈希值,equals()方法根据name和age属性比较两个Person对象的相等性。

当将Person对象保存在Set中时,Set会根据hashCode()和equals()方法来进行去重和比较对象的相等性。如果两个Person对象的name和age属性相等,则认为它们是相同的对象,不会重复添加到Set中。

需要注意的是,为了确保正确的去重和比较,hashCode()和equals()方法的实现必须保持一致性,即如果两个对象根据equals()方法相等,则它们的hashCode()方法返回的哈希值也必须相等。

9.Redolog和Binlog区别

首先说明:

redo log用于缓冲池(在内存中)和磁盘同步数据,用于在刷新脏页到磁盘,发生错误时, 进行数据恢复使用,保持事务的持久性;

binlog用于主数据库和从数据库(主从复制)时,进行数据同步的;

Redo log(重做日志)和Binlog(二进制日志)是数据库中两种不同的日志文件,它们在功能和使用方式上有一些区别。

  1. 功能:

    • Redo log:Redo log是用于恢复数据库的工具,记录了数据库中发生的变更操作,如插入、更新和删除操作。它用于保证数据库的持久性和一致性,以防止在系统故障或崩溃时丢失数据。

    • Binlog:Binlog是用于备份和复制数据库的工具,记录了数据库中的所有变更操作,包括数据修改语句和数据定义语句。它用于实现数据库的主从复制、数据恢复和数据迁移等功能。

  2. 存储位置:

    • Redo log:Redo log是存储在磁盘上的文件,通常与数据库的数据文件放在一起。它是数据库引擎内部的组成部分,用于记录事务的变更操作。

    • Binlog:Binlog也是存储在磁盘上的文件,通常与数据库的数据文件分开存放。它是数据库服务器的组成部分,用于记录数据库的变更操作。

  3. 使用方式:

    • Redo log:Redo log是数据库引擎自动管理的,用户通常无需直接操作。它会在事务提交时自动写入和刷新,以确保数据的持久性和一致性。

    • Binlog:Binlog需要由用户显式地启用,并通过配置参数设置其行为。用户可以根据需要选择是否记录所有的变更操作,以及记录的详细程度。

  4. 数据格式:

    • Redo log:Redo log是以物理格式记录的,即记录了数据库中的物理变更操作。它记录了对数据页的修改,而不是具体的SQL语句。

    • Binlog:Binlog是以逻辑格式记录的,即记录了数据库中的逻辑变更操作。它记录了具体的SQL语句或语句的逻辑表示。

总的来说,Redo log用于数据库的恢复和故障恢复,是数据库引擎内部的组成部分;而Binlog用于备份和复制数据库,是数据库服务器的组成部分。它们在功能、存储位置、使用方式和数据格式上有所不同。

10.synchronized和reentrantlock区别

synchronized和ReentrantLock都是Java中用于实现线程同步的机制,但它们之间有以下几个区别:

  1. 锁的获取方式:synchronized是隐式获取锁的方式,当线程进入synchronized代码块或方法时,会自动获取锁;而ReentrantLock是显式获取锁的方式,需要通过调用lock()方法来获取锁。

  2. 锁的释放方式:synchronized在代码块或方法执行完毕后会自动释放锁,或者在发生异常时也会自动释放锁;而ReentrantLock需要手动调用unlock()方法来释放锁,通常会在finally块中释放锁,以确保锁的释放。

  3. 可重入性:ReentrantLock是可重入锁,即同一个线程可以多次获取同一把锁,而synchronized是不可重入锁,如果一个线程已经获取了锁,再次获取时会造成死锁。

  4. 公平性:ReentrantLock可以设置为公平锁或非公平锁,默认情况下是非公平锁;而synchronized是非公平锁,无法设置为公平锁。

  5. 等待可中断:ReentrantLock可以调用lockInterruptibly()方法,使等待锁的线程可以响应中断,而synchronized在等待锁时无法响应中断。

  6. 条件变量:ReentrantLock可以使用Condition对象来实现线程间的协调与通信,而synchronized无法直接实现这种功能。

总的来说,synchronized是Java中内置的、简单易用的线程同步机制,适用于大多数情况下的线程同步;而ReentrantLock是更灵活、功能更强大的线程同步机制,适用于一些特殊的需求场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/957512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter调试错误大全

一、前言 在使用jmeter做接口测试的过程中大家是不是经常会遇到很多问题,但是无从下手,不知道从哪里开始找起,对于初学者而言这是一个非常头痛的事情。这里结合笔者的经验,总结出以下方法。 二、通过查看运行日志调试问题 写好…

虚拟机Linux20.04磁盘扩展

扩展之前必须要确保!没有快照! ps:先把快照删掉,如果担心弄坏的话可以先克隆一个 如果不删的话就会跟下面一样无法点击扩展: 删除了快照之后就可以点击这个【扩展】,输入你要的磁盘大小即可。 (我这里原…

智能感测棒形静电消除器所具备的特点

智能感测棒形静电消除器是一种具有联网监控功能的设备。它可以通过内置的传感器实时感知周围的静电情况,并采取相应的措施进行消除。 该设备通过联网功能,可以将感测到的静电信息传输到指定的监控平台或手机应用程序中进行实时监控与管理。用户可以随时…

Win11搭建 Elasticsearch 7 集群(一)

一: ES与JDK版本匹配一览表 elasticsearch从7.0开始默认安装了java运行环境,以便在没有安装java运行环境的机器上运行。如果配置了环境变量JAVA_HOME,则elasticsearh启动时会使用JAVA_HOME作为java路径,否则使用elasticsearch根目…

防溺水广播警示系统 python

防溺水广播警示系统通过pythonyolo系列网络框架模型算法,防溺水广播警示系统以识别和判断危险水域中是否有人员溺水的情况。一旦出现溺水现象,算法将立即发出警报信号,并自动启动广播系统进行警示。Python是一种由Guido van Rossum开发的通用…

[递归] 子集 全排列和组合问题

1.1 子集I 思路可以简单概括为 二叉树&#xff0c;每一次分叉要么选择一个元素&#xff0c;要么选择空&#xff0c;总共有n次&#xff0c;因此到n1进行保存结果&#xff0c;返回。像这样&#xff1a; #include <cstdio> #include <vector> #include <algorithm&…

[ros][ubuntu]ros在ubuntu18.04上工作空间创建和发布一个话题

构建catkin工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws/ catkin_make 配置环境变量 echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 检查环境变量 echo $ROS_PACKAGE_PATH…

学习笔记-ThreadLocal

ThreadLocal 什么是ThreadLocal&#xff1f; ThreadLocal 是线程本地变量类&#xff0c;在多线程并行执行过程中&#xff0c;将变量存储在ThreadLocal中&#xff0c;每个线程中都有独立的变量&#xff0c;因此不会出现线程安全问题。 应用举例 解决线程安全问题&#xff1a;例…

pytest---添加自定义命令行参数(pytest_addoption )

前言 在目前互联网公司中&#xff0c;都会存在多个测试环境&#xff0c;那么当我们编写的自动化想要在多套测试环境下进行运行时&#xff0c;如何使用&#xff1f;大多数人想到的可能是通过将我们自动化代码中的地址修改成不同环境&#xff0c;但是这时候就会增加一些工作量&am…

Java设计模式:四、行为型模式-07:状态模式

文章目录 一、定义&#xff1a;状态模式二、模拟场景&#xff1a;状态模式2.1 状态模式2.2 引入依赖2.3 工程结构2.4 模拟审核状态流转2.4.1 活动状态枚举2.4.2 活动信息类2.4.3 活动服务接口2.4.4 返回结果类 三、违背方案&#xff1a;状态模式3.0 引入依赖3.1 工程结构3.2 活…

JVM的故事——垃圾收集器

垃圾收集器 文章目录 垃圾收集器一、serial收集器二、parnew收集器三、parallel scavenge收集器四、serial old收集器五、parallel old收集器六、CMS收集器七、Garbage First收集器八、收集器的权衡 一、serial收集器 新生代收集器&#xff0c;最基础的收集器&#xff0c;单线…

C#备份数据库文件

c#备份数据库文件完整代码 sqlServer 存储过程&#xff1a; USE [PSIDBase] GO /****** Object: StoredProcedure [dbo].[sp_BackupDB] Script Date: 2023/8/31 16:49:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GOALTER procedure [dbo].[sp_BackupDB]…

【Unity每日一记】WheelColider组件汽车游戏的关键

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

2023年腾讯云优惠券(代金券)领取方法整理汇总

腾讯云优惠券是腾讯云为了吸引用户而推出的一种优惠凭证&#xff0c;领券之后新购、续费、升级腾讯云的相关产品可以享受优惠&#xff0c;从而节省一点的费用&#xff0c;下面给大家分享腾讯云优惠券领取的几种方法。 一、腾讯云官网领券页面领取 腾讯云官网经常推出各种优惠活…

C#,数值计算——Midinf的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Midinf : Midpnt { public new double func(double x) { return funk.funk(1.0 / x) / (x * x); } public Midinf(UniVarRealValueFun funcc, double aa,…

内存四区(个人学习笔记黑马学习)

1、内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域&#xff1a; 代码区:存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:编译器自动分配释放,存放函数的参数值,局部变量等 堆区:由程序员分配和释放,若程…

SpringBoot整合Freemaker结合Vue实现页面填写一键自动生成Redis的配置文件

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Sp…

DCMM数据能力成熟度评估模型--学习笔记

DCMM数据能力成熟度评估模型--学习笔记 1、DCMM简介、结构组成和成熟度评估等级划分1.1 DCMM简介1.2 DCMM结构组成1.3 DCMM关键过程域1.3.1、数据战略&#xff08;指导方针&#xff09;1.3.2、数据治理 &#xff08;机制保障&#xff09;1.3.3、数据架构 (施工图纸)1.3.4、数据…

WebRTC-Streamer交叉编译

WebRTC-Streamer交叉编译 flyfish 文章目录 WebRTC-Streamer交叉编译零、前言一、提前准备工作1 安装需要的工具2 可选的交叉编译工具3 默认执行python是python34 获取源码5 使用其他版本的方法 二、非交叉编译编译1 在 src目录执行 安装所需的依赖2 执行命令 三、 交叉编译1 …

【GAMES202】Real-Time Global Illumination(in 3D)—实时全局光照(3D空间)

一、SH for Glossy transport 1.Diffuse PRT回顾 上篇我们介绍了PRT&#xff0c;并以Diffuse的BRDF作为例子分析了预计算的部分&#xff0c;包括Lighting和Light transport&#xff0c;如上图所示。 包括我们还提到了SH&#xff0c;可以用SH的有限阶近似拟合球面函数&#xff…