/**
* ############
* 变强是会掉光头发的! 现在的头发还是很茂盛, 是该开心还是难过呢..
* ############
*/
总结下近期面试龙腾简合 - java 开发岗的经历. 附上笔试, 技术面试题以及相应的题解. 有些题目记忆有点模糊了, 这里就大概描述下.
我先做个人说明, 学历非双福州普通二本计算机专业, 毕业两年多, 近期因个人原因想换工作, 体验下其他 IT 公司的氛围.
废话多少, 开始进入正题.
整个过程分三个步骤:
=============================
在线笔试
HR 面试 -- 龙腾 HR 小姐姐很 nice,HR 面沟通的很愉快
技术面试 -- 感觉是一个技术大佬面, 感到紧张.╮(╯▽╰)╭
=============================
一, 在线笔试
一开始是在 boss 直聘软件上, 龙腾简合 HR 小姐姐主动沟通, 加上自己本意有想去龙腾的想法, 就简单的聊了几句, 并发送个人简历给 HR.HR 看了后, 就沟通安排在线笔试了.
在线笔记有视频监考, 作为诚实本分的孩子是不会作弊的!(′▽`")
一共有 16 道题, 涉及 JS 正则表达 , 算法, 数据库, Linux 命令, springboot, 集合线程, 前端 react,promise 原理, Node.JS 加载 JSON 方式, Mybatis.(技术渣渣表示想哭╥﹏╥...)
1, 有正则表达式:/^[a-zA-Z]+$/, 判断 alert((/^[a-zA-Z]+$/.test(null))); 和 alert((/^[a-zA-Z]+$/.test())); 输出的是什么?
解答: 这道为选择题, 考察正则表达式基础. 该表达式为判断字符串是否全部为字母. 用法(/^[a-zA-Z]+$/.test(element)), 这里 element 是可以为 null 或为空, 所以输出为 true,true.
小伙伴可自己编写测试下, 加深记忆.
2,Linux 如何后台重启个 jar 程序包, 命名为 test.jar
解答: 熟悉 nohup 命令的小朋友应该很容易上手. 这题主要分两步:
第一步找到正在运行的 test.jar 进程, 并 kill 掉该进程; 第二步后台重启.
- 1 $ ps -ef | grep test
- 2 xxxx 1824 0 21:54 pts/0 00:00:00 xxx xxxx
- 3 & kill -9 1824
- 4 $nohup java -jar test.jar &
- //nohup 意思是不挂断运行命令, 当账户退出或终端关闭时, 程序仍然运行
- // 当然, 后台启动 jar 还有其他方式, 比如 java -jar shareniu.jar & , 其中 & 表示后台启动.
3, 有 36 辆赛车 6 条跑道, 在没有计时器的情况下, 需要最少比赛多少轮才能选出最快的前 3 辆?
解答: 考察逻辑思维题. 总共需要 8 次. 参考: http://www.mamicode.com/info-detail-2267257.html
这里我说一次我的对这道题的理解:
首先, 36 辆车分 6 组, 进行比赛, 每组取前 3 名, 淘汰 6x3=18 辆
每组第 1 名进行一轮比赛, 选出前 3 名的组, 并淘汰后 3 名的组, 一共淘汰 3x3=9 辆. 这里假设 A\B\C 这三组的车为前三名:
到这一步可以确定第一名是哪一车, 这里假定第一名为车 A1, 接下来要确定哪辆车是第二名和第三名. 这里只要简单分析下, 就能淘汰掉车 C2, 车 C3 和车 B2.
淘汰车 C2 和 C3 的理由: 车 A1> 车 B2 > 车 C3 > 车 C2 > 车 C3;
淘汰车 B2 的理由: 车 A1 > 车 B1 > 车 B2 > 车 B3
因为已经确定 A1 为最快的车, 所以只需要将车 A2\A3\B1\B2\C1 进行一轮比赛就能确定第二名和第三名了.
因此, 需要 6+ 1+ 1 =8 轮, 才能选取最快的 3 辆.
4, 解释下 React state 和 React props
参考: https://baijiahao.baidu.com/s?id=1627980825860407519&wfr=spider&for=pc
解答: 工作两三年未使用和学习过前端 react, 好奇龙腾使用的前端是 vue. 为啥会考 react 方面的知识. 虽然也没用过 vue, 任职公司使用的 Angular4..π__π
react state: React 把组件看成是一个状态机(State Machines). 通过与用户的交互, 实现不同状态, 然后渲染 UI, 让用户界面和数据保持一致. React 里, 只需更新组件的 state, 然后根据新的 state 重新渲染用户界面(不要操作 DOM).
参考: https://www.runoob.com/react/react-state.html
react props:Props 是 Properties 的简写. 它们是只读组件, 工作方式类似于 HTML 属性. Prop 是一种将数据从父组件传递给子组件的方法.
具体深入的内容, 我也不太了解, 小伙伴们可自行 google / 百度.
5, 编写 JS 函数, 有两个参数一个时间字符, 一个小时增减量, 传入时间如 2018-10-10 01:00:00, 和小时节点增加量 3, 函数输出 2018-10-10 04:00:00
解答: 熟悉 JS 时间与字符串转换, 时间操作的小伙伴们, 应该是很容易的. 作为一个 ctrl+c 和 ctrl+v 的程序员感动心累( -'`-; )
- /*
- 对时间进行操作
- */
- function t(d, num) {
- var t = new Date(d.replace(/-/g, '/'));
- t.setTime(t.setHours(t.getHours() + num));
- var dataStr = (t.getFullYear()) + '-' + (fillZero(t.getMonth() + 1))
- + '-' + (fillZero(t.getDate())) + '' + (fillZero(t.getHours())) +':'+ (fillZero(t.getMinutes())) +':' + (fillZero(t.getSeconds()))
- alert(dataStr);
- }
- /*
- 时间字段前补 0
- */
- function fillZero(num) {
- if (num <10) {
- return '0' + num;
- }
- return num;
- }
- t("2018-10-10 01:00:00", -3);
6, 解释下什么是 primose, 并写一个 primise
解答: 属于 ES6 范围, primose 作用:
1, 主要用于异步计算;
2, 可以将异步操作队列化, 按照期望的顺序执行, 返回符合预期的结果;
3, 可以在对象之间传递和操作 promise, 帮助我们处理队列.
Promise 最大的好处是在异步执行的流程中, 把执行代码和处理结果的代码清晰地分离了, Promise 还可以做更多的事情, 比如, 有若干个异步任务, 需要先做任务 1, 如果成功后再做任务 2, 任何任务失败则不再继续并执行错误处理函数. 要串行执行这样的异步任务, 不用 Promise 需要写一层一层的嵌套代码. 有了 Promise, 我们只需要简单地写:
- job1.then(job2).then(job3).catch(handleError); // job1 job2 job3 为 Promise 对象.
- // 一个简单的实例
- new Promise(resolve => {
- setTimeout(() => {
- resolve('hello')
- }, 2000)
- }).then(res => {
- console.log(res)
- })
参考: https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544,https://www.jianshu.com/p/1b63a13c2701
7,springboot 自动配置原理, 如果加载配置文件
解答: 涉及 springboot 原理. 参考: https://jingyan.baidu.com/article/fdbd4277a277edb89e3f48fa.html
Spring Boot 启动的时候会通过 @EnableAutoConfiguration 注解找到 META-INF/spring.factories 配置文件中的所有自动配置类, 并对其进行加载, 而这些自动配置类都是以 AutoConfiguration 结尾来命名的, 它实际上就是一个 JavaConfig 形式的 Spring 容器配置类, 它能通过以 Properties 结尾命名的类中取得在全局配置文件中配置的属性如: server.port, 而 XxxxProperties 类是通过 @ConfigurationProperties 注解与全局配置文件中对应的属性进行绑定的.
从启动类的 @SpringBootApplication 进入, 在里面找到了 @EnableAutoConfiguration:
8,Node.JS 读取 JSON 文件的几种方式
解答: 我对 Node.JS 不熟, 有知道的小伙伴能否留言解答下 (#`-_ -)
- var fs=require('fs')
- fs.readFile('file.json','utf8',function (err, data) {
- if(err) console.log(err);
- var test1=JSON.parse(data);
- });
9,ConcurrentHashMap 与 HashTable 的区别, 是怎么实现线程安全的?
ConcurrentHashMap 底层采用分段的数组 + 链表实现, 线程安全. 通过把整个 Map 分为 N 个 Segment, 可以提供相同的线程安全, 但是效率提升 N 倍, 默认提升 16 倍.(读操作不加锁, 由于 HashEntry 的 value 变量是 volatile 的, 也能保证读取到最新的值.)Hashtable 的 synchronized 是针对整张 Hash 表的, 即每次锁住整张表让线程独占, ConcurrentHashMap 允许多个修改操作并发进行, 其关键在于使用了锁分离技术. 锁分段技术: 首先将数据分成一段一段的存储, 然后给每一段数据配一把锁, 当一个线程占用锁访问其中一个段数据的时候, 其他段的数据也能被其他线程访问.
HashTable 底层数组 + 链表实现, 无论 key 还是 value 都不能为 null, 线程安全, 实现线程安全的方式是在修改数据时锁住整个 HashTable, 效率低, ConcurrentHashMap 做了相关优化初始 size 为 11, 扩容: newsize = olesize*2+1.
10,MySQL 单表数据量很大, 导致增删改查都很慢, 有什么优化的意见?
方案一: 优化现有数据库:
1. 数据库设计和表创建时就要考虑性能;
2.sql 的编写需要注意优化;
4. 分区;
5. 分表;
6. 分库;
7. 移除冗余数据;
8. 创建适合的索引:
索引并不是越多越好, 要根据查询有针对性的创建, 考虑在 WHERE 和 ORDER BY 命令上涉及的列建立索引, 可根据 EXPLAIN 来查看是否用了索引还是全表扫描;
应尽量避免在 WHERE 子句中对字段进行 NULL 值判断, 否则将导致引擎放弃使用索引而进行全表扫描;
值分布很稀少的字段不适合建索引, 例如 "性别" 这种只有两三个值的字段;
字符字段只建前缀索引;
字符字段最好不要做主键;
不用外键, 由程序保证约束;
尽量不用 UNIQUE, 由程序保证约束;
使用多列索引时主意顺序和查询条件保持一致, 同时删除不必要的单列索引
方案二: 升级数据库类型, 换一种 100% 兼容 MySQL 的数据库.
方案三: 去掉 MySQL, 换大数据引擎处理数据.
参考:
11, 考察 sql 编写功底, 提供交易表, 写出去重, 分组统计的语句.
解答: 具体的字段名称有点忘了, 大体说一下解题思路:
1, 去重, 可以用 distinct 或 group by
2, 分组统计, 不用多少了, 使用 group by , 对于统计不同类型的交易数量 可以使用 sum(case when type =1 then 1 else 0 end)sum_type1
12,mybatis 操作数据库的几种方式?
这里我对 mybatis 不熟, 大体知道有种, 一种基于全注解的方式, 一种配置 xml 的方式.
=============================
在线笔试小结: 还有 4 道题记忆模糊了, 考试时间为 2 个小时, 技术渣渣表示大半不会,, 后面放弃挣扎, 唱起一首凉凉..╥﹏╥...
==============================
二, HR 面试
个人基本情况, 兴趣爱好等;
任职公司基本情况, 工作内容, 有没有印象深刻的问题等, 怎么看待加班, 用的什么技术等;
=============================
HR 面试小结: 基本操作, 没有技术面的压力, 问一些基本情况.
==============================
三, 技术面试
技术面问的大都以简历项目, 技术为基础, 进行扩展. 所有! 想去龙腾面试的小伙伴一定要熟悉简历上的技术! 做足准备!
1,ngnix 应用的场景?
Nginx 一是一款轻量级的, 高性能的 HTTP, 反向代理服务器, 具有很高的稳定性, 支持热部署, 模块扩展也非常容易. Nginx 采取了分阶段资源分配技术, 处理静态文件和无缓存的反向代理加速, 实现了负载均衡和容错, 在这样高并发的访问情况下, 能经受起高并发的处理. 可以做 web 服务器, 反向代理服务器, 电子邮件服务器限制正常用户的请求范围 (下载速度, 访问频率) 过滤非正常用户的 http 请求.
参考: https://www.cnblogs.com/chenliangcl/p/7417602.html
2,OAuth2.0 协议流程
参考: https://jinnianshilongnian.iteye.com/blog/2038646
3, 数据表数据原则?
3.1 数据库三大范式
第一范式: 列不可再分
第二范式: 行可以唯一区分, 主键约束
第三范式: 表的非主属性不能依赖与其他表的非主属性 外键约束 且三大范式是一级一级依赖的, 第二范式建立在第一范式上, 第三范式建立第一第二范式上.
3.2 字段设计需合理, 字段数量不超过 20 个, 若有业务需要很多字段的, 可考虑分表, 用主键, 外键进行关联.
3.3 索引的创建. 索引引并不是越多越好, 要根据查询有针对性的创建, 考虑在 WHERE 和 ORDER BY 命令上涉及的列建立索引, 可根据 EXPLAIN 来查看是否用了索引还是全表扫描; 应尽量避免在 WHERE 子句中对字段进行 NULL 值判断, 否则将导致引擎放弃使用索引而进行全表扫描.
3.4 尽量用整型表示字符串, 用 0 表示 null; 尽可能使用 not null 定义字段
3.5 使用合理的字段属性长度, 固定长度的表会更快. 使用 enum,char 而不是 varchar.
4, 让你设计一个下拉框组件你会怎么设计?
我的知识盲区.. 参考: http://blog.xuxiangbo.com/im-46.html
面试时我回答的几个点: 需要考虑层级关系, 要有个字段表示父类, 子类的关联; 鼠标点击事件.
5,tomcat 调优?
参考:
5.1, 为提高安全性, 关闭自动部署, 防止被植入木马恶意攻击;
5.2, 如果没有使用 Apache, 禁用 AJP. 默认开启状态;
5.3,HTTP1.1 Connector 参数设置, tomcat 8.5 默认使用 nio, 请改为使用 nio2;
5.4, 没有用到 DNS 时, 禁用 DNS;
5.5, 设置 GET 请求的 Encoding,Tomcat8.5 缺省即为 UTF-8, 如使用 UTF-8 则下面语句无需设置; 如使用其他 Encoding, 请参考下面语句来设置;
5.6, 如需通过压缩来减少网络带宽占用, 请采用反向代理 + Tomcat 的方式, 压缩交由反向代理, 因为压缩会增加 Tomcat 的负担.
5.7, 配置线程池, 线程数;
5.8,jvm 调优, 例如以下:, 更多请查看参考链接
Linux 下修改 TOMCAT_HOME/bin/catalina.sh
JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m
Windows 下修改 TOMCAT_HOME/bin/catalina.bat
set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m
6, 前端往后端传递数据的方式? 比如提交表单数据?
form 表单提交, Ajax 提交, 通过 url 字符串拼接向后台提交数据, 通过 a 标签提交数据, 通过 a 标签的 href 属性提交数据, 和 JS 提交数据类似.
7, 平时自己空闲时间有学习什么知识? 有去下载什么开源项目? 有没有应用到项目里?
自由发挥.
8, 实现 Web 站内信, 使用到了 rabbitmq, 消息是怎么展示在前端的进行提示?
rabbitmq 做为消息缓存的中间件, 生产者将消息发布在 mq 里, 消费者进行消费, 将站内信数据存在数据库中, 前端使用 Ajax 查询未读站内信息, 数据库表中有字段表示已读或未读, 用户点击了未读的站内信则将状态设置为已读.
=============================
技术面试小结: 技术面问的大都以简历项目, 技术为基础, 进行扩展. 所有! 想去龙腾面试的小伙伴一定要熟悉简历上的技术! 做足准备!
面试结果: 未通过. 原因咨询, 大体上也知道为啥没通过.. 个人技术层面还有很大的提升层面, 不够自信, 技术面时紧张.
希望这篇博客能帮助到想进龙腾简合工作的小伙伴~ 若有小伙伴看过了这篇博客, 并顺利面试进入龙腾简合, 记得来这留言说一声呦~
==============================
来源: https://www.cnblogs.com/watchfree/p/11780728.html