Java面试总结(二)
前几天去了几家公司面试,果然,基本全部倒在二面上,无语啊。。。不过幸好,到最后拿到了环球易购的offer,打算就这么好好呆着了,学习学习,努力努力,下面讲讲这几天的面试吧。
先是恒大,一个组长面试,答的很一般吧,有些问题是确实不知道题意,如何设计一个多线程,用来表示一个红绿灯和车流的关系;还有人走迷宫的时候,如何用一个设计模式表示人的多样性和路的多样性;还有就是如何大批量向数据库插入数据,这个之前没关注过,没答出来,有点遗憾。还有就是薪资问题,来之前我以为恒大,这么牛逼的公司,要不要提高一下薪资要求,不过为了稳妥还是继续9-10k,面试官说刚毕业的,这边只能给到8k左右啊,,,,就这样,挂了。
达飞金控一面问的问题真的太基础,基础到有点吓人,差不多也是那种set、list、map区别,抽象和接口什么的,答得一般吧。由于面试官在开会,开到了12点多,然后继续面试,同时还有另一个面试的在等,二面也聊得还算是蛮顺畅,问了如果不小心发送了两个重复的请求,由于不同机房,数据同步需要时间,那么如何解决这个请求;还有就是在一段文字中找出出现次数最多的字谜,总体上来的还算是一般偏上吧,答得也七七八八,然后就1点了,还有另外一个人在等面试,最后说等消息,到现在也没消息,又挂了。。。。蛇口那边的环境确实不错,面完下楼,好多外国人。还有就是达飞准备招人做风控、电商方面的业务,有需要的可以投一下。
联想的有点,,,对着一张纸的题直接说出答案,这个面试官说答的还不错,然后是手写sql和上机笔试,sql没写对(考察分页,group by,having),其实不难的,只是平时不注意,上机的题也没全做出来(考察Java日期类的使用,有点古老),不过还好有个自己的网站二面还是过了,三面,额,可能做得东西跟自己想的不一样,当我说我想做分布式、高并发、高可用的东西之后,然后还问了部门manager并发量有多大,他说主要是给内部使用的,所以并发量不打,然后说等消息吧,就这么挂了,据说联想2020年在后海会落成一栋楼,感觉屌屌的,可惜了。。。。
永远挂在二面的我啊
深圳想去的公司并且招人的,基本投完了,然后这么多都是倒在了二面,有点不甘心吧。在boss上偶然看到环球易购在招人,而且一直是自己梦寐以求的电商行业,就在boss上找环球易购的那些技术负责人,一个一个问,还好有位大佬理我,虽然不合适,但帮忙推到了另一个组,然后等HR电话,一直没答来,所以只能一直贯彻自己的方针:成功的三要素是,一坚持,二不要脸,三坚持不要脸,一直请问那位技术大佬,虽然特别不好意思。我们经常说,千里马常有而伯乐不常有,那么一只不要脸的普通马就只能自己争取了23333。
周一去了环球易购,面试官挺直接的,感觉好像大概知道我实力如何什么的,直接问难度稍微大一点点的问题,有点慌,而且回答的也不是太好,双亲委派还记反了(尴尬),然后是部门经理,这个我回答的更惨,惨不忍睹,问了tomcat如何解析一个请求,意思是tomcat源码看过没,,,,真的超级慌,当初看了一会源码就没坚持下去直接放弃了。不过还好能HR面了(终于有家公司是HR面了),中间件毕竟是我特别想整的东西。周三接到了offer,开心的一晚睡不着(加上没工作作息时间混乱),导致今天体检血压一直高,,,,现在真是超级累。
这年头找工作真的很累,最好不要像我一样裸辞,找不到工作心里真的很不舒服的,特别容易心态爆炸,有时候觉得自己表现的还不错,但就是没过,很离谱的那种,毕竟面试,运气缘分什么的占比更重。我是因为在上家公司加班太严重,而且任务太忙,根本没时间面试和学习所以裸辞的。
下面是自己印象深刻的题吧,有面试的可以参考参考,答案不一定准确,因为我自己也是半斤八两,也欢迎大家帮忙提醒一下。
1.MQ事务,如果消费者消费了,如何回滚
分布式事务,是我计划下下一阶段要看的东西(下一个是分布式锁),没想到这么快就被问到了,最初看的不过也就CAP、BASE、2PC、3PC这些,MQ事务真的很少接触。即使没学过,那就按自己的理解来吧。假设有三个事务:A、B、C。
(1)如果三个事务之前不需要彼此的依赖,可以执行完A的时候向消息队列发送一个prepareA,同理,B、C也一样,如果三个事务在本地都执行成功了,那么发送一次success,然后事务prepareA、prepareB、prepareC开始执行,如果有一个失败,则直接回滚所有。
(2)如果事务B需要依赖A的结果、C需要依赖B的结果,那么A执行完后再执行B,B执行完再执行C,到最后,其中如果有一个失败,则回滚重试。
这一块是真没接触过,即使百度了,感觉也有点抽象,还是先把ZooKeeper的分布式锁看完再整分布式事务的东西吧。百度的时候看到了一个比较类似的想法,说的比我好,可以看看。
参考:
分布式事务之最终一致的Mq实现
聊聊分布式事务,再说说解决方案
2.主线程如何捕获子线程的异常
这道题不是很理解他的意思,try catch不就行了?他说不是这个意思,我说用线程池的话可以用callable异步返回异常结果,他说这个不算吧,一脸懵逼的状态,事后百度了下发现考点是UncaughtExceptionHandler。。。大概意思就是把线程交给线程组,然后再线程组里重写异常捕获方法,即可在主线程捕获子线程的异常了,例子如下:
public class ThreadExcep extends ThreadGroup {
private ThreadExcep() {
super("线程组的名字");
}
public void uncaughtException(Thread thread, Throwable exception) {
System.out.println(thread.getId());
exception.printStackTrace();//example, print stack trace
}
public static void main(String[] args) {
ThreadExcep excep = new ThreadExcep();
Thread thread = new Thread(excep, () -> {
throw new NullPointerException("空指针异常");
});
thread.start();
}
}
结果如下:
11
java.lang.NullPointerException: 空指针一场
at com.study.exception.ThreadExcep.lambda$main$0(ThreadExcep.java:26)
at java.lang.Thread.run(Thread.java:748)
而如果去掉exception.printStackTrace(),程序是不打印报错信息的。原因可以总结如下:
(1)如果在主线程中创建一个子线程,默认情况下这两个线程同属于一个线程组,如果子线程发生异常,主线程可以直接使用try catch捕获的到。
(2)同样是在主线程中创建一个子线程,如果声明了这个子线程是另一个线程组的,即调用了new Thread(ThreadGroup group, Runnable target),则主线程中是无法直接捕获到子线程的发生的异常的,不过可以通过在声明一个线程组重写uncaughtException,然后把子线程放进去。
不管怎么说,在主线程中捕获子线程的异常一般是不推荐的,线程设计的理念:“线程的问题应该线程自己本身来解决,而不要委托到外部。”
参考:
【Java 多线程】Java中主线程如何捕获子线程抛出的异常
3.大批量插入数据库如何优化
大批量,之前都没怎么注意过,这个问题确实不会,网上参考了下别人的,大体上是这个意思:合并数据+事务的方法在较小数据量时,性能提高是很明显的,数据量较大时(1千万以上),性能会急剧下降,这是由于此时数据量超过了innodb_buffer的容量,每次定位索引涉及较多的磁盘读写操作,性能下降较快。而使用合并数据+事务+有序数据的方式在数据量达到千万级以上表现依旧是良好,在数据量较大时,有序数据索引定位较为方便,不需要频繁对磁盘进行读写操作,所以可以维持较高的性能。
参考:
数据库大批量SQL插入性能优化
4.Spring Bean的生命周期
Spring的源码确实要找个时间好好看看了,下面的是参考自《Spring实战的》内容。
主要流程如下:
(1).Spring对Bean进行实例化(相当于程序中的new Xx())
(2).Spring将值和Bean的引用注入进Bean对应的属性中
(3).如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法(实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)
(4).如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanDactory(BeanFactory bf)方法并把BeanFactory容器实例作为参数传入。(实现BeanFactoryAware 主要目的是为了获取Spring容器,如Bean通过Spring容器发布事件等)
(5).如果Bean实现了ApplicationContextAwaer接口,Spring容器将调用setApplicationContext(ApplicationContext ctx)方法,把y应用上下文作为参数传入.(作用与BeanFactory类似都是为了获取Spring容器,不同的是Spring容器在调用setApplicationContext方法时会把它自己作为setApplicationContext 的参数传入,而Spring容器在调用setBeanDactory前需要程序员自己指定(注入)setBeanDactory里的参数BeanFactory )
(6).如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessBeforeInitialization(预初始化)方法(作用是在Bean实例创建成功后对进行增强处理,如对Bean进行修改,增加某个功能)
(7).如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化的作用一样,都是在Bean的全部属性设置成功后执行的初始化方法。
(8).如果Bean实现了BeanPostProcess接口,Spring将调用它们的postProcessAfterInitialization(后初始化)方法(作用与6的一样,只不过6是在Bean初始化前执行的,而这个是在Bean初始化后执行的,时机不同 )
(9).经过以上的工作后,Bean将一直驻留在应用上下文中给应用使用,直到应用上下文被销毁
(10).如果Bean实现了DispostbleBean接口,Spring将调用它的destory方法,作用与在配置文件中对Bean使用destory-method属性的作用一样,都是在Bean实例销毁前执行的方法。
参考:
1.《Spring实战》
2.Spring中Bean的生命周期是怎样的?
5.Tomcat是如何解析一个请求的
万万没想到啊,自己曾经研究过一点点tomcat的源码,现在却忘光了,留张图先吧,之后写源码分析的系列。
6.代理模式(Spring)
这题之后看Spring源码的时候再总结了。
7.Java类里的静态变量在JVM中哪个区
JDK8之前,静态成员变量确实存放在方法区;但JDK8之后就取消了“永久代”,取而代之的是“元空间”,永久代中的数据也进行了迁移,静态成员变量迁移到了堆中(方法区是JVM的规范,永久代是方法区的具体实现)。
8.ORM的好处,为什么使用ORM
惊不惊喜,意不意外,大部分人都在用ORM,但是却很少关注为什么吧。Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。
优点
(1)方便的使用面向对象来进行额外的操作,语句清晰
(2)防注入
(3)方便动态构造语句,对于不同的表的相同操作采用多态实现更优雅
(4)一定程度方便重构数据层『比如改表名,字段名等』
缺点
(1)不太容易处理复杂查询语句
(2)性能较直接用SQL差,毕竟有个转化过程更。
总结
这些日子的面试过程,有基础的,有广度的,也暴露了自己很多很多缺点,2018还得继续努力,最怕的是比你厉害的人还比你努力吧,不过怎么说,希望各位在求职稳住心态,猥琐发育,前程似锦。
Java面试总结(二)的更多相关文章
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- Java面试(二)
1 同步方法 VS 同步代码块: java中,每一个对象都有一把锁,线程用synchronized获取对象上的锁. 非静态同步方法:锁是类的对象的锁. 静态同步方法:锁的是类本身. 同步方法块:锁是可 ...
- [Java面试十二]数据库概念相关
1. 什么是存储过程?它有什么优点? 答:存储过程是一组予编译的SQL语句,它的优点有: 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次. 允许更快执 ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- java面试总躲不过的并发(二):volatile原理 + happens-before原则
一.happens-before原则 同一个线程中的,前面的操作 happens-before 后续的操作.(即单线程内按代码顺序执行.但是,在不影响在单线程环境执行结果的前提下,编译器和处理器可以进 ...
- Java面试集合(二)
前言 大家好,给大家带来Java面试集合(二)的概述,希望你们喜欢 二 1.请问线程有哪些状态? 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked ...
- Java面试知识点之线程篇(二)
前言:接上篇,这里继续对java线程相关知识点进行总结. 1.notify和notifyall的区别 notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的 ...
- java面试宝典(蓝桥学院)
Java面试宝典(蓝桥学院) 回答技巧 这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的学生在笔试/面试时更好地赢得好的结果.由于这套试题涉及的范围 ...
- JAVA面试精选【Java基础第一部分】
这个系列面试题主要目的是帮助你拿轻松到offer,同时还能开个好价钱.只要能够搞明白这个系列的绝大多数题目,在面试过程中,你就能轻轻松松的把面试官给忽悠了.对于那些正打算找工作JAVA软件开发工作的童 ...
- Java面试必备知识
JAVA面试必备知识 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可 ...
随机推荐
- Excel 2010高级应用-雷达图(六)
Excel 2010高级应用-雷达图(六) 基本操作如下: 1.新建空白Excel文档,并命名雷达图 2.单击"插入",并找到雷达图图样 3.单击雷达图图样,在空白文档上生成图框, ...
- ASP.NET Core 2.0 : 六. 举个例子来聊聊它的依赖注入
本文通过一个维修工与工具库的例子形象的描述一下为什么要用依赖注入.它的工作原理是什么样的, 然后根据这个类比一下ASP.NET Core 中的依赖注入, 从而深刻了解它的使用方法.注意事项以及回收机制 ...
- iOS - Core Animation 核心动画的使用
1.简单使用示例 1.1 时钟 QClockView.h @interface QClockView : UIView /// 创建时钟界面 + (instancetype)q_clockViewWi ...
- 经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- Think with Google 京东如何玩转TensorFlow?
2018 年 2 月 6 日,Think with Google 年度峰会在北京召开.在本次峰会上,我们分享了 Google 和我们的合作伙伴在 AI (人工智能) 方面取得的成绩,探讨如何利用人工智 ...
- 移动端的silder,未封装,基于zepto的touch模块,有参照修改过touch的bug
<!--html模块--> <header class="appoin-head"> <ul> <li class="aa&qu ...
- java继承属性相关介绍
这个只需要记住一点,父类的任何属性(变量可以看做属性),子类均可继承并覆盖,allType(father)-->changeAnyType(son)-->AnyType 这是父类的所有代表 ...
- 我在微信小程序遇到的坑
这段时间刚好结束一个小程序,被坑的好惨,所以罗列出来,有用的着的,就抱走吧! 1.关于音频,项目要求能在退出小程序的情况下继续播放,所以我直接用了 wx.getBackgroundAudioM ...
- 禁ping以及清理系统多余账号说明
查出多余的:grep -v “nologin$“ /etc/passwd
- 用Go自己实现配置文件热加载功能
说到配置文件热加载,这个功能在很多框架中都提供了,如beego,实现的效果就是当你修改文件后,会把你修改后的配置重新加载到配置文件中,而不用重启程序,这个功能在日常中还是非常实用的,毕竟很多时候,线上 ...