面试笔记:面经-顺丰科技


一、自我介绍

个人背景、项目经历、实习经历。


二、简历相关

2.1 原生APP与Web APP的比较

  • 开发
    原生APP:每一种操作系统都需要独立的开发项目。每种平台都需要独立的开发语言。
    Web APP:运行在设备的浏览器上,只需一个开发项目。可以通过HTML、 CSS或者JS来开发。成本低、速度快。
  • 功能
    原生APP:类比于电脑上的软件。可以调用移动终端的硬件设备, 比如:麦克风、摄像头等。
    Web APP:类比于电脑上的网页。使用有限的移动硬件设备功能。用于页面展示,简单的交互,无法使用设备独特的功能。
  • 应用安装使用
    原生APP:需要通过应用商店将原生app下载到移动终端上。以独立的应用程序运行。用户必须手动去下载并安装这些原生App,原生应用可以节约宽带成本,可以访问本地资源、缓存。
    Web APP:通过设备上的浏览器访问,软件更新只需要更新服务器就够了,用户层面不需要做任何操作。不需要安装客户端,可以节省手机终端的内存空间。
  • 版本控制
    原生APP:用户可以自由地选择是否更新软件版本,所以会出现不同用户同时使用不同版本的情况。同时也会导致维护成本比较高。使用旧版本的用户无法体验新版本的完整功能。
    Web APP:所有的用户都是用同样的版本,所有用户获得的功能都是相同的。版本更新比较方便,直接在服务器侧更新数据即可。
  • 加载速度
    原生APP:由“云服务器数据+APP应用客户端”两部分构成,APP应用所有的UI元素、数据内容、逻辑框架均安装在手机终端上。访问的时候,不需要重新下载加载应用页面框架,只需要加载数据即可。所以加载速度更快,页面响应更快。
    Web APP:打开一个页面都需重新加载页面的所有元素,访问速度受手机终端性能和网络环境的限制,导致加载速度慢,而且操作频繁容易卡死。

三、Java后台

3.1 Spring常用注解

注解 作用
@SpringBootApplication springboot的核心注解,用于开启自动配置。
@RequestMapping 提供路由信息,负责URL到Controller中的具体函数的映射。
@ResponseBody 将请求返回的结果为json形式。
@Controller 用于定义控制器类。
@Service 表示Service层。
@Repository 表示数据关系映射层。
@ComponentScan 将该类自动发现扫描组件。
@Bean 用在方法上来生成一个bean示例,交给Spring容器托管。
@Component 表示组件。
@Autowired 自动导入依赖的bean。
@Value 获取配置application文件的内容。

3.2 Redis介绍

  • Redis简介
    Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
  • Redis数据库特性
    (1)Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    (2)Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    (3)Redis支持数据的备份,即master-slave模式的数据备份。
  • Redis优势
    (1)性能极高:Redis能读的速度是110000次/s,写的速度是81000次/s 。
    (2)丰富的数据类型:Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    (3)原子:Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
    (4)丰富的特性:Redis还支持 publish/subscribe, 通知, key 过期等等特性。
  • Redis缺点
    (1)单线程(2)耗内存
  • Redis与其他key-value存储有什么不同?
    (1)Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
    (2)Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

3.3 MySQL索引及怎么创建索引

索引的优点:减少了服务器需要扫描的数据量、帮助服务器避免排序和临时表、将随机I/O变成顺序I/O。

  • MySQL索引
    (1)B树索引:表中每一行都会在索引上有一个对应值。进行数据查询时,根据索引值一步一步定位到数据所在行。
    (2)B+树索引:所有关键字都存储在叶子节点,非叶节点只存储索引,只有索引功能; 所有叶子节点增加链指针,形成一个链表,可以顺序遍历所有叶节点。
    (3)哈希索引:哈希索引不是基于树形的数据结构查找数据,而是根据索引列对应的哈希值的方法获取表的记录行。
  • 创建索引
    (1)ALTER TABLE:用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
    (2)CREATE INDEX:可对表增加普通索引或UNIQUE索引。

3.4 Spring用了哪些设计模式

  • 工厂模式:在各种BeanFactory以及ApplicationContext创建中使用。
  • 模版模式:在各种BeanFactory以及ApplicationContext实现中使用。
  • 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。Spring中的单例模式提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,因为Spring管理的是任意的java对象。
  • 代理模式:在Spring的AOP中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。
  • 策略模式:将有共性的行为抽象为一个接口,其中有此种行为的声明。该接口的实现类都实现了这个行为,但是提供了不同的行为表现。Spring使用策略模式:1、使用同的方法加载资源文件,比如:ClassPathResourece,FileSystemResource,ServletContextResource,UrlResource但他们都有共同的接口Resource;2、在AOP实现中,采用了两种不同的方式,JDK动态代理和CGLIB代理。
  • 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。Spring中Observer模式常用的地方是listener的实现。如ApplicationListener。

3.5 以实际生活例子介绍设计模式

  • 代理模式:在现实生活中,有时一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过12306网站或者去火车票代售点买。
  • 适配器模式:在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。
  • 装饰模式:在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。

3.6 Servlet介绍

Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以收集来自网页表单用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

  • Servlet优势
    (1)性能明显更好。
    (2)Servlet在Web服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
    (3)Servlet是独立于平台的,因为它们是用Java编写的。
    (4)服务器上的Java安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet是可信的。
    (5)Java类库的全部功能对Servlet来说都是可用的。它可以通过sockets和RMI机制与applets、数据库或其他软件进行交互。
  • Servlet执行以下主要任务
    (1)读取客户端(浏览器)发送的显式的数据。包括HTML表单、来自applet或自定义的HTTP客户端程序的表单。
    (2)读取客户端(浏览器)发送的隐式的HTTP请求数据。包括cookies、媒体类型和浏览器能理解的压缩格式等等。
    (3)处理数据并生成结果。需要访问数据库,执行RMI或CORBA调用,调用Web服务,或者直接计算得出对应的响应。
    (4)发送显式的数据(即文档)到客户端(浏览器)。格式包括文本文件(HTML、XML)、二进制文件(GIF)、Excel等。
    (5)发送隐式的HTTP响应到客户端(浏览器)。包括告诉浏览器或其他客户端被返回的文档类型(例如HTML),设置cookies和缓存参数,以及其他类似的任务。

3.7 微服务

微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用HTTP API通讯。同时,服务会使用最小规模的集中管理(例如Docker)技术,服务可以用不同的编程语言与数据库等。

  • 微服务与服务化区别
    (1)服务拆分粒度更细。微服务可以说是更细维度的服务化,小到一个子模块,只要该模块依赖的资源与其他模块都没有关系,那么就可以拆分为一个微服务。
    (2)服务独立部署。每个微服务都严格遵循独立打包部署的准则,互不影响。比如一台物理机上可以部署多个 Docker 实例,每个 Docker 实例可以部署一个微服务的代码。
    (3)服务独立维护。每个微服务都可以交由一个小团队甚至个人来开发、测试、发布和运维,并对整个生命周期负责。
    (4)服务治理能力要求高。拆分为微服务之后,服务数量变多,因此要有统一的服务治理平台,来对各个服务进行管理。

3.8 简述软件开发过程

  • 软件生命周期四个阶段
    起始阶段(Inception):有一个好的想法,具体构想出终于产品的设想和它的业务案例,确定项目的范围 。
    细化阶段(Elaboration):计划必要的活动和所需资源,具体确定功能并设计构架 。
    构建阶段(Construction):构建产品, 发展最初设想构架和计划,直到一个能够交付给用户的产品(或设想)完毕。
    移交阶段(Transition):将产品移交用户使用,包含:制造、交付、培训、支持、维护,直到用户惬意。

  • 开发流程
    需求分析、概要设计、详细设计、编码、测试、软件交付、验收、维护。

3.9 ConcurrentHashMap介绍

ConcurrentHashMap在JDK1.8的时候将put()方法中的分段锁Segment移除,转而采用一种CAS锁synchronized来实现插入方法的线程安全。
ConcurrentHashMap是直接采用数组+链表+红黑树来实现,时间复杂度在O(1)和O(n)之间,如果链表转化为红黑树了,那么就是O(1)到O(nlogn)。ConcurrentHashMap会判断tabAt(tab, i = (n - 1) & hash)是不是 null,是的话就直接采用CAS进行插入,而如果不为空的话,则是synchronized锁住当前Node的首节点,这是因为当该Node不为空的时候,证明了此时出现了Hash碰撞,就会涉及到链表的尾节点新增或者红黑树的节点新增以及红黑树的平衡,这些操作自然都是非原子性的。
由于每一个Node的首节点都会被synchronized修饰,从而将一个元素的新增转化为一个原子操作,同时Nodevaluenext都是由volatile关键字进行修饰,从而可以保证可见性


四、其他

1、GitHub使用情况及最近点赞项目。
2、职业规划。

发布了90 篇原创文章 · 获赞 10 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Fan0628/article/details/99577105