阿里巴巴-口碑-上海-Java一面部分面试题

面试 java 基础知识


  • 阿里巴巴-口碑-上海-Java一面部分面试题

    • 1. Jdk1.8中的HashMap实现原理?
    • 2. 问: 小灰,你来说说,数据库索引为什么要使用树结构存储呢?
    • 3.什么是B+树?
    • 4. 如何用程序判断出链表是有环链表?
    • 5. 进程和线程的区别?
    • 6. 简述浏览器访问一个网页的过程?

1. Jdk1.8中的HashMap实现原理?

答:在Java8中,采用数组+链表+红黑树。HashMap的数据结构,在Jdk7中采用的是数组+链表的形式。 当hashMap 单个链表的长度超过8的时候,就会将链表转换为红黑树。加入红黑树的主要目的就在于提高在数据量很大的时候hashMap增删改查的效率。我们都知道,链表的查找效率是O(n),而在红黑树中是O(log(n))。 hashMap 中的哈希桶数组的长度为16,负载影子为0.75。 当整个哈希桶的数量超过阈值(16*0.75)时,就会进行扩容,将整个hashmap的容量扩展2倍。所有的容量都是2的倍数,这样设计的考虑主要是为了在计算key中的索引值的时候,能够取代取模运算。在hashmap中根据key的hashcode的,的高16与低16位进行与或操作。这样设计的目的就是,希望在hashmap的长度不是很长的时候,高位的bit位也能参与运算,同时性能消耗也不大。HashMap的取值运算 先做与或运算再求与。 在JDK8 中对hashMap的值进行统计了,在resize中的时候,不需要重新计算hashcode。由前面可以看到,哈希桶的索引计算如下。

000000000000010 100111000101101  由key计算hashcode
000000000000010  高位16
100111000101001  和低16
100111000101011  与或
000000000001011  与索引16相与

当需要扩展的时候,我们只需要计算在32位相与的时候新增加的位是0还是1,如果0,则保持不变,如果为1,则扩展到新的位置。新位置为原始位置+16

00000000000 1011
00000000001 1111

具体参考链接。

来源程序员小灰

2. 问: 小灰,你来说说,数据库索引为什么要使用树结构存储呢?

答:这还不简单,树的查询效率高,而且可以保持有序。

问:既然这样,为什么索引没有使用二叉查找树来实现呢?

答:呃,这我就不明白了..二叉查找树查询的时间复杂度是O(log(n))O(log(n))O(log(n)),性能已经足够高了啊,难道B树可以比它更快?

问:其实从算法逻辑上来讲,二叉查找树的查找速度和比较次数都是最小的。但是,我们不得不考虑一个现实问题:
磁盘IO。数据库索引是存储在磁盘上的,当数据量比较大的时候,索引的大小可能有几个G甚至更多。当我们利用索引查询的时候,能把整个索引全部加载到内存吗?显然不可能。能做的只有逐一加载每一个磁盘页,这里的磁盘页对应着索引树的节点。

如果采用二叉树来存储索引的话,相同节点的二叉树高度相对于B树的高度更高,而高度就代表了磁盘的索引的次数。而IO的访问次数限制了数据库加载的速度。所以,二叉树的的性能并不比矮胖的B树这种多路平衡查找树效果好。B树的每一个节点最多包含k个孩子,k被称为B树的阶。k的大小取决于磁盘页的大小。

具体的B树介绍查看链接

3.什么是B+树?

B+树是基于B-树的一种变体,有着比B-树更高的查询性能。

B+树的几个特点。首先,每一个父节点的元素都出现在子节点中,是子节点的最大(或最小)元素。

在上面这棵树中,根节点元素8是子节点2,5,8的最大元素,也是叶子节点6,8的最大元素。需要注意的是,根节点的最大元素(这里是15),也就等同于整个B+树的最大元素。以后无论插入删除多少元素,始终要保持最大元素在根节点当中。至于叶子节点,由于父节点的元素都出现在子节点,因此所有叶子节点包含了全量元素信息

并且每一个叶子节点都带有指向下一个节点的指针,形成了一个有序链表。

具体实现参考链接

4. 如何用程序判断出链表是有环链表?

方法一:简单的暴力一点的,每次遍历一个新的结点的时候,就从头结点到该结点所有的所有元素都遍历一遍,如果存在相同的元素,则说明,该元素之间存在环。时间复杂度为 O(log(n2))O(log(n2))O(log(n^2))。

方法二:首先创建一个以节点ID为键的HashSet集合,用来存储曾经遍历过的节点。然后同样是从头结点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就用新节点和HashSet集合当中存储的节点作比较,如果发现HashSet当中存在相同节点ID,则说明链表有环,如果HashSet当中不存在相同的节点ID,就把这个新节点ID存入HashSet,之后进入下一节点,继续重复刚才的操作。本质上是采用空间换时间。

方法三:首先创建两个指针1和2(在java里就是两个对象引用),同时指向这个链表的头节点。然后开始一个大循环,在循环体中,让指针1每次向下移动一个节点,让指针2每次向下移动两个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断出链表有环,如果不同,则继续下一次循环。

假设从链表头节点到入环点的距离是D,链表的环长是S。那么循环会进行S次(为什么是S次,有心的同学可以自己揣摩下),可以简单理解为O(N)。除了两个指针以外,没有使用任何额外存储空间,所以空间复杂度是O(1)。

问题一:判断两个单向链表是否相交,如果相交,求出交点?

答: 将其中一条链表连接到另一条链表的尾部,如果两个链表相交,那么将会存在交点,也就是说会存在

问题二:在一个有环链表中,如何找出链表的入环点?

答: 假设入环点距离距离链表的长度为D,环的大小为S,假设相遇的点到入环点的距离为 xxx,那么第一入环相遇满足如下条件。

2×(D+x)=D+n×s+x" role="presentation">2×(D+x)=D+n×s+x2×(D+x)=D+n×s+x

2 \times (D+x) = D + n\times s + x
由此可以知道,第一次相遇,走的慢的指针总共走了 T1=D+xT1=D+xT1 = D+x的长度,第二次相遇,走的慢的指针走了 T2=D+x+ST2=D+x+ST2=D+x+S,所以,通过前后两次时间差可以确定SSS的大小。进一步的求出 D" role="presentation" style="position: relative;">DDD 的大小

参考原文链接

5. 进程和线程的区别?

能说多少说多少吧。参考链接

  1. 进程的划分尺度大于线程,一个程序通常至少以一个进程,而一个进程最少有一个线程。
  2. 进程和线程是不同操作系统对资源的管理方式。进程是操作系统分配资源的单位,线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位
  3. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。所有,启动进程的耗费的资源比线程多得多。

简洁版:

  1. 进程是运行中的程序,线程是进程的内部的一个执行序列
  2. 进程是资源分配的单元,线程是执行行单元
  3. 进程间切换代价大,线程间切换代价小
  4. 进程拥有资源多,线程拥有资源少
  5. 多个线程共享进程的资源

牛客网链接

6. 简述浏览器访问一个网页的过程?

我个人理解就是说明下TCP三次握手协议,其它的也搞不懂-_-||。

TCP握手协议
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.
1. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
SYN:同步序列编号(Synchronize Sequence Numbers)
2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.

阿里巴巴-口碑-上海-Java一面部分面试题相关推荐

  1. 阿里巴巴社招Java面试题做题记录

    阿里巴巴社招Java面试题 1.String和StringBuffer的区别 运行速度和线程安全两方面: 运行速度:StringBuilder >StringBuffer >String ...

  2. Java并发编程面试题(2020最新版)

    转载自  Java并发编程面试题(2020最新版) 基础知识 并发编程的优缺点 为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到 ...

  3. 阿里巴巴开源的 Java 诊断工具Arthas【入门篇】

    前面: 各位老铁们,好久没和大家见面了,最近一直躲在家里不敢出来门,过着像猪的生活..... 吃喝拉撒睡觉.远程在家办公一段时间也是遇到了比较棘手的问题.所以没有顾得上来和大家分享了,不过大家放心,从 ...

  4. 2023年,最新最权威的上海Java培训机构排行榜出炉!

    2022也许你的很多学习和工作计划都被打乱,但是过去的2022不管多艰难,多难熬.都已经成为过去式.2023悄然而至,新的一年,你我都该有新气象新动力,学习什么时候开始都不晚,想跨行从事软件开发.IT ...

  5. 上海Java培训机构排名榜单已出炉,实力学员推荐不看后悔

    学习Java编程不在是校内学生们的专利了,随着职场上竞争越来越激烈,毫无基础的或想要转行的求职者对于学习Java的积极性也是越来越高,因此,市面上涌现了大批的成人Java培训机构,为了不让大家纠结,小 ...

  6. java面试、笔试题(0815版)

    java面试.笔试题(201 1. Java基础部分 4 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 4 2.Java有没有goto? 4 3.说 ...

  7. Java程序员面试题

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最 ...

  8. 2022 Java秋招面试题-必备基础

    文章目录 2022 Java秋招面试题-必备基础 一.语言基础 Java技术栈基础-语言基础 Java技术栈基础-spring Java技术栈基础-netty 二.面向对象 三.存储 redis my ...

  9. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)

    Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...

最新文章

  1. 保险业尚不能完全发挥CRM优势 需强化
  2. 微信支付的架构真的那么牛吗?
  3. python type创建类_Python基于内置函数type创建新类型
  4. 装了mysql但是服务里没有反应_Mysql安装后在服务里找不到和服务启动不起来的解决方法...
  5. Caffe学习系列(16):各层权值参数可视化
  6. python epoll 并发_Python语言之python并发原理(阻塞、非阻塞、epoll)
  7. 你可能没有听说过 js中的 DOM操作还有这个: HTMLCollection 和 NodeList
  8. 顺丰控股:2月速运物流业务营业收入98.49亿元,同比下降3.36%
  9. Disruptor 创建过程
  10. (转)洪小文:以科学的方式赤裸裸地剖析AI|混沌初开
  11. BC95(ML5515)连接TCP流程
  12. RedisTemplate使用lua脚本
  13. 将python(py文件)转换成.exe方法
  14. 计算机无法显示硬盘盘符,移动硬盘连接电脑不显示盘符怎么回事?移动硬盘连接电脑不显示盘符的原因和解决方法...
  15. 7种炫酷HTML5 SVG液态水滴融合分解动画特效
  16. STRAIGHT_JOIN
  17. char *a 与char a[]所占空间解析题
  18. 电脑计算机硬盘怎么新建,电脑如何新建一个本地磁盘
  19. php获得视频分辨率,php+ffmpeg 获取视频相关信息(缩略图、视频分辨率)
  20. 春节灯笼Html代码实现+点击页面出现文字

热门文章

  1. 爬虫第二弹之http协议和https协议
  2. 三维动漫计算机配置,三维动画软件之Houdini软件的电脑配置要求_渲云动态
  3. Python 标准库:: re---正则表达式操作
  4. 《机器学习》第四章 人工神经网络 深度学习启蒙篇
  5. 信息技术不叫计算机课,信息技术课四要四不要
  6. 几个SQL分析小技巧
  7. stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应
  8. ges resource dynamic和ges enqueues占用较高导致实例终止问题处理
  9. Echarts实现正弦曲线和散点图
  10. 用scons编译STM32F103工程