2021年,54道大厂面试题:附完整答案!(1)

1、HashMap的时间复杂度分析

put操作的流程:

第一步:key.hashcode(),时间复杂度O(1)。

第二步:找到桶以后,判断桶里是否有元素,如果没有,直接new一个entey节点插入到数组中。时间复杂度O(1)。

第三步:如果桶里有元素,并且元素个数小于6,则调用equals方法,比较是否存在相同名字的key,不存在则new一个entry插入都链表尾部。时间复杂度O(1)+O(n)=O(n)。

第四步:如果桶里有元素,并且元素个数大于6,则调用equals方法,比较是否存在相同名字的key,不存在则new一个entry插入都链表尾部。时间复杂度O(1)+O(logn)=O(logn)。红黑树查询的时间复杂度是logn。

通过上面的分析,我们可以得出结论,HashMap新增元素的时间复杂度是不固定的,可能的值有O(1)、O(logn)、O(n)。

2、关于Java中HashTable和HashMap的区别:

1、继承: HashTable继承自Dirctionary,HashMap继承自AbstractMap,二者均实现了Map接口; 2、线程安全性: HashTable的方法是同步的,即是线程安全的。HaspMap的方法不是同步的,不是线程安全的的。在多线程并发的情况下,我们可以直接使用HashTable,如果 要使用HashMap,就需要自行对HashMap的同步处理。 3、键值: HashTable中不允许有null键和null值,HashMap中允许出现一个null键,可以存在一个或者多个键的值都为null。程序中,对于HashMap,如果使用get(参数为 键)方法时,返回结果为null,可能是该键不存在,也可能是该键对应的值为null,这就出现了结果的二义性。因此,在HashMap中,我们不能使用get()方法来查询键 对应的值,应该使用containskey()方法。 4、遍历: 这两个在遍历方式的实现不同。HashTable和HashMap两者都实现了Iterator。但是,由于历史原因,HashTable还使用了Enumeration。 5、哈希值: HashTable是直接使用对象的hashCode。HashMap是重新计算hash值。 6、扩容: HashTable和HashMap的底层实现的数组和初始大小和扩容方式。HashTable初始大小为11,并且每次扩容都为:2old+1。HashMap的默认大小为16,并且一 定是2的指数,每次扩容都为old2。

3、为什么用B+树存储索引而不是Hash索引?Hash索引它O(1)不是更快吗?

查询单条数据确实Hash索引快,但同上,B+树支持 范围查询 ,而Hash索引做不到。

而且数据库索引一般存储在磁盘中,加载进内存中如果数据量大的话 无法一次装入内存 ,B+树的设计可以允许数据 分批加载 ,同时树的高度较低,提高查找效率。

4、BST(二叉搜索树)

BST(Binary Search Tree)目的是为了提高查找的性能,其查找在平均和最坏的情况下都是logn级别,接近二分查找。

其特点是:每个节点的值大于其任意左侧子节点的值,小于其任意右节点的值

5、Mysql回表

回表就是先通过数据库索引扫描出数据所在的行,再通过行主键id取出索引中未提供的数据,即基于非主键索引的查询需要多扫描一棵索引树。

什么时候需要回表?什么时候不需要回表? 答:聚簇索引和覆盖索引不需要回表,其他情况都需要回表

6、联合索引

当我们的where查询存在多个条件查询的时候,我们需要对查询的列创建组合索引

最左匹配原则

只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合,所以在建立联合索引的时候查询最频繁的条件要放在左边

7、linux常用命令

shutdown ===关机 reboot ==重启 目录切换===cd 目录查看===ls

创建目录===mkdir 删除目录===rm help==帮助 man==说明书

目录修改===mv 搜索目录===find 查看当前工作目录==pwd

新增文件==touch 删除文件===rm 复制文件==cp 修改文件===vim 文件查看===cat/more/less/tail/head

修改权限===chmod

压缩文件===tar 查找命令===grep/find/locate/whereis/which

切换用户===su/sudo

==================================0==================================

显示磁盘==df -l 文件或目录磁盘的使用===du

创建连接===ln -s(软连接,无S硬) 时间==date

查看当前运行的进程状态,一次性===ps

显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等==top

kill 显示系统内存使用情况====free

==================================0======================================

显示文件详细信息==stat who===在线登录用户 whoami===操作用户

主机名==hostname 系统信息===uname 查看网络情况====ifconfig

测试网络连通===ping 显示网络状态信息===netstart

8、java基础之ArrayList和Vector的主要区别

List接口下一共实现了三个类:ArrayList,Vector,LinkedList。 LinkedList主要保持数据的插入顺序的时候使用,采用链表结构。

ArrayList,Vector主要区别为以下几点: (1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比; (2):ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍; (3):Vector可以设置capacityIncrement,而ArrayList不可以,从字面理解就是capacity容量,Increment增加,容量增长的参数。

9、排序

10、拥塞控制

TCP的四种拥塞控制算法 1.慢开始

一开始注入的报文段少,cwnd慢慢增加 1-2-4-8,收到多少个确认报文,就增加多少个cwnd,若当前的拥塞窗口cwnd的值已经等于慢开始门限值,之后改用拥塞避免算法

2.拥塞避免

就是每个传输轮次,拥塞窗口cwnd只能线性加一

只要网络出现拥塞(没有按时到达)时,就把ssthresh的值置为出现拥塞时的拥塞窗口的一半(但不能小于2),以及cwnd置为1,进行慢开始。

3.快重传

连续收到3个重复的确认报文端,就认为是拥塞发生了

收到三个确认,发送方尽快进行重传,不需要等待超时重传定时器溢出

4.快恢复

降低满开始和拥塞窗口的值为一半,将CWND设置为新的ssthresh(减半后的ssthresh),然后开始执行拥塞避免算法

<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值