CVTE一面
(boss直聘投的,免了笔试。。。很神奇的操作哈哈哈哈)
1.自我介绍(尴尬,开始时,一直心跳加速,喘不过气地说话)
2.元旦狂欢
3.mysql
4.JVM
5.Spring + Mybatis
6.基础
7.网络安全
8.Redis缓存
9.设计模式
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面准备工作
官网写多少答多少(12k-17k),如果说要价过高:我的工资要去可能过高了,但我认为薪酬不是最重要的,我相信公司会在工作中了解我的价值,从而逐步提升我的工资水平,请问公司可以提供的薪酬范围是多少呢?
第一轮7分、第二轮9.5分。对前面两轮打分:我觉得第一轮问道我网络安全方面的时候,我会有些问题没有接触过,是我的扣分点,不过80%的问题都能回到出来,我给7分吧。第二轮技术面我表现的挺好的,算是把自己的优点和研究的东西都表达出来,最后也得到面试官的认可,我觉得能给9.5分
跟我妈吧,我妈比较搞怪、开心。
未来一年我希望能从初级开发到达中级开发,初级开发需要上级指导才能完成任务,中级能够独立完成需求业务。2-3年成为高级开发/项目负责人,能够架构项目、对项目程序进行优化。当然我也开始在写博客,去表达分享我的思想,传播我的价值,同时提高一下的语言的表达能力,这也是成为一个高级开发、项目负责人应有的能力。最后,我希望能搭建一个有创意的网站,一站式的解决所有问题。
省略
电子offer发的太晚,我可能不来,如果到了四月底还没有正式的offer确认,我可能需要考虑新的机会了,我相信公司的同时,公司要给我安全感。
当我28岁还没能成为高级开发工程师的话。可能我需要换一个环境,才能有所提高
我喜欢在不同的工作地点,会给我新鲜的空气的灵活的大脑。我能接受995的工作节奏。我希望能拿到12k-17k
高三吧,那时候为了考好大学,经常一个人学习到2.3点
工作环境、技术团队的氛围、有技术分享大会吗
我以后的上级是我上次的面试官吗
CVTE网上面试题总结
分为init,service,destory三个流程,当第一个请求/服务器启动时init,然后会给所有进来的请求分配一个线程,执行doGet\doPost方法,最后执行destory,被GC回收
what it is:cookie存在浏览器,session存在于服务器,都是存储访问者信息
their relative:都是存储访问者信息的。但是cookie容易被截获不安全,session在服务器安全。cookie容量小,session容量大
how can do:如果我们需要经常登录一个站点时,最好用cookie来保存信息 ;如果对于需要安全性高的站点以及控制数据的能力时需要用session
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
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锁。
执行效率:Stringbuilder > StringBuffer > String
线程安全:String,StringBuffer
可以,jdk1.x后可以,以前只能int
如果没有重写,其实是一样的,都是比较地址。我们也可以重写成比较值
哈希桶,由一个Entry数组构成,数组内每个元素,是一个链表,存放键值对
当已使用75%的容量时会进行扩容*2,75%是扩容因子。扩容因子大,则空间利用率高,但容易发生hash地址冲突;扩容因子小,浪费空间。
当数组长度为2的n次幂的时候,不同的key算得得index相同的几率较小,那么数据在数组上分布就比较均匀,也就是说碰撞的几率小,相对的,查询的时候就不用遍历某个位置上的链表,这样查询效率也就较高了
其中loadFactor加载因子是表示Hsah表中元素的填满的程度.
若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.链表长度会越来越长,查找效率降低。
反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.表中的数据将过于稀疏(很多空间还没用,就开始扩容了)
冲突的机会越大,则查找的成本越高.
因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷.
如果机器内存足够,并且想要提高查询速度的话可以将加载因子设置小一点;相反如果机器内存紧张,并且对查询速度没有什么要求的话可以将加载因子设置大一点。不过一般我们都不用去设置它,让它取默认值0.75就好了。
what:索引,index,能加快搜索速度。
分类:
– 普通索引:仅加速查询
– 唯一索引:加速查询 + 列值唯一(可以有null)
– 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
– 组合索引(联合索引):多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
– 全文索引:对文本的内容进行分词,进行搜索
– 索引合并,使用多个单列索引组合搜索
--覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
– 聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同 (主键索引即是)
– 非聚集索引:不是聚集索引的就是叫非聚集索引
作用:
好处:
– 可以加快数据库检索速度
– 只能创建在表上,不能创建到视图上
– 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
坏处:
– 降低数据库插入修改删除的速度
– 索引需要占用物理空间,除了数据表占用数据空间之外,每一个索引还要占一定的物理空间,如果建立聚簇索引,那么需要的空间就会更大
案例:
ALTER TABLE demo ADD INDEX c2(PASSWORD); – 给’password’建立索引(alter)
ALTER TABLE demo ADD PRIMARY KEY(id);-- 建立主键/聚集索引
组合索引:多个列成一个索引。
索引失效:
– 对索引使用函数、计算
– 范围之后(>、<)索引失效
– 没有按顺序访问索引
– 使用or
– select *
alter table demo add index c1(name);
alter table demo add primary key name;
1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。
2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
myIsam:锁表
Innodb:锁行、支持事务
第一范式:属性不可分
第二范式:完全依赖主键(消除部分依赖)
第三范式:消除传递依赖
– 共享锁(读锁)
– 排它锁(写锁)
红黑树:二叉树,深度较大
二叉搜索:无自平衡,容易瘸腿
B树:所有节点都会存储卫星数据,多节点后,深度较大
辅助索引就是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. 数据库数据类型选择(姓名,性别,电话,地址)
①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
单线程池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. 堆排序算法实现, 时间复杂度
最大堆:
内存溢出遇到过没有
\8. jvm内存结构
\9. 各部分会发生什么异常
\10. 如何判断是否需要回收对象
\11. 什么样的对象可以当作gcroots
单例模式(如何用内部类实现)
spring中用到的设计模式
5 redis可以存储的类型
6 redis的sortset底层实现原理
7 redis里面的定时清理key如何实现的
8 redis里面定义key的时候,加入时间戳的时候,过期如何消除key的实现
9 如果消费者往消息队列放数据由于网络原因消息队列的ack没有收到,
消费者会重新发送,如何解决。如果消息队列发送到消费者的时候ack由于某些原因没有收到
如何解决消费者重复收到数据的情况
10.如何保持``200``万条数据的实时排名前``10``名(缓存)
19 两个int数 比如 5,6 求出二进制中对应位置全是1出现的个数