背景是公司需要急招一名高级开发,我记录了一个比较典型小伙伴的面试问答,先看下这位应聘者的简历以及我在面试中提问的技术点(由于篇幅问题,仅抽取技能部分)。

↑ 简历

在还没开始面试前,简历的问题挺明显的:

从技能部分可以看出中间件描述稍微有点少,且技能描述比较模糊,其次关键性的技术没有描述(第三项),第六项需要猜测,不能清晰感知到他会的中间件是什么只能靠面试中来问(很容易栽倒坑里)。

(偷偷问一句,你们的简历是不是也是这样写的?如果是的话可以在下方留言哦!)

面试岗位需求:

面试知识点剧透:

设计模式,Redis,JVM,场景题

正文

省略掉没有任何内容的自我介绍和互相的礼性问候 个人擅长点在设计模式 redis 以及 netty

设计模式

在刚刚的自我介绍中我了解到了你的一定情况,我们来谈一些技术性的问题吧! 从你的开发技能中又描述你对常用的设计模式有深入的了解,能说说你用到的一些设计模式和其对应的业务场景吧,举两个例子即可。

设计模式总共有 23 种,总体来说可以分为三大类:创建型模式( Creational Patterns )、结构型模式( Structural Patterns )和行为型模式( Behavioral Patterns )

我用的最多的是以下三种:简单工厂模 ,单例模式,

简单工厂模式

其中简单工厂模式又叫静态工厂方法模式,其实就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。比如,一台咖啡机就可以理解为一个工厂模式,你只需要按下想喝的咖啡品类的按钮(摩卡或拿铁),它就会给你生产一杯相应的咖啡,你不需要管它内部的具体实现,只要告诉它你的需求即可。

优点:

  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象;

  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量;

  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

缺点:

  • 不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑;

  • 产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不利于系统的维护。

单例模式

单例模式则是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。

优点:不会频繁地创建和销毁对象,浪费系统资源。

使用场景:IO 、数据库连接、Redis 连接等。

装饰器模式

装饰器模式是指动态地给一个对象增加一些额外的功能,同时又不改变其结构。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

装饰器模式的关键:装饰器中使用了被装饰的对象。

比如,创建一个对象“laowang”,给对象添加不同的装饰,穿上夹克、戴上帽子......,这个执行过程就是装饰者模式,

我常用的大概就是这三种。

PS:从这一部分可以看出确实设计模式比较扎实所有我换了一个知识点来问。

JVM

JVM、Dalvik、ART的区别?

首先要明白什么是Dalvik:

Dalvik是Google公司自己设计用于Android平台的Java虚拟机。它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik应用设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

什么是ART:

ART代表AndroidRuntime,Dalvik是依靠一个Just-In-Time(JIT)编译器去解释字节码,运行时编译后的应用代码都需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运行。

ART则完全改变了这种做法,在应用安装的时候就预编译字节码到机器语言,这一机制叫Ahead-Of-Time(AOT)预编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。

1. Dalvik与JVM的区别

(1)Dalvik指令集是基于寄存器的架构,执行特有的文件格式——dex字节码(适合内存和处理器速度有限的系统)。而JVM是基于栈的。相对于基于栈的JVM而言,基于寄存器的Dalvik VM实现虽然牺牲了一些平台无关性,但是它在代码的执行效率上要更胜一筹。

(2)每一个Android 的App是独立跑在一个VM中的。因此一个App crash只会影响到自身的VM,不会影响到其他。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik应用作为一个独立的Linux进程执行。

2. Dalvik与ART的区别

(1)在Dalvik下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用的运行效率。而在ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。

(2)ART占用空间比Dalvik大(原生代码占用的存储空间更大,字节码变为机器码之后,可能会增加10%-20%),这也是著名的“空间换时间大法"。

(4)预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗。

Redis

:Redis 有了解过么?

:有的

Redis是单线程的吗?

Redis是单线程的!

Redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。Redis 用 单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案。

在6.0之后是多线程的 但是最终的底层还是单线程的。

在redis底层数据扩容 rehash 那么能简单描述一下吗?

redis字典(hash表)当数据越来越多的时候,就会发生扩容,也就是rehash

对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度变为原来的二倍,将原hash表数据全部重新计算hash地址,重新分配位置,达到rehash目的

redis中的hash表采用的是渐进式hash的方式:

在扩容和收缩的时候,如果哈希字典中有很多元素,一次性将这些键全部rehash到ht[1]的话,可能会导致服务器在一段时间内停止服务。所以,采用渐进式rehash的方式,详细步骤如下:

  1. 为ht[1]分配空间,让字典同时持有ht[0]和ht[1]两个哈希表

  2. 将rehashindex的值设置为0,表示rehash工作正式开始

  3. 在rehash期间,每次对字典执行增删改查操作是,程序除了执行指定的操作以外,还会顺带将ht[0]哈希表在rehashindex索引上的所有键值对rehash到ht[1],当rehash工作完成以后,rehashindex的值+1

  4. 随着字典操作的不断执行,最终会在某一时间段上ht[0]的所有键值对都会被rehash到ht[1],这时将rehashindex的值设置为-1,表示rehash操作结束 。

渐进式rehash采用的是一种分而治之的方式,将rehash的操作分摊在每一个的访问中,避免集中式rehash而带来的庞大计算量。

需要注意的是在渐进式rehash的过程,如果有增删改查操作时,如果index大于rehashindex,访问ht[0],否则访问ht[1]。

场景题

:在这里我问一个业务相关的场景:如何把一个文件快速下发到 100w 个服务器

:采用p2p网络形式 比如树状形式,网状形式 单个节点既可以从其他节点接收服务又可以向其他节点提供服务。

对于树状传递,在100W台服务器这种量级上,可能存在两个问题:

  1. 如果树上的某一个节点坏掉了,那么从这个节点往下的所有服务器全部宕机。

  2. 如果树中的某条路径,传递时间太长了(网络中,两个节点间的传递速度受很多因素的影响,可能相差成百上千倍),使得传递效率退化。

改进:100W台服务器相当于有100W个节点的连通图。那么我们可以在图里生成多颗不同的生成树,在进行数据下发时,同时按照多颗不同的树去传递数据。这样就可以避免某个中间节点宕机,影响到后续的节点。同时这种传递方法实际上是一种依据时间的广度优先遍历,可以避免某条路径过长造成的效率低下。

结语

在这里我仅仅抽取了几个经典的几个问题进行提问,面试者的作答也是很标准的,但是简历确实是一个问题点,很容易在前期的简历筛选中被剔除掉 ,明明有很强的能力,结果在第一步就被筛选掉了,如果不是面试很难看出有这么强的能力,那么大家的简历是怎么写的?对比这位面试的老兄,你们差别在哪?

除开这位老兄的例子,我还为每位粉丝准备了一点见面礼,如果你是最近打算跳槽换工作或者正在准备学习更高阶技术点的,你应该能用得上:

  • Java架构师学习路线图(更高阶的大佬小弟就不在这献丑了)
  • 模块化学习资源(Java并发编程、分布式缓存的原理及应用、ZooKeeper原理及应用、Netty网络编程原理及应用、Kafka原理及应用、常见的23种经典设计模式、Spring原理及应用、数据结构与算法……)
  • 2022年大厂面试高频知识点整理

资料持续更新中,目前全部都是免费送给大家,如果有需要,尽管拿走,添加我助手领取,备注“CSDN码农”

要跳槽的再等等,先看看这份面经……相关推荐

  1. 今年跳槽可以再等等。

    金三银四很快就到了,铁子们做好跳槽拿高薪的准备了吗? 前两天我在脉脉上,看到一条有趣的提问: 我想说难,很难!除非你厉害到公司愿意花钱挖你,否则就算你是IT大佬,学历不过关,机器也会直接把你过滤掉. ...

  2. 跳槽的必要条件是有一份好的简历

    点击上方蓝色字体,选择"置顶公众号" 优质文章,第一时间送达 1.为啥感觉金九银十是别人的,自己是铜九铁十呢? 2.为啥每次我都是挂在了一面? 3.我们今天来划一下面试重点 4.漫 ...

  3. 程序员被质疑跳槽频繁不稳定,随后的一番话令HR哑口无言!

    一名程序员求职,于是乎和HR发生了一番对话.HR在看完这名程序员的简历后,质疑其跳槽太频繁,平均一份工作都不到两年,稳定性太差,接下来就发生了这番对话,最后HR表示无语,无话可说了. 如下就是对话的详 ...

  4. 跳槽,你心脚同步吗?

    如今的大学生,毕业一两年,有人已经有跳槽三四回的光荣历史了.这些血气方刚的年轻人就是这样弹跳性能级好,似乎有了超级的才力,所以才上串下跳.当然,如果问及他们涉世不深的社会经历,怎么就敢如此贸然地频繁跳 ...

  5. 如何在未来的大数据和机器学习领域,获得一份不错的工作?

    2018 年,AI 的发展脚步会加快,这一年将是 AI 技术重生和数据科学得以重新定义的一年.对于雄心勃勃的数据科学家来说,他们如何在与数据科学相关的工作市场中脱颖而出?2018 年会有足够多的数据科 ...

  6. HR怼程序员频繁跳槽,程序员竟这么回怼

    工作中跳槽是在所难免的事情,大家跳槽的原因也是各种各样,工作干得不开心,为什么要为难自己,当然啦,下一家公司也不会见得有多好,可能依然是个坑. 近日,一名程序员在找工作时怼了HR,看完这名程序员的简历 ...

  7. 到底该不该跳槽?告诉你三条底层逻辑

    有跳槽的欲望之后,不同年龄段有不同的想法: 应届毕业生:毕竟是第一份正式工作,虽然学习不到什么,还是坚持一下吧,至少用一年来积累积累经验: 30岁职场人:算了吧,跳槽只能想想,风险太大,还不知道能不能 ...

  8. 程序员跳槽频繁不稳定被质疑,一番话后HR哑口无言!

    一名程序员求职,于是乎和HR发生了一番对话.HR在看完这名程序员的简历后,质疑其跳槽太频繁,平均一份工作都不到两年,稳定性太差,接下来就发生了这番对话,最后HR表示无语,无话可说了. 如下就是对话的详 ...

  9. 阿里P10赵海平跳槽字节跳动:深度解析跳槽从开始到结束完整流程!

    00. 前言 近期,有消息称,前阿里P10员工赵海平已加入字节跳动,职级为4+.王垠加入华为职级为 21级. 事情起因还是从两人乌龙说起,详细经过请看:王垠受邀面试阿里P9,被P10面跪后网上怒发文, ...

最新文章

  1. 翻译:java.util.regex.Pattern
  2. 检索、问答、情感分析产业范例分享,代码模型全开源太香了!
  3. Go借助PProf的一次性能优化
  4. [Dynamic Language] Python 静态方法、类方法、属性
  5. 这种吉他演奏方式,太牛了啊
  6. Python 异步 IO 、协程、asyncio、async/await、aiohttp
  7. 知道这些用于数据科学和机器学习的GitHub存储库和Reddit主题吗?
  8. C# 隐藏TabControl头
  9. 中value大小_如何在Spring/SpringBoot 中做参数校验?你需要了解的都在这里!
  10. 【CAIL2021】任务① | 阅读理解
  11. mysql查看索引文件_MySql如何查看索引并实现优化
  12. 软件工程——程序流程图详解
  13. Intel8251可编程串行扩展RS232串口
  14. Win10 解决CSDN、阿里云国内站、小米商城国内站等国内网站打不开的问题(超详细教程)
  15. Python实时获取steam游戏数据
  16. 华为watch3pro和gt2pro哪个好
  17. BUUCTF:[GXYCTF2019]佛系青年
  18. CSS基础学习十七:CSS布局之定位
  19. vue 和 react的对比
  20. 适应各种工控组态软件的图库,一款常用的工控图库,包括3D按钮 、箭头、对角线、多边形、鼓风机、锅炉、工厂等多种图形

热门文章

  1. rpm安装软件时提示warning::Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
  2. 【Torch笔记】Tensor 简介与创建方法
  3. 如何快速写出高质量的文章?用易撰轻轻松松10W+
  4. php环境搭建(正确配置nginx和php)
  5. C语言:拷贝函数拷贝字符串
  6. 详解概率图模型——概述
  7. 空间三角形_高考数学:一解三角形复习知识点,让你学得很简单
  8. 软件包管理以及如何创建本地yum仓库
  9. cad打开卡死_cad2010打开就卡死怎么办_教你解决cad2010打开就卡死的方法
  10. 华为鸿蒙定位,品牌营销专家点评鸿蒙,华为内部定位有点乱别搞砸了