java开发基础面试题,java五年经验面试题

springboot全家桶 springboot全家桶     2022-12-05     765

关键词:

正文

二叉树

由 n( n > 0)个有限节点组成一个具有层次关系的集合,看起来就像一个倒挂的树,因此称这样的数据结构为树。

一个节点的子节点个数叫做度,通俗的讲就是树叉的个数。树中最大的度叫做树的度,也叫做阶。一个 2 阶树最多有 2 个子节点即最多有 2 叉,因此这样的树称为二叉树,二叉树是树家族中最简单的树。

image.png

两个叉的树就是二叉树,可这除了用来按一定结构存放数据外,跟查询性能好像也没关系,不会又是一个没用的噱头吧。

二分查找

听说二叉树的原始威力来源于一种叫做二分查找的算法。

相传在鹦鹉的原始社会,存在着森严的等级制度,每只鸟必须按高矮顺序分出等级和尊卑。

那么问题来了,如下图,怎样才能找出最高、最矮、中等高的那些鹦鹉呢、以及指定高度的那只呢?

image

第一种方法: 扫描法

一个一个依次测量,完毕后所有的问题都迎刃而解。

这种一个一个依次全部测量的方法叫做扫描,他的缺点很明显,最高和最矮,需要全部测量完毕才能知晓。

而对于指定高度,最好的情况是第一次就找到;最坏的情况是最后一次才找到,时间复杂度为 n,也就是说从 13 个鹦鹉中找到指定身高的那只,最坏的情况是查 13 次。

第二种方法:二分法

13 个鹦鹉全部听令,按从矮到高列队,向左看齐,报数。

image.png

报数字 1 的就是最矮的,报数字 13 的就是最高的,报数字 7 的就是中等身高的那只。

最好和最坏的情况都是一次找到。而查询性能一下子提高 13 倍,我的个乖乖,无论多个只鹦鹉,时间复杂度都是 1,好可怕。

问题:我不服,你这是偷换概念,有本事对比一个查找指定高度鹦鹉的性能。

因为鹦鹉们已经按高矮排好了队,所以指定高度的鹦鹉,要么是站中间那个只,要么就是在它的左边或右边的那群里。

如果是中间那个,一次就找到,如果不是只需要从中间左边或右边那一半中找,再在这一半中找中间那只,对比身高。

以此类推,每次都把查询的范围减半,时间复杂度log2(n)。那么 log2(13) 就是 4,最坏的情况也才 4 次,时间复杂度确实不是 1 了,但好像也不糟。

简化如下:

image.png

问题:如果按高矮排队,仍然需要一个一个比较,跟扫描有什么区别,那还不如直接扫描呢?

事实确实如此,单纯的一次查询,先排序,再二分查找,不见得比扫描快,甚至还不如。

但是,在数据的世界,大部分数据一生会被查询无数次,如果只在数据降生的时候排一次序,往后余生,是不是就可以直接用二分查找,这似乎就是传说的读多写少,以及对应的复用。

优点:

  • 查找快

缺点:

  • 必须有序,需要提前排序

  • 每次查找都需要不断计算中间位置

二分查找树

如果一组数据不会或不常变更,那么他们的位置也基本不变。可是每次查询都需要重新计算中间位置是一种浪费,而浪费可耻。

我们能不能把所有中间节点组织起来,每次使用时,直接取中间节点?

请看下图,找到所有单次二分查找的中间节点,把他们连起来,并用手提起最中间的那个节点,就是一棵二分查找树。

image.png

优点:二分查找树就是通过数据结构的方式实现了二分查找算法,通过存储中间节点的数据,弥补了二分查找每次都要计算中间位置的缺点。

平衡二叉树:

如果二分查找树不断进行修改,比如删除某些节点,经过一段时间后,最早那个中间节点的数据(根),很可能就不在中间了。

中间位置就像一个天平的支点,如果他不在中间了,那么整个天平就会失衡,失衡的世界就会坍塌成不伦不类的瘸树,甚至是降维成一个链表或者数组。

image.png

二分查找算法的关键在于有序和中间节点,而二分查找树的关键是中间节点的维护,如果维护的节点已经不在中间了,那么它就失去了意义。

所以必须保证「二分查找树」是一个正确的树,一个根节点在中心的树,一个左右子树层级(高度)基本相等(高度相差不超过1)的树,一个平衡的树。

平衡二叉树中最常见的就是红黑树:

image.png

红黑树规定了一系列节点颜色规则,以及对应的左旋和右旋操作来保证颜色规则,从而达到树的平衡性。

看到这花里胡哨的颜色以及复杂的规则,让人第一眼就望而却步,但所有的这些,也不过是为了保证二叉树的平衡性,由于维持平衡的操作太过麻烦,无法用一句话简单概括,只好用一堆人鬼难分的规则和步骤来实现,只要按着这些步骤就一定能实现二叉树的平衡。

平衡二叉树 = 二分查找树 + 平衡(左右高度相差不超过 1 )

平衡二叉树并未提高二分查找树的性能,它只是保正树不会被二向箔(多次增删改)打击降维成链表或不对称的残缺树,永远维持平衡。

另外,不仅仅是二叉树,其他种类的树,也是需要有序和平衡,才能发挥最大的威力。

多叉树之 B-tree

两个叉的树就能折半查询,理论可以提高一倍性能,那么多个叉是不是能提高更多倍性能?

如下图的 3 阶(叉)树(所有数据仅用于演示,非真实分布)

image.png

每个节点维护两个数据,并指向最多 3 个子节点。如图 3 个子节点的数据分别为:小于 17, 17 ~ 35 ,大于 35。

假设,从上图中查找 10 这个数,步骤如下:

  1. 找到根节点,对比 10 与 17 和 35 的大小,发现 10 < 17 在左子节点,也就是第 2 层节点;

  2. 从根节点的指针,找到左子节点,对比 10 与 8 和 12 的大小,发现 8 < 10 < 12,数据在当前节点的中间子节点,也就是第 3 层节点;

  3. 通过上步节点的指针,找到中间子节点(第 3 层节点),对比 10 与 9 和 10 的大小,发现 9 < 10 == 10,因此找到当前节点的第二数即为结果。

加上忽略的 12 个数据,从 26 个数据中查找一个数字 10,仅仅用了 log ⁡ 3 26 \\log_3 26log326 ≈ \\approx≈ 3 次,而如果用平衡二叉树,则需要 log ⁡ 2 26 \\log _226log226 ≈ \\approx≈ 5 次。事实证明,多叉树确实可以再次提高查找性能。

多叉树是在二分查找树的基础上,增加单个节点的数据存储数量,同时增加了树的子节点数,一次计算可以把查找范围缩小更多。

优点:二叉平衡树的基础上,使加载一次节点,可以加载更多路径数据,同时把查询范围缩减到更小。

复杂节点: 至此,我们列举的数据都是孤零零的单个数字。试想,你手里已经有一个数据 10,为什么还要费力吧唧的再从一堆数据中找到这个 10,自己找自己?这不是有病吗?

单个数字只能活在演示中,现实的世界要复杂的多,我们来看一个接近真实场景的案例。

现有一个以年龄为索引的 3 阶树,存储了一批用户信息,如下图:

image

数字为用户的年龄,其它为与树排序查找无关的业务数据,像这种索引数据与树排序查找无关的业务一起维护在节点的平衡多叉(阶)树称为 B- 树( B 树)。

缺点:业务数据的大小可能远远超过了索引数据的大小,每次为了查找对比计算,需要把数据加载到内存以及 CPU 高速缓存中时,都要把索引数据和无关的业务数据全部查出来。本来一次就可以把所有索引数据加载进来,现在却要多次才能加载完。如果所对比的节点不是所查的数据,那么这些加载进内存的业务数据就毫无用处,全部抛弃。

最后

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习,戳这里免费领取

已经将知识体系整理好(源码,笔记,PPT,学习视频)免费领取。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

经将知识体系整理好(源码,笔记,PPT,学习视频)免费领取。

[外链图片转存中…(img-KQOIQ1Kz-1626078644061)]

[外链图片转存中…(img-dyJdPtia-1626078644062)]

[外链图片转存中…(img-1xTLy1I9-1626078644063)]

金九银十首战告捷,五年android开发工程师面试经验分享(附面试题解析)

笔者从前期准备到所有面试结束,花费了差不多3个月的时间。真可谓“面试造火箭,工作拧螺丝”,面试过程真的很累很辛苦。笔者面了很多公司,最终拿下了百度、腾讯和京东的offer,最后可能会选择京东... 查看详情

java面试题合集java面试题

分布式数据库面试专题系列:分布式通讯面试专题系列:分布式限流面试专题系列:常见算法面试题:开发框架面试题:面试扩充:面试经验:BAT面试常问:性能优化面试题:获取面试题集、学习资料,可以扫描下方二维码 查看详情

java开发基础面试题,java研发工程师年终总结

Spring面试高频问题SpringMVC面试高频问题MyBatis面试高频问题SpringBoot面试高频题SpringCloud面试高频问题Redis高级面试题Dubbo高频常问面试问题Java虚拟机(JVM)MySQL数据库高频面试问题Java高频面试专题合集解析:当然在这还... 查看详情

android面试题java基础

Android面试题(一)Java基础Android面试题(二)Android基础Android面试题(三)Java虚拟机Android面试题(四)设计模式Android面试题(五)数据结构/算法Android面试题(六)网络基础 查看详情

java开发基础面试题,成都比较好的java公司

题库非常全面包括Java集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大厂面试题等、等技术栈!Java集合72道JVM20... 查看详情

创优视觉程序员如何有效准备java面试

...准备。  一般来说,面试组分为以下三类:  一、有开发经验的开发者和用户。  对于第一类有开发经验的人来说,只需要在网上找到可靠的面试题,刷一个月的面试题,基本就可以完成大部分面试。  刷题技巧:找到大... 查看详情

java面试基础题整理学习

... 1.JDK和JRE有什么区别?JDK:JavaDevelopmentKit的简称,java开发工具包,提供了java的开发环境和运行环境。JRE:JavaRuntimeEnvironment的简称,java运行环境,为java的运行提供了所需环 查看详情

java面试题之java基础

...的Java程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。JDK(JavaDevelopmentKit)是程序开发者用来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性 查看详情

android面试题设计模式

...一般问到的不多,如果面试中问到的话,一般会问你实际开发中都用到了哪些设计模式,一般根据自己具体使用到的设计模式回答就可以, 查看详情

android面试题设计模式

...一般问到的不多,如果面试中问到的话,一般会问你实际开发中都用到了哪些设计模式,一般根据自己具体使用到的设计模式回答就可以, 查看详情

工作几年java面试题不会做怎么办

...识,在找工作之前搜一些往年的面试题,复习一下java的基础知识,就可以通过第一轮面试。其实工作几年,公司看中的是经验,而不是java的基础。参考技术A我都是靠背的背多了自然会了 参考技术B只能一般多看看面试题啦,一... 查看详情

android面试题java虚拟机

Android面试题(一)Java基础Android面试题(二)Android基础Android面试题(三)Java虚拟机Android面试题(四)设计模式Android面试题(五)数据结构/算法Android面试题(六)网络基础Java虚拟机和Dalvi 查看详情

java线程面试题(代码片段)

...,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。在典型的Java面试中,面试官会从线程的... 查看详情

2022年python技术类面试题总结(面试题+答案解析)

...试中脱颖而出,找到一份高薪工作。这些面试题分为Python基础和Python高级,内容包含:基础语法、文件操作、模块与包、数据类型、元类、内存管理与垃圾回收机制以及Python函数等知识点。(一)Python基础语法(二)文件操作(... 查看详情

java面试题——java基础

...完全一样,在不同的操作系统执行不同的程序代码,java开发了java虚拟机来屏蔽系统之间的差异,针对不同的系统安装不同的虚拟机即可。2.int数据占32字节  8中基本类型:byte(8)、short(16)、int(32)、long(64)、float(32)、double(6... 查看详情

java基础面试题,面试真题解析

蚂蚁金服电话一面第二天早上10点第一轮电话面试,我们大约聊了半个小时,关于学历工作经验这些都没有问到,对方关注的是一些基本的知识,具体记得的几个问题:Spring或者数据库的事物隔离级别和传播特... 查看详情

java开发基础面试题,java游戏编程贪吃蛇

一.为什么使用springcloudalibaba很多人可能会问,有了springcloud这个微服务的框架,为什么又要使用springcloudalibaba这个框架了?最重要的原因在于springcloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上... 查看详情

java开发基础面试题,java三大体系分为

为什么阿里巴巴的持久层抛弃hibernate,采用MyBatis框架?原因大概有以下4点:尤其是需要处理大量数据或者大并发情况的网站服务,这也阿里选择MyBatis的原因。MyBatis整体架构不多讲,先看目录图MyBatis源码笔记... 查看详情