干货神总结,程序员面试技巧

面试总结
从决定离职开始,前先后后面试了几家公司,把还能记得住的面试问题总结一下,帮小伙伴们查漏补缺吧,会简要写一下我以为问题的关键点,但愿小伙伴们能够一举拿下offer。python

Java相关

Java GC机制(重要程度:★★★★★)nginx

主要从三个方面回答:GC是针对什么对象进行回收(可达性分析法),何时开始GC(当新生代满了会进行Minor GC,升到老年代的对象大于老年代剩余空间时会进行Major GC),GC作什么(新生代采用复制算法,老年代采用标记-清除或标记-整理算法),感受回答这些就差很少了,也能够补充一下能够调优的参数(-XX:newRatio,-Xms,-Xmx等等)。git

如何线程安全的使用HashMap(重要程度:★★★★★)程序员

做为Java程序员仍是常常和HashMap打交道的,因此HashMap的一些原理仍是搞搞清除比较好。这个问题感受主要就是问HashMap,HashTable,ConcurrentHashMap,sychronizedMap的原理和区别。github

HashMap是如何解决冲突的(重要程度:★★★★☆)web

其实就是连接法,将索引值相同的元素存放到一个单链表里。但为了解决在频繁冲突时HashMap性能下降的问题,Java 8中作了一个小优化,在冲突的元素个数超过设定的值(默认为8)时,会使用平衡树来替代链表存储冲突的元素。面试

Java建立对象有哪几种(重要程度:★★★★☆)算法

这个问题还算好回答,大概有四种—new、工厂模式、反射和克隆,不过这个问题有可能衍生出关于设计模式,反射,深克隆,浅克隆等一系列问题。。。要作好准备~
参考资料:
设计模式Java版
Java反射详解
深克隆与浅克隆的区别spring

注解(重要程度:★★★☆☆)sql

若是简历中有提到过曾自定义过注解,仍是了解清楚比较好。主要是了解在自定义注解时须要使用的两个主要的元注解@Retention和@Target。@Retention用来声明注解的保留策略,有CLASS,RUNTIME,SOURCE三种,分别表示注解保存在类文件,JVM运行时刻和源代码中。@Target用来声明注解能够被添加到哪些类型的元素上,如类型,方法和域等。
参考资料:
Java注解

异常(重要程度:★★★☆☆)

一道笔试题,代码以下,问返回值是什么。

int ret = 0;
try{
throw new Exception();
}
catch(Exception e){
ret = 1;
return ret;
}
finally{
ret = 2;
}

 

主要的考点就是catch中的return在finally以后执行 可是会将return的值放到一个地方存起来,因此finally中的ret=2会执行,但返回值是1。
参考资料:
深刻理解Java异常处理机制
Java异常处理

悲观锁和乐观锁区别,乐观锁适用于什么状况(重要程度:★★★★☆)

悲观锁,就是总以为有刁民想害朕,每次访问数据的时候都以为会有别人修改它,因此每次拿数据时都会上锁,确保在本身使用的过程当中不会被他人访问。乐观锁就是很单纯,心态好,因此每次拿数据的时候都不会上锁,只是在更新数据的时候去判断该数据是否被别人修改过。
大多数的关系数据库写入操做都是基于悲观锁,缺点在于若是持有锁的客户端运行的很慢,那么等待解锁的客户端被阻塞的时间就越长。Redis的事务是基于乐观锁的机制,不会在执行WATCH命令时对数据进行加锁,只是会在数据已经被其余客户端抢先修改了的状况下,通知执行WATCH命令的客户端。乐观锁适用于读多写少的状况,由于在写操做比较频繁的时候,会不断地retry,从而下降性能。
参考资料:
关于悲观锁和乐观锁的区别
乐观锁和悲观锁

单例模式找错误(重要程度:★★★★☆)

错误是没有将构造函数私有化,单例仍是比较简单的,把它的饿汉式和懒汉式的两种实现方式看明白了就能够了。
单例模式

__

Spring相关

关于Spring的问题主要就是围绕着Ioc和AOP,它们真是Spring的核心啊。

Spring Bean的生命周期(重要程度:★★★★★)

就不写我那么low的回答了,直接看参考资料吧。
参考资料:
Spring Bean的生命周期
Top 10 Spring Interview Questions Answers J2EE

Spring中用到的设计模式(重要程度:★★★★★)

工厂模式:IOC容器
代理模式:AOP
策略模式:在spring采起动态代理时,根据代理的类有无实现接口有JDK和CGLIB两种代理方式,就是采用策略模式实现的
单例模式:默认状况下spring中的bean只存在一个实例
只知道这四个。。。。
参考资料:
Design Patterns Used in Java Spring Framework

讲一讲Spring IoC和AOP(重要程度:★★★★★)

IoC的核心是依赖反转,将建立对象和对象之间的依赖管理交给IoC容器来作,完成对象之间的解耦。
AOP主要是利用代理模式,把许多接口都要用的又和接口自己主要的业务逻辑无关的部分抽出来,写成一个切面,单独维护,好比权限验证。这样可使接口符合“单一职责原则”,只关注主要的业务逻辑,也提升了代码的重用性。

AOP的应用场景(重要程度:★★★★☆)

权限,日志,处理异常,事务等等,我的理解就是把许多接口都要用的又和接口自己主要的业务逻辑无关的部分抽出来,写成一个切面,单独维护,好比权限验证。这样可使接口符合“单一职责原则”,只关注主要的业务逻辑,也提升了代码的重用性。

Spring中编码统一要如何作(重要程度:★★★☆☆)

配置一个拦截器就好了

<filter>  
       <filter-name>CharacterEncodingFilter</filter-name>  
       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
       <init-param>  
           <param-name>encoding</param-name>  
           <param-value>UTF-8</param-value>  
       </init-param>  
       <init-param>  
           <param-name>forceEncoding</param-name>  
           <param-value>true</param-value>  
       </init-param>  
   </filter>  
   <filter-mapping>  
       <filter-name>CharacterEncodingFilter</filter-name>  
       <url-pattern>/*</url-pattern>  
   </filter-mapping>

数据库相关

Mysql索引的内部结构(重要程度:★★★★☆)

B+树,三层,真实的数据存储在叶子节点
参考资料:
MySQL索引原理及慢查询优化

若是一个SQL执行时间比较长怎么办(重要程度:★★★★☆)

能够利用pt-query-digest等工具分析慢查询日志,也能够用explain查看SQL的执行计划。

若是一张表中有上千万条数据应该怎么作分页(重要程度:★★★☆☆)

确定不能直接limit,offset,主要就是要想办法避免在数据量大时扫描过多的记录。

什么样的列适合加索引,若是一个列的值只有1和2,那么它适合加索引么(重要程度:★★★☆☆)

  • 在where从句,group by从句,order by从句,on从句中出现的列

  • 索引的字段越小越好

  • 在创建联合索引时,离散度大的列放大联合索引的前面

只有1和2不适合建索引

Redis相关

Redis提供哪几种数据结构(重要程度:★★★★★)

一共有5种,字符串,散列,列表,集合,有序集合。
参考资料:
Redis中文官网

Redis支持集群么,从哪一个版本开始支持集群的(重要程度:★★☆☆☆)

支持集群,从3.0版本开始。固然面试时我也没记住版本。。。

Redis集群中,如何将一个对象映射到对应的缓存服务器(重要程度:★★★★☆)

通常就是hash%N,就是用对象的hash值对缓存服务器的个数取余

接上个问题,缓存集群中若是新增一台服务器,怎么才能不影响大部分缓存数据的命中?(重要程度:★★★★☆)

其实就是一致性Hash算法。之前有看过,惋惜面试的时候脑壳就空了,只记得一个环,果真仍是要实践啊。
参考资料:
Consistent Hashing
五分钟理解一致性哈希算法(consistent hashing)

项目中具体是怎样使用Redis的(重要程度:★★★★☆)

根据实际状况回答吧。。。。我是主要作权限控制时用到了Redis,将用户Id和权限Code拼接在一块儿做为一个key,放到Redis的集合中,在验证某一用户是否有指定权限时,只需验证集合中是否有用户Id和权限Code拼接的key便可

算法相关

判断一个数字是否为快乐数字(重要程度:★☆☆☆☆)

leetcode第202题
连接

给定一个乱序数组和一个目标数字 找到和为这个数字的两个数字 时间复杂度是多少(重要程度:★☆☆☆☆)

leetcode第一题
连接

如何判断一个链表有没有环(重要程度:★☆☆☆☆)

用快慢指针

删除字符串中的空格 只留一个(重要程度:★☆☆☆☆)

这个比较简单。。。。

二叉树层序遍历(重要程度:★★☆☆☆)

利用队列就能够了

地铁票价是如何计算的(重要程度:★★☆☆☆)

不知道正确答案,感受是图的最短路径算法相关的。

Elasticsearch相关

为何要用Elasticsearch(重要程度:★★★★☆)

其实对Es的了解仍是比较少的,由于没作多久就去写坑爹代理商了😖。我的以为项目中用Es的缘由一是能够作分词,二是Es中采用的是倒排索引因此性能比较好,三是Es是个分布式的搜索服务,对各个节点的配置仍是很简单方便的

Elasticsearch中的数据来源是什么,如何作同步(重要程度:★★★★☆)

数据是来自其余部门的数据库,会在一开始写python脚本作全量更新,以后利用RabbitMQ作增量更新,就是数据更改以后,数据提供方将更改的数据插入到指定消息队列,由对应的消费者索引到Es中

接上个问题,利用消息队列是会对对方代码形成侵入的,还有没有别的方式(重要程度:★★★☆☆)

还能够读MySQL的binlog

发散思惟的题

如下题都是没有正确答案的,不知道是想考思惟,仍是压力面试,就只写题目,不写回答了。你们能够在面试以前准备下本身的答案以避免慌张。

画一下心中房树人的关系(重要程度:★☆☆☆☆)
给你一块地建房如何规划(重要程度:★☆☆☆☆)
估计二号线有几辆车在运行(重要程度:★☆☆☆☆)

其余

Thrift通讯协议(重要程度:★★★☆☆)

这个问题被问了两遍,然而如今仍是不知道。。。什么东西都不能停留在只会用的阶段啊~

git相关(重要程度:★★★★★)

一些git相关的问题,好比如何作分支管理(git flow),rebase和merge的区别(merge操做会生成一个新的节点)等等。

如何学习一门新技术(重要程度:★★★☆☆)

google+官网+stackoverflow+github

比较爱逛的网站和爱看的书(重要程度:★★★☆☆)

根据实际状况回答吧。。。

了不了解微服务(重要程度:★★☆☆☆)

简单了解过。。。
参考资料:
基于微服务的软件架构模式

针对简历中的项目问一些问题(重要程度:★★★★★)

就是根据简历上的项目问一些东西,好比权限控制是怎么作的,有没有碰到过比较难解决的问题之类的,不具体列举了,只要简历上的内容是真实的基本都没啥问题

为何要离职(重要程度:★★★★★)

被问了n遍,挺很差回答的一个问题,毕竟不算实习期工做还没满一年,这个时候跳槽很容易让人以为不安稳。

对公司还有什么问题(重要程度:★★★★★)

基本每轮面试结束都会问的一个问题,一开始也没当回事,直到有家公司竟然挂在四面的这个问题上,我也是蛮醉的😂,果真言多必失啊。

在***公司最大的收获是什么(重要程度:★★★★★)

对于我来讲,以为最大的收获就是对企业级的应用有了一个大体的了解,企业里的项目不像学校的课程做业,只要jdbc链接数据库完成功能就能够了,企业的项目要考虑不少东西,好比说为了提升可用性,要部署在多台服务器上,用nginx作负载均衡,还有就是用缓存,异步之类来提升接口性能。而后,也是第一次接触到SOA,这种面向服务的架构。也了解到一个好的应用,除了开发自己,一些自动化发布系统和监控系统也是必不可少的。

相关文章
相关标签/搜索