回馈牛客,CVTE,Web开发面经
CVTE面试总结
[TOC]
CVTE一面
(boss直聘投的,免了笔试。。。很神奇的操作哈哈哈哈)
1.自我介绍(尴尬,开始时,一直心跳加速,喘不过气地说话)
2.元旦狂欢(项目)
- 讲一下活动是怎样的
- 用到了什么线程池 -- 自己封装的
- 发奖时,如何保证不会重复发奖 -- 锁代码块
- 锁代码块会造成性能缺失,如何解决
- 积分购买商品如何保 证原子性,代码怎么写 -- 没看过
- 为什么要加synchronized锁,不用可重入锁
- 世界积分用什么保存 -- AotomInteger原子整形
- volatile和synchronized有什么区别
3.mysql
- 如何提高数据库的查询速度 -- 索引
- 组合索引和多个单列索引比较,那个速度快 ,为什么-- 组合索引,但不知道为什么
- limit(1000000,5)会有什么事情发生 -- 不知道
- exits和in性能对比 -- 小表举动大表
- join in如何提高性能 -- 小表驱动大表
- 如何优化一个sql语句 -- 使用explain优化
- 最左前缀原则是什么 -- 索引使用要按照定制索引的顺序
4.JVM
- 讲一下垃圾回收 -- 首先确定什么是垃圾,解释引用计数法和GCRoot引用法,并说明为什么不用引用计数;然后算法是分代回收策略,说到这里引出堆内存分为年轻代和老年代,年轻代用标记整理算法,老年代用复制算法,解释两个算法
5.Spring + Mybatis
- AOP的应用和原理 -- 日志系统,模板方法实现方法前后执行日志操作
- IOC是什么,原理 -- 把new对象的操作从我自己转移给Spring,原理是先读取XML文件所有<Bean,>标签,记录全限定名,然后通过反射,把所有对象存储到Factory工厂,最后Factotry调用getBean拿对象
- 讲一下Mybatis的缓存 -- mybatis默认开启一级缓存,可以手动开启二级缓存
- 有了解循环依赖吗出现循环依赖是设计上的问题
6.基础
- CurrentHashmap的分段如何实现分段 -- 锁每个table,不锁整个table[]
- hashmap内部结构 -- Entry[],Entry里面是链表,链表由一个个key/value的Node节点组成。push的时候先计算hash,再求模,再比较hash,再equal
- 那hashmap除了链地址法还有什么方法解决地址冲突问题 -- 平方法,还有一种忘了
- hashmap的扩容 -- 根据存储因子默认0.75,当内存满75%的时候,扩容2倍。
7.网络安全
- 有了解过sql注入吗 -- 通过prepareStatement插入防止
- 有了解过CSRF、XSS攻击吗 -- 不懂
8.Redis缓存
- Redis可以缓存哪几种类型 -- map还有。。。忘了
9.设计模式
- 单例模式恶汉式和懒汉式的区别 -- 一个是static,一个是加锁。加锁有两种,一种synchronized,一种复合校验
CVTE二面
(面试前翻翻看准面经)
1.如何实现mysql,mybatis等等的缓存同步
2.self4j日志记录量大的话怎么优化
3.代码如何重构,你对重构的理解 -- 重构本质是将复杂的逻辑变成通俗的方法名好理解
4.gm指令实现
5.mybatis缓存机制 -- 一二级缓存
6.mysql如何解决数据量多,查询优化问题 -- 数据量大、查询优化两个角度
7.聚簇索引和非聚簇索引的区别 -- 聚簇主键索引,b+树叶子节点存地址;非聚簇叶子节点存索引,然后索引又找到数据,二次查询
8.mysql的explain有什么字段来判断是否需要优化 -- 是否使用到index、是否重排序
9.有没有使用aop
10.期间看了我博客,问我平时写什么博客
11.期间看了我github的金手指项目
12.说一下平时看的书
13.说一下看的书里面你印象最深刻的点(我把线程池任务执行流程,有哪些线程池,区别是什么,阻塞队列优劣的选择,如何设计一个阻塞队列,拒绝策略回答了)
cvte面试hr面准备工作
1.问工资:
官网写多少答多少(12k-17k),如果说要价过高:我的工资要去可能过高了,但我认为薪酬不是最重要的,我相信公司会在工作中了解我的价值,从而逐步提升我的工资水平,请问公司可以提供的薪酬范围是多少呢?
2.给前面两轮面试打分:
第一轮7分、第二轮9.5分。对前面两轮打分:我觉得第一轮问道我网络安全方面的时候,我会有些问题没有接触过,是我的扣分点,不过80%的问题都能回到出来,我给7分吧。第二轮技术面我表现的挺好的,算是把自己的优点和研究的东西都表达出来,最后也得到面试官的认可,我觉得能给9.5分
3.家庭关系和谁最好:
跟我妈吧,我妈比较搞怪、开心。
4.未来5-10年会做什么,怎么规划:
未来一年我希望能从初级开发到达中级开发,初级开发需要上级指导才能完成任务,中级能够独立完成需求业务。2-3年成为高级开发/项目负责人,能够架构项目、对项目程序进行优化。当然我也开始在写博客,去表达分享我的思想,传播我的价值,同时提高一下的语言的表达能力,这也是成为一个高级开发、项目负责人应有的能力。最后,我希望能搭建一个有创意的网站,一站式的解决所有问题。
5.有没有别的offer:
省略
6.如果给offer可能什么原因没来:
电子offer发的太晚,我可能不来,如果到了四月底还没有正式的offer确认,我可能需要考虑新的机会了,我相信公司的同时,公司要给我安全感。
7.什么原因可能会离职:
当我28岁还没能成为高级开发工程师的话。可能我需要换一个环境,才能有所提高
8.对工作的地点、时间、薪资怎么看:
我喜欢在不同的工作地点,会给我新鲜的空气的灵活的大脑。我能接受995的工作节奏。我希望能拿到12k-17k
9.你最艰难的一段时期:
高三吧,那时候为了考好大学,经常一个人学习到2.3点
10.问她问题:
工作环境、技术团队的氛围、有技术分享大会吗
我以后的上级是我上次的面试官吗
CVTE网上面试题总结
JAVA基础
1.Servlet的生命周期
分为init,service,destory三个流程,当第一个请求/服务器启动时init,然后会给所有进来的请求分配一个线程,执行doGet\doPost方法,最后执行destory,被GC回收
2.session和cookie的区别
what it is:cookie存在浏览器,session存在于服务器,都是存储访问者信息
their relative:都是存储访问者信息的。但是cookie容易被截获不安全,session在服务器安全。cookie容量小,session容量大
how can do:如果我们需要经常登录一个站点时,最好用cookie来保存信息 ;如果对于需要安全性高的站点以及控制数据的能力时需要用session
3.对Java的集合类了解哪一些
List:
》Arraylist:底层数据结构是Object数组,数组的特性就是按下表访问的O(1)时间复杂度,访问速度读快,但增删数据需要移动后面的所有数据,需要O(n)的时间复杂度。另外Arraylist默认大小的10,每次扩容增加1.5倍
》LinkedList:底层数据结构是链表,由一个个Node节点构成,继承了deque双端队列。链表结构特性就是在两端增删节点速度快,但按照索引访问效率低,是O(N/2),头尾就近原则。按需分配空间,不会浪费空间。
》Vector:线程安全效率慢
Map:
》HashMap:底层结构是Entry数组,称为哈希桶,即一个数组里,每个元素指向一个单向链表,链表每个节点保存键值对。访问速度快O(1)。默认大小16,2n扩容,负载因子0.75。添加元素时,先计算key的hash值,再对length取模找到table[i],然后对链表内的key校验hash,同hash再校验equeal,先校验hash是因为hash比equal快很多,然后若key同则覆盖,不同则头插。hash冲突两种解决办法 -- 链地址法、平方地址法
》TreeMap:底层结构是红黑树,自平衡排序二叉树
》HashTable:线程安全,效率慢
Set:
》HashSet、TreeSet:不重复,底层跟Map一样
CurrentXXX:
》ConcurrentHashMap:锁分段技术,锁当前segment,不会锁整个table
4.ConcurrentHashMap的细节
https://blog.csdn.net/yansong_8686/article/details/50664351
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。
5.string stringbuilder stringbuffer
执行效率:Stringbuilder > StringBuffer > String
线程安全:String,StringBuffer
6.switch中可以用string吗 为什么
可以,jdk1.x后可以,以前只能int
7.equals ==区别
如果没有重写,其实是一样的,都是比较地址。我们也可以重写成比较值
8.hashmap结构
哈希桶,由一个Entry数组构成,数组内每个元素,是一个链表,存放键值对
9.hashmap扩容
当已使用75%的容量时会进行扩容*2,75%是扩容因子。扩容因子大,则空间利用率高,但容易发生hash地址冲突;扩容因子小,浪费空间。
10.hashmap为什么是2n扩容
当数组长度为2的n次幂的时候,不同的key算得得index相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了
11.hashmap负载因子为什么是0.75
其中loadFactor加载因子是表示Hsah表中元素的填满的程度.
若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.链表长度会越来越长,查找效率降低。
反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.表中的数据将过于稀疏(很多空间还没用,就开始扩容了)
冲突的机会越大,则查找的成本越高.
因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷.
如果机器内存足够,并且想要提高查询速度的话可以将加载因子设置小一点;相反如果机器内存紧张,并且对查询速度没有什么要求的话可以将加载因子设置大一点。不过一般我们都不用去设置它,让它取默认值0.75就好了。
MYSQL
1.说一下MySQL数据库的索引
what:索引,index,能加快搜索速度。
分类:
-- 普通索引:仅加速查询
-- 唯一索引:加速查询 + 列值唯一(可以有null)
-- 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
-- 组合索引(联合索引):多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
-- 全文索引:对文本的内容进行分词,进行搜索
-- 索引合并,使用多个单列索引组合搜索
--覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
-- 聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同 (主键索引即是)
-- 非聚集索引:不是聚集索引的就是叫非聚集索引
作用:
好处:
-- 可以加快数据库检索速度
-- 只能创建在表上,不能创建到视图上
-- 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
坏处:
-- 降低数据库插入修改删除的速度
-- 索引需要占用物理空间,除了数据表占用数据空间之外,每一个索引还要占一定的物理空间,如果建立聚簇索引,那么需要的空间就会更大
案例:
ALTER TABLE demo ADD INDEX c2(PASSWORD); -- 给'password'建立索引(alter)
ALTER TABLE demo ADD PRIMARY KEY(id);-- 建立主键/聚集索引
2.组合索引是什么, 索引失效情况
组合索引:多个列成一个索引。
索引失效:
-- 对索引使用函数、计算
-- 范围之后(>、<)索引失效
-- 没有按顺序访问索引
-- 使用or
-- select *
3.建一个索引的SQL语句
alter table demo add index c1(name);
alter table demo add primary key name;
4.字段属性 varchar和char区别
1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。
2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
5.问有几种引擎,回答有好几种,主要就两种。
myIsam:锁表
Innodb:锁行、支持事务
6.数据库的三大范式
第一范式:属性不可分
第二范式:完全依赖主键(消除部分依赖)
第三范式:消除传递依赖
7. mysql的锁
-- 共享锁(读锁)
-- 排它锁(写锁)
8.mysql的数据结构,为什么是b+树,为什么不用其他数据结构来进行多路查询
红黑树:二叉树,深度较大
二叉搜索:无自平衡,容易瘸腿
B树:所有节点都会存储卫星数据,多节点后,深度较大
9.mysql的辅助索引
辅助索引就是B+树的非叶子节点
16.用abc三个列作为索引 select * where b=1 and c=1 如何运行的
17 用abc三个列作为索引,where a=1 or group by c会不会走索引
18 用abc三个列作为索引 select b where c = 1 会不会用到辅助索引,用到怎么样 不用的又怎么样
\2. 讲简历上的项目数据库设计
\3. 数据库数据类型选择(姓名,性别,电话,地址)
线程
1.线程之间的通讯方式 (原理)
①synchronized同步:通过synchronized锁实现
②wait/notify机制 :等待和唤醒
③while轮询:通过while(true){if(xxx)}不断测试if里volatile修饰的共享数据是否符合条件来通讯
④管道通讯:使用java.io.PipedInputStream 和 java.io.PipedOutputStream进行通信
http://www.cnblogs.com/hapjin/p/5492619.html
参考: https://blog.csdn.net/xubinlxb/article/details/52118630
2.讲一下线程池(主要是讲的种类)
单线程池newSingleThreadExecutor :创建只有一个线程的线程池,且线程的存活时间是无限的;当该线程正繁忙时,对于新任务会进入阻塞队列中(***的阻塞队列)
**固定容量线程池newFixedThreadPool **:创建可容纳固定数量线程的池子,每隔线程的存活时间是无限的,当池子满了就不在添加线程了;如果池中的所有线程均在繁忙状态,对于新任务会进入阻塞队列中(***的阻塞队列)
缓存线程池newCachedThreadPoo :动态创建和销毁线程
超时线程池NewScheduledThreadPool :根据timeout时间升序任务的线程池
10.线程池的底层实现
12.volatile关键字作用,底层如何实现的
框架
\11. 学过那些后台框架呢(我也答了学了前端框架, JQ, Vue)
\12. Spring有那些特点呢(总体的)
3.IOC是什么, 底层实现原理
IOC:控制反转,创建一个对象由原来的自己new,变成了交给容器Container控制,主动权变了
\14. 有了解循环依赖吗出现循环依赖是设计上的问题,Spring是如何处理的
Spring有两种处理方式
当你通过构造器循环依赖
1、Spring容器创建“circleA” Bean,首先去“当前创建Bean池”查找是否当前Bean正在创建,如果没发现,则继续准备其需要的构造器参数“circleB”,并将“circleA” 标识符放到“当前创建Bean池”;
2、Spring容器创建“circleB” Bean,首先去“当前创建Bean池”查找是否当前Bean正在创建,如果没发现,则继续准备其需要的构造器参数“circleC”,并将“circleB” 标识符放到“当前创建Bean池”;
3、Spring容器创建“circleC” Bean,首先去“当前创建Bean池”查找是否当前Bean正在创建,如果没发现,则继续准备其需要的构造器参数“circleA”,并将“circleC” 标识符放到“当前创建Bean池”;
4、到此为止Spring容器要去创建“circleA”Bean,发现该Bean 标识符在“当前创建Bean池”中,因为表示循环依赖,抛出BeanCurrentlyInCreationException。
当你通过setter循环依赖
1、Spring容器创建单例“circleA” Bean,首先根据无参构造器创建Bean,并暴露一个“ObjectFactory ”用于返回一个提前暴露一个创建中的Bean,并将“circleA” 标识符放到“当前创建Bean池”;然后进行setter注入“circleB”;
2、Spring容器创建单例“circleB” Bean,首先根据无参构造器创建Bean,并暴露一个“ObjectFactory”用于返回一个提前暴露一个创建中的Bean,并将“circleB” 标识符放到“当前创建Bean池”,然后进行setter注入“circleC”;
3、Spring容器创建单例“circleC” Bean,首先根据无参构造器创建Bean,并暴露一个“ObjectFactory ”用于返回一个提前暴露一个创建中的Bean,并将“circleC” 标识符放到“当前创建Bean池”,然后进行setter注入“circleA”;进行注入“circleA”时由于提前暴露了“ObjectFactory”工厂从而使用它返回提前暴露一个创建中的Bean;
4、最后在依赖注入“circleB”和“circleA”,完成setter注入.
对于“prototype”作用域Bean,Spring容器无法完成依赖注入,因为“prototype”作用域的Bean,Spring容器不进行缓存,因此无法提前暴露一个创建中的Bean
http://jinnianshilongnian.iteye.com/blog/1415278
\15. MyBatis中#{}和${}区别
16.spring的aop原理,类别 区别 常用哪一个
数据结构
\16. 堆排序算法实现, 时间复杂度
最大堆:
- 最大堆中的最大元素值出现在根结点(堆顶)
- 堆中每个父节点的元素值都大于等于其孩子结点(如果存在)
jvm
内存溢出遇到过没有
\8. jvm内存结构
\9. 各部分会发生什么异常
\10. 如何判断是否需要回收对象
\11. 什么样的对象可以当作gcroots
设计模式
单例模式(如何用内部类实现)
spring中用到的设计模式
Redis
5 redis可以存储的类型
6 redis的sortset底层实现原理
7 redis里面的定时清理key如何实现的
8 redis里面定义key的时候,加入时间戳的时候,过期如何消除key的实现
9 如果消费者往消息队列放数据由于网络原因消息队列的ack没有收到,
消费者会重新发送,如何解决。如果消息队列发送到消费者的时候ack由于某些原因没有收到
如何解决消费者重复收到数据的情况
10.如何保持``200``万条数据的实时排名前``10``名(缓存)
算法
19 两个int数 比如 5,6 求出二进制中对应位置全是1出现的个数
#广州视源电子科技股份有限公司##面经##春招##Java工程师#