HashMap一直是经典的面试题,全部面试官都喜欢问他,由于它能够牵扯出很是多的知识点,而面试者到底能了解到何种程度,则必定程度反映其综合能力。
细节聊扩容因子LoadFactor=0.75
,初始大小InitailCapacity=16
容量(Capacity)和负载因子(Load factor) (构造函数)Capacity就是buckets的数目,Load factor就是buckets填满程度的最大比例。若是对迭代性能要求很高的话不要把capacity设置过大,也不要把load factor设置太小。当bucket填充的数目(即hashmap中元素的个数)大于capacity*load factor时就须要调整buckets的数目为当前的2倍。(扩容)
纵向聊其底层实现,数据结构是数组+链表,提到jdk1.8以后对链表节点到达8以后转换为红黑树加分。继续追问的话即是引伸出经常使用的数据结构:队列,栈,树,图。
谈谈HashMap线程不安全的体现
横向聊线程安全,HashMap为线程不安全,通常问多线程操做会致使其死循环的缘由。与线程安全的ConcurrentHashMap对比,又扩展到ConcurrentHashMap的实现。继续追问的话即是引伸出线程安全的定义,问一些经常使用的并发容器,考察面试者对java.util.concurrent包的掌握状况。那么至少能够牵扯出以下的问题:html
面试者能够先说历史,1.8以前采用分段锁,核心就是一句话:尽可能下降同步锁的粒度。1.8以后使用CAS思想代替冗杂的分段锁实现。不出意料,面试者答出CAS以后一定会被追问其思想以及应用,换作我本身的话会有以下思路做答:CAS采用乐观锁思想达到lock free,提一下sun.misc.Unsafe中的native方法,至于CAS的其余应用能够聊一聊Atomic原子类和一些无锁并发框架(如Amino),提到ABA问题加分。java
线程安全这个词也是面试的高频词,说完上面的并发容器,回头说一说线程安全的定义,按照周志明大大的话回答私觉得是极好的:当多个线程访问某个类时,无论运行时环境采用何种调度方式或者这些线程将如何交替进行,而且在主调代码中不须要任何额外的同步或协同,这个类都能表现出正确的行为,那么称这个类是线程安全的
一般与锁一块儿出现:除了synchronized以外,还常常被问起的是juc中的Lock接口,其具体实现主要有两种:可重入锁,读写锁。
这些都没问题的话,还会被询问到分布式下的同步锁,通常借助于中间件实现,如Redis,Zookeeper等,开源的Redis分布式锁实现有Redisson,回答注意点有两点:一是注意锁的可重入性(借助于线程编号),二是锁的粒度问题。除此以外就是一些juc的经常使用工具类如:CountdownLatch,CyclicBarrir,信号量
名词超连接
可重入锁
读写锁
分布式下的同步锁mysql
建立线程有几种方式:这个时候应该绝不犹豫的回答1种。面试官会有些惊讶于你的回答,由于彷佛他已经习惯了听到Thread和Runnable2种方式的“标准答案”。其实,仔细审题会发现,java建立线程只有一种方式:Thread。Runnable是表明任务,不管是Callable,Runnable,ThreadPool,最终都是Thread,因此2种的回答必定是错误的。
多线程相关资料linux
如经典的单利模式。当被问到单例模式时,私觉得在有准备的前提下,回答使用双检锁的方式实现能够很好地诱导面试官。双检锁实现线程安全的单利模式有两块注意点:1锁的粒度问题 2 静态变量须要被volatile修饰。前者已经被上文提过,重点是后者,一定会诱导面试官继续询问你有关volatile原则的问题,无非是happens-before原则或者JMM(java内存模型)相关。前者只须要熟记几条关键性的原则便可,然后者回答的重点即是须要提到主存与工做内存的关系。
工厂模式,观察者模式,模板方法模式,策略模式,职责链模式等等,一般会结合Spring和UML类图提问。
相关设计模式代码git
说实话,我本身对JVM的掌握几乎彻底来自于《深刻理解java虚拟机》,加上一点点线上的经验。初级岗位常问的问题也是固定的那么几个。
内存分区:主要就是堆和栈,严谨点回答能够答方法区,虚拟机栈,本地方法栈,堆,程序计数器。聊一聊Hotspot在jdk1.7中将常量池移到了堆中,jdk1.8移除永久代用MetaSpace代替起码能够佐证:你喜欢在一些JAVA群里面吹水。
垃圾回收算法:新生代因为对象朝生夕死使用标记-清除(or标记-整理)算法,老年代生命力强使用复制算法。提到一句分代收集便可。
垃圾回收器一两个名字仍是得叫的上来:Serial,Parallel,CMS,G1...
如何判断一个对象能够被回收:引用计数(能够提到Netty中的使用案例),可达性分析(JVM使用)
JVM相关连接github
bio,nio区别要熟知,了解nio中的ByteBuffer,Selector,Channel能够帮助面试者度过很多难关。几乎提到nio一定会问netty,其实我分析了一下,问这个的面试官本身也不必定会,但就是有人喜欢问,因此我们适当应付一下就好:一个封装很好扩展很好的nio框架,经常使用于RPC框架之间的传输层通讯。面试
聊一聊你对JAVA中反射的理解:运行时操做一个类的神器,能够获取构造器,方法,成员变量,参数化类型...使用案例如Hibernate,BeanUtils。算法
jdk动态代理和cglib动态代理的区别:前者须要实现一个接口,后者不须要;前者依赖于jdk提供的InvocationHandler,后者依赖于字节码技术;前者我还能写一些代码,后者彻底不会。大概就这些差异了。spring
在我不长的面试官生涯中,比较烦的一件事即是:当我还没问全:“聊一聊你对Spring的理解”这句话时,部分面试者的脸上已经浮现出了笑容,并火烧眉毛的回答:AOP和IOC。这本无可厚非,但一旦这成了条件反射式的回答,便违背了面试的初衷。sql
在面试中,Spring从狭义上能够被理解成Spring Framework&SpringMVC。而广义上包含了Spring众多的开源项目,若是面试者连spring.io都没有访问过,私觉得是不该该的扣分项。
Spring常见的问题包括:Spring Bean的scope取值,BeanFactory的地位,@Transactionl相关(传播机制和隔离级别),SpringMVC工做流程
spring相关连接
SpringBoot是当今最火的框架之一了,其starter模块自动配置的思想是面试中常常被问到的。如spring-boot-starter-data-jpa模块会默认配置JpaTransactionManager事务管理器,而spring-boot-starter-jdbc则会默认配置DataSourceTransactionManager事务管理器,二者的差别常常被用来作对比。@ConditionalOnMissingBean,@ConditionalOnBean等注解做用也须要被掌握。
这里的数据库仍是以传统的RDBMS为主,因为存储过程,触发器等操做通常在互联网公司禁止使用,因此基本传统数据库能问的东西也并很少。
一、索引的分类有哪些?面试者能够尝试本身分类回答。索引和惟一索引;汇集索引和非汇集索引;数据结构能够分为Hash和B+树索引;单列索引和联合索引。常见的索引问题还包括(A,B,C)的联合索引,查询(B,C)时会不会走索引等一些数据库的小细节。
二、事务ACID的描述和隔离级别。
三、mysql的explain查询分析也是面试的重点对象,一条分析结果的查询时间,影响行数,走了哪些索引都是分析的依据。
四、若是面试官问到存储引擎,说实话也有点为了面试而面试的感受,掌握基本的InnoDB和Myisam的区别便可。
五、互联网公司可能会比较关心面试者对分库分表的掌握:mysql自带的sharding为何通常不使用?中间件级别和驱动级别的分库分表,sharding-jdbc,cobar,mycat等开源组件的使用,分布式ID和分库键的选择也备受面试官的青睐。
数据库读写分离相关连接
数据库分库分表相关连接
这个的确很热,这年头不熟悉Redis真很差意思说本身是干互联网的。
一、Redis的经常使用数据结构,这不用赘述了。
二、Redis的持久化策略。了解RDB和AOF的使用场景便可。
三、Redis的发布订阅。
四、列举Redis的使用场景。这个能够自由发挥,除了主要功能缓存以外,还包括session共享,基于五、Redis的分布式锁,简易的消息队列等。
六、了解Redis的集群和哨兵机制。
七、高级话题包括:缓存雪崩,缓存失效,缓存穿透,预热等。
相关学习连接
至少掌握一种经常使用的消息队列中间件:RabbitMQ,ActiveMQ,RocketMQ,Kafka,了解MQ解耦,提升吞吐量,平滑处理消息的主要思想。常见的面试问题包括以下几点:
一、列举MQ在项目中的使用场景
二、消息的可靠投递。每当要发生不可靠的操做(如RPC远程调用以前或者本地事务之中),保证消息的落地,而后同步发送。当失败或者不知道成功失败(好比超时)时,消息状态是待发送,定时任务轮询待发送消息表,最终必定能够送达。同时消费端保证幂等。也有朋友告诉过我RocketMQ中事务消息的概念,不过没有深刻研究。
三、消息的ACK机制。如较为经常使用的事务机制和客户端ACK。
四、DLQ的设计。
相关学习连接
一、解释反向代理。
二、经常使用的负载均衡算法。掌握ip_hash ,轮询,weight,fair便可。
三、配置动静分离。
Dubbo,Motan等主流rpc框架的设计思想也是面试中宠儿。
一、说一说RPC的原理?可初步回答动态代理+网络通讯,进一步补充RPC的主要分层:协议层,序列化层,通讯层,代理层。每一层拉出来均可以被问好久:如序列化方式的选择,通讯层的选择等。
二、注册中心的做用和选择。Zookeeper,Consul,Eureka等注册中心完成了什么工做,以及他们的对比。
三、netty相关的提问。对于非专业中间件岗位,其实感受仍是想询问面试者对非阻塞IO的理解,真要让面试者用netty手撸一个EchoServer&EchoClient感受就有点BT了,若是有公司这么干,请告知我[微笑face]。
相关学习连接
就我所了解的状况,国内SpringCloud的普及程度还不是很高,可是SpringCloud的相关组件会被部分引用,这却是很常见,因此简历中出现SpringCloud也会是一个初级JAVA的亮点。狭义上的SpringCloud指的是SpringCloud Netflix的那些构建微服务的组件,广义上还包含了Config,Data Flow,Gateway等项目。
一、Feign,Ribbon,Eureka,Zuul的使用。了解各个组件的做用,会问一些常遇到的问题如Feign的重试机制,Eureka的保护机制,Zuul的路由机制等。
二、Spring Cloud使用的restful http通讯与RPC通讯的对比。毕竟...这是一个经久不衰的辩题,能够从耦合性,通讯性能,异构系统的互信等角度对比。
一、CAP和BASE原理。了解CAP只能同时保证两个的结论,以及CP和AP的选择依据。了解BASE的最终一致性原理。
二、重试和幂等性。如在支付场景中的异步支付回调,内外部系统对接保证一致性一般采起的保障手段。
三、分布式链路跟踪。Dapper论文的掌握,Trace,Span,Annotation,埋点等基本概念的含义,有过Zipkin,Spring Cloud Slueth的使用经验天然是更好的。
四、分布式事务。虽然我认为这自己并非一种值得提倡的东西,出现分布式事务应当考虑一下你的限界上下文划分的是否合理。那既然有人会问,或许也有他的道理,能够尝试了解二阶段提交,三阶段提交,Paxos。
五、一致性Hash。抓住一致性hash环和虚拟节点两个关键点做答便可。
六、熔断、降级。二者的对比,以及分布式中为什么二者地位很重要。
七、谷歌的三驾马车:分布式文件系统(如开源实现HDFS),分布式存储系统(如开源实现HBASE),分布式计算框架(Map-Reduce模型)。市面上绝大多数的海量数据问题,最终都是在考着三个东西。典型问题:2个1T的文本文件存储着URL,筛选出其中相同的URL。海量文件的word count...
一、经常使用指令cd(进入),ls(列表显示),rm -f /*(优化系统)这些指令固然是必须会的
二、Linux中的CoreUtils相关问题。如linux下对文本进行排序并取前十个这些面试题 sort xx.txt | tail -n 10,基本都是在围绕其在设计。
三、经常使用脚本的书写
四、高级话题:Linux下的IO模型,epoll和poll的区别等。
一般考的算法题会是一些较为简单的算法或者经典算法。ACM经验会让你如鱼得水。
复杂度的概念,二分查找,快排的实现,一些贪心算法,DP,数据结构,树和图论,位操做,字符串。
总的来讲不会很难,要么是考验思惟的算法,要么是能够直接套用经典算法的模板,主要是考研面试者的算法思惟,毕竟不是算法岗。
一、业务场景的设计。诸如让你设计一个抢红包的流程,作一个秒杀的系统等等,重点考察的是一个面试者综合考虑问题的能力。二、你项目中最有挑战的一个技术点。三、HTTP协议,TCP/IP协议四、容器技术Docker,k8s。这一块笔者没接触,不妄加讨论。