CVTE面试总结(全网面经,已收offer)

CVTE面试总结

文章目录

  • CVTE面试总结
    • `CVTE一面`
    • `CVTE二面`
    • `CVTE面试hr面准备工作`
      • 1.问工资:
      • 2.给前面两轮面试打分:
      • 3.家庭关系和谁最好:
      • 4.未来5-10年会做什么,怎么规划:
      • 5.有没有别的offer:
      • 6.如果给offer可能什么原因没来:
      • 7.什么原因可能会离职:
      • 8.对工作的地点、时间、薪资怎么看:
      • 9.你最艰难的一段时期:
      • 10.问她问题:
    • `CVTE网上面试题总结`
    • JAVA基础
        • 1.Servlet的生命周期
        • 2.session和cookie的区别
        • 3.对Java的集合类了解哪一些
        • 4.ConcurrentHashMap的细节
        • 5.string stringbuilder stringbuffer
        • 6.switch中可以用string吗 为什么
        • 7.equals ==区别
        • 8.hashmap结构
        • 9.hashmap扩容
        • 10.hashmap为什么是2n扩容
        • 11.hashmap负载因子为什么是0.75
    • MYSQL
        • 1.说一下MySQL数据库的索引
        • 2.组合索引是什么, 索引失效情况
        • 3.建一个索引的SQL语句
        • 4.字段属性 varchar和char区别
        • 5.问有几种引擎,回答有好几种,主要就两种。
        • 6.数据库的三大范式
        • 7. mysql的锁
        • 8.mysql的数据结构,为什么是b+树,为什么不用其他数据结构来进行多路查询
        • 9.mysql的辅助索引
    • 线程
        • 1.线程之间的通讯方式 (原理)
        • 2.讲一下线程池(主要是讲的种类)
    • 框架
    • 数据结构
    • jvm
    • 设计模式
    • Redis
    • 算法

CVTE一面

(boss直聘投的,免了笔试。。。很神奇的操作哈哈哈哈)

1.自我介绍(尴尬,开始时,一直心跳加速,喘不过气地说话)

2.元旦狂欢

  1. 讲一下活动是怎样的
  2. 用到了什么线程池 – 自己封装的
  3. 发奖时,如何保证不会重复发奖 – 锁代码块
  4. 锁代码块会造成性能缺失,如何解决
  5. 积分购买商品如何保 证原子性,代码怎么写 – 没看过
  6. 为什么要加synchronized锁,不用可重入锁
  7. 世界积分用什么保存 – AotomInteger原子整形
  8. volatile和synchronized有什么区别

3.mysql

  1. 如何提高数据库的查询速度 – 索引
  2. 组合索引和多个单列索引比较,那个速度快 ,为什么-- 组合索引,但不知道为什么
  3. limit(1000000,5)会有什么事情发生 – 不知道
  4. exits和in性能对比 – 小表举动大表
  5. join in如何提高性能 – 小表驱动大表
  6. 如何优化一个sql语句 – 使用explain优化
  7. 最左前缀原则是什么 – 索引使用要按照定制索引的顺序

4.JVM

  1. 讲一下垃圾回收 – 首先确定什么是垃圾,解释引用计数法和GCRoot引用法,并说明为什么不用引用计数;然后算法是分代回收策略,说到这里引出堆内存分为年轻代和老年代,年轻代用标记整理算法,老年代用复制算法,解释两个算法

5.Spring + Mybatis

  1. AOP的应用和原理 – 日志系统,模板方法实现方法前后执行日志操作
  2. IOC是什么,原理 – 把new对象的操作从我自己转移给Spring,原理是先读取XML文件所有标签,记录全限定名,然后通过反射,把所有对象存储到Factory工厂,最后Factotry调用getBean拿对象
  3. 讲一下Mybatis的缓存 – mybatis默认开启一级缓存,可以手动开启二级缓存
  4. 有了解循环依赖吗出现循环依赖是设计上的问题

6.基础

  1. CurrentHashmap的分段如何实现分段 – 锁每个table,不锁整个table[]
  2. hashmap内部结构 – Entry[],Entry里面是链表,链表由一个个key/value的Node节点组成。push的时候先计算hash,再求模,再比较hash,再equal
  3. 那hashmap除了链地址法还有什么方法解决地址冲突问题 – 平方法,还有一种忘了
  4. hashmap的扩容 – 根据存储因子默认0.75,当内存满75%的时候,扩容2倍。

7.网络安全

  1. 有了解过sql注入吗 – 通过prepareStatement插入防止
  2. 有了解过CSRF、XSS攻击吗 – 不懂

8.Redis缓存

  1. Redis可以缓存哪几种类型 – map还有。。。忘了

9.设计模式

  1. 单例模式恶汉式和懒汉式的区别 – 一个是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出现的个数

你可能感兴趣的:(面试)