牛客网上看到有人发的顺丰科技Java研发的面经,但是内容与大数据较为相关,进行答案整理。

1.关系型数据库了解吗?

关系型数据库:
SQLite、Oracle、mysql

特性:
1、关系型数据库,是指采用了关系模型来组织数据的数据库;
2、关系型数据库的最大特点就是事务的一致性;
3、简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。

优点:
1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;
2、使用方便:通用的SQL语言使得操作关系型数据库非常方便;
3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
4、支持SQL,可用于复杂的查询。

缺点:
1、为了维护一致性所付出的巨大代价就是其读写性能比较差;
2、固定的表结构;
3、高并发读写需求;
4、海量数据的高效率读写;

— 可能还需要具体聊自己比较熟悉的,比如对mysql的了解和使用。

补充:非关系型数据库:
MongoDb、redis、HBase

特性:
1、使用键值对存储数据;
2、分布式;
3、一般不支持ACID特性;
4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。

优点:
1、无需经过sql层的解析,读写性能很高;
2、基于键值对,数据没有耦合性,容易扩展;
3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,而关系型数据库则只支持基础类型。

缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理,附加功能bi和报表等支持也不好。

— 一般面试官对redis比较感兴趣

2. 索引的实现方式有哪几种?

我想应该是针对mysql的吧。。
那就是四种:
B+Tree索引
哈希索引
全文索引
空间数据索引

3. IO模型有哪些?AIO和NIO的区别?

IO模型:BIO, NIO, AIO

  • JAVA BIO:同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程并处理,如果这个连接不做任何事情会造成不必要的开销,当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中,在jdk1.4以前是唯一的io现在,但程序直观简单易理解
  • JAVA NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,jdk1,4开始支持。
  • JAVA AIO(NIO2):异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理。AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk1.7开始支持。

经典的举例:烧开水。

假设有这么一个场景,有一排水壶(客户)在烧水。
AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。

— 可以看出AIO是最聪明省力,NIO相对省力,叫一个人就能看所有的壶,BIO最愚蠢,劳动力低下。

补充对 同步、异步、阻塞、非阻塞的理解:

io操作分为两部分,发起io请求,和io数据读写。

阻塞、非阻塞主要是针对线程发起io请求后,是否立即返回来定义的,立即返回称为非阻塞io,否则称为阻塞io。
同步、异步主要针对io数据读写来定义的,读写数据过程中不阻塞线程称为异步io,否则,称为同步io。

因此,在发起IO请求阶段,BIO是阻塞的;在准备就绪后io数据读写时BIO和NIO都是阻塞的。

4. Redis了解吗?

概述:
Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。
键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。

其他知道多少喷多少了。。

5. Kylin了解吗?
Kylin是ebay开发的一套OLAP系统,主要用于支持大数据生态圈的数据分析业务,它主要是通过预计算的方式将用户设定的多维立方体缓存到HBase中(目前还仅支持hbase),因为预计算缓存了所有需要查询的的数据结果,因此需要大量的存储空间。— 用空间换时间

6. Bitmap了解吗?有用过吗?

BitMap — 基于位的映射

用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。但是数据范围一般在int的10倍以内。

bitmap应用
1)可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下。
2)去重数据而达到压缩数据
还可以用于爬虫系统中url去重、解决全组合问题。

BitMap应用:排序示例
假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0(如下图:)

然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)) 当然了这里的操作涉及到Big-ending和Little-ending的情况,这里默认为Big-ending。不过计算机一般是小端存储的,如intel。小端的话就是将倒数第5位置1),因为是从零开始的,所以要把第五位置为一(如下图):

然后再处理第二个元素7,将第八位置为1,,接着再处理第三个元素,一直到最后处理完所有的元素,将相应的位置为1,这时候的内存的Bit位的状态如下:

然后我们现在遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的。

bitmap排序复杂度分析
Bitmap排序需要的时间复杂度和空间复杂度依赖于数据中最大的数字。

bitmap排序的时间复杂度不是O(N)的,而是取决于待排序数组中的最大值MAX,在实际应用上关系也不大,比如我开10个线程去读byte数组,那么复杂度为:O(Max/10)。也就是要是读取的,可以用多线程的方式去读取。时间复杂度方面也是O(Max/n),其中Max为byte[]数组的大小,n为线程大小。

空间复杂度应该就是O(Max/8)bytes

7. 有做过对集群的优化吗?
额,,自由发挥。

8. 用户态和系统态?

操作系统的两种运行级别

用户态:用户执行状态简称用户态。
系统态:系统执行状态简称系统态或核心态。

进程的用户程序段在执行时,该进程处于用户态。而一个进程的系统程序段在执行时,该进程处于系统态。

为什么要划分用户态和系统态?
一个最主要原因是要把用户程序和系统程序区分开,以利于程序的共享和保护。显然,这也是以增加系统复杂度和系统开销为代价的。

当一个进程在执行用户自己的代码时处于用户运行态(用户态),此时特权级最低,为3级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。Ring3状态不能访问Ring0的地址空间,包括代码和数据;当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),此时特权级最高,为0级。执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。

用户运行一个程序,该程序创建的进程开始时运行自己的代码,处于用户态。如果要执行文件操作、网络数据发送等操作必须通过write、send等系统调用,这些系统调用会调用内核的代码。进程会切换到Ring0,然后进入3G-4G中的内核地址空间去执行内核代码来完成相应的操作。内核态的进程执行完后又会切换到Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。这说的保护模式是指通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程地址空间中的数据。

关于特权级的概念:
对于任何操作系统来说,创建一个进程是核心功能。创建进程要做很多工作,会消耗很多物理资源。比如分配物理内存,父子进程拷贝信息,拷贝设置页目录页表等等,这些工作得由特定的进程去做,所以就有了特权级别的概念。最关键的工作必须交给特权级最高的进程去执行,这样可以做到集中管理,减少有限资源的访问和使用冲突。inter x86架构的cpu一共有四个级别,0-3级,0级特权级最高,3级特权级最低。

9. 交换机属于哪一层?

数据链路层。。

补充:
OSI网络协议五层:物理层、数据链路层、网络层、传输层、应用层(七层则是把网络层分为 会话层、表示层和应用层三部分)

网卡属于物理层
路由器(ip)属于网络层
传输协议TCP、UDP属于传输层
http协议属于应用层

10. skiplist跳表了解过吗? Redis有关于跳表的使用。

跳表是一种链表加多级索引的动态数据结构, 通过随机算法保证平衡性, 支持快速的插入、删除、查找操作,时间复杂度都是 O(logn).

为什么要用跳表?
目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等,很难上手。
链表在内存中是离散的, 这使得链表的插入,删除十分便利O(1), 但是查询却只能一个接一个的遍历, 时间复杂度为O(n).
而插入, 删除操作依赖于查找定位目标节点, 因为查找的性能低, 也降低了二者的性能.
如何提高查找的性能, 达到类似数组中二分查找的效果呢, 可以通过添加索引.
跳表作为一种添加了索引的链表数据结构,可以支持快速的插入、删除、查找操作.

做法:(针对的是有序链表)
对一个单链表来讲, 即使存储的数据是有序的, 查找时间复杂度仍然是O(n), 那么如何提高查找效率呢?
既然链表的内存分布是离散的, 我们不能直接在内存中访问, 那么参考二分查找算法思想,
我们将这些离散的内存指针有规律的抽取组合起来, 逐步缩小指针的个数.
当每两个结点提取一个结点到上一级(抽出来的那一级叫索引)时,
第 k 级索引的结点个数是第 k-1 级索引的结点个数的 1/2,那第 k级索引结点的个数就是 n/(2^k)
例如, 链表存储有序的1-16个数字. 索引的个数分别为2, 4, 8.
当我们要查12时, 先查到顶层中的9, 接着通过第2层中的9映射到第3层的11, 最后通过11映射到12
1, , , , , , , ,9, , , , , , ,
1, , , ,5, , , ,9, , , ,13, , ,
1, ,3, ,5, ,7, ,9, ,11, ,13, ,15,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16

时间复杂度的计算: 因为抽取数据时是有规律(二选一)的, 所以每层最多只需要比较2次
索引的高度是log2n-1, 加上原始链表为log2n. 查找过程为串行的, 时间复杂度为O(2log2n)
此时的空间复杂度为: n/2+n/2^2 + n/2^3+…1 = n - 1, 加上原始链表的内存, 空间复杂度为O(2n)
为了节约空间, 我们可以增加每次比较的节点的长度, 当三选一时:
时间复杂度为O(3log3n), 空间复杂度为n/3+n/32+n/33+…1 = n/2 - 1, 空间复杂度为O(1.5n)
当然在实际的软件开发中,原始链表中存储的有可能是很大的对象,而索引结点只需要存储关键值和几个指针,并不需要存储对象,
所以当对象比索引结点大很多时,那索引占用的额外空间就可以忽略

11. 算法题:几亿条数据找到某一个数字?
布隆过滤。

顺丰科技视频面试 -Java研发相关推荐

  1. 面试总结:顺丰科技视频面试0918

    面试总结:顺丰科技视频面试0918 下午三点视频面试,主要问一些项目,估计面试官也没好好准备问题,看着项目问的.

  2. 阿里巴巴面试java研发工程师实录

    阿里巴巴面试java研发工程师实录 1.自我介绍 2.问了本科毕设.介绍项目,自己的设计效率有什么优势?(时间+空间)哪些是原创,哪些是受人帮助完成.编程语言?(C)编程过程中遇到了什么问题? 3.介 ...

  3. 2015年阿里实习生面试Java研发工程师 小记

    5月5日,广州,阿里实习生面试,Java研发工程师,完全被虐orz 几乎没有Java项目开发经验,接近零基础,去水了一发,毫无悬念的被刷了..RP也是杠杠的,准备过的题目一个都没被问到,算法题也是一条 ...

  4. 顺丰速运面试java,顺丰三面Java后端面经分享

    面试题+答案领取方式:关注公众号[Java烂猪皮]后台回复[666] 顺丰一面 1项目(大约4个问题) 5 说一说java基础吧,Java是面向对象的嘛,你能讲一下多态吗? 6 那多态里你说的指向实例 ...

  5. 南京南瑞java招聘_2019南瑞研究院/ 信通科技社招JAVA研发工程师

    岗位职责: 1.产品需求分析 2.协助进行项目立项 3.产品可研编制及协助立项 岗位要求: 1.3年以上Java实际项目开发经验,能独立参与大型Web应用开发工作; 2.有扎实的Java基础(熟悉IO ...

  6. 顺丰科技面试-java开发

    顺丰科技的面试官感觉人都挺随和,总共经历三面,两轮技术面,一轮hr面. 一.专业面一 主要是对着我的简历上的东西问,我的一个项目经历,两个实习上面以及自己提到会的技能展开的提问. (1)自我简介 (2 ...

  7. 顺丰gis产品经理_2018顺丰科技面试经验(产品经理,gis产品经理等)

    为了帮助职业圈网友能够及时了解顺丰科技的面试流程以及面试过程所涉及的面试问题,职业圈小编把2018最新顺丰科技面试经验编辑好,马上提供给大家,以便能够尽快帮助到有需要的人.文章中还为你提供顺丰科技面试 ...

  8. 顺丰科技数据库中间件研发工程师面试经历

    最近一段时间考虑换个工作,通过猎头的推荐,发现深圳顺丰科技有个MyCat中间件研发工程师的职位挺适合我的,于是乎让她推荐了下简历,约了面试.本次面试分为电话面试和现场面试.电话面试主要考察技术,现场面 ...

  9. 校招实习面试实战,顺丰科技Java工程师面试复盘总结

    备战春招,校招实习面经分享,拿Java开发工程师offer~~ 本系列文章包括Java.算法.计算机网络.数据库.操作系统等等,本篇介绍面试顺丰科技[Java工程师]岗位的题目,复盘解析及心路历程. ...

最新文章

  1. ACL 2022录用结果出炉:国内多支团队晒“战绩”,清华一实验组18篇入选
  2. stylegan2 示例命令fused_bias_act.cu环境配置异常(无法打开包括文件: “tensorflow/core/framework/op.h”
  3. Xcode error: conflicting types for 'XXXX'
  4. linux ubuntu bionic,尝试在Linux Ubuntu 18.04 Bionic上安装Docker CE时出现错误?
  5. Java适配器的设计模式
  6. vb checkbox选中和不选中_UE4 4.23 RetainerBox 选中框位置不正确
  7. SQL Server更新某一列中多个字典码对应内容(sql示例)
  8. Chrome TTFB中英文解释
  9. String和StringBuffer与StringBuilder的区别
  10. 地铁票务管理系统_[地铁票务管理论文] 地铁票务系统 场景法
  11. 在win7 上安装 Visual Studio 2019 步骤 及 vs2019离线安装包
  12. cpolar+ipad+windows远程桌面控制
  13. 如何判断一个多边形的环是逆时针还是顺时针
  14. JQuery实现动态漂浮广告
  15. Vue响应式原理整理笔记
  16. 移动端如何解决video层级最高的问题
  17. 你准备会计初级并通过考试用了多久?
  18. redis作为MongoDB的缓存在线实时去重
  19. FastStone Capture v9.7 功能强悍的屏幕截图工具
  20. 课堂练习4-C语言多分支结构

热门文章

  1. 洪九果品冲刺港股:年营收103亿 阿里与中国农垦是股东
  2. 分享一个nmon脚本
  3. “开挂”-修改植物大战僵尸的关卡和金币
  4. python+appium+夜神模拟器刷快手极速版金币套现,帮你赚够早餐钱
  5. ExoPlanets 一款基于以太坊区块链的太空探索加密游戏
  6. java有理数的除法运算,Java互评-有理数的设计
  7. 联想台式计算机参数的意义,电脑BIOS的作用简介及使用注意
  8. 芯片、模组、开发板的区别与联系-结合ESP32浅谈
  9. scrapy-抓取天猫女装销量前60的商品名称、价格、链接及打开连接后的店铺名称和链接
  10. 2021-11-22~23 Re 攻防世界逆向Exercise区第七题 simple-unpack【T.O.CTF】