本题主要考察是否熟悉各类map的应用场景,若是只说出key/value为空无心义是不够的,要能考虑到更根本的缘由java
直接缘由:mysql
根本缘由:linux
本题主要考察对linux的使用深度,属于加分项,没有用过awk至少要让面试官知道你用过grep,若是都没有用过的话,面试官会怀疑你是否有linux的使用经验程序员
awk是一个文本分析工具,将文件逐行读入,而后默认按空格进行切片,对切开的部分进行单独分析面试
格式是awk [options] '{command}' filename
,如awk '{print $1}' out.txt
,其中$1
表明第1列,awk会默认按照分隔符来切分每一行算法
分隔符也能够经过在awk后使用-F来指定,如awk -F ':' '{ print $1 }' out.txt
spring
本题主要考察你是否有考虑过度表以后的事情,而不是仅仅背了几道面试题,说出聚合操做后这道题基本就经过了sql
若是查询单条记录,能够根据查询条件和分表规则找到对应的表,而后进行查询并返回结果数据库
若是查询多条记录,则分开查询,将全部查询结果作聚合,将聚合后的结果返回编程
select *** from *** limit offset, rows
会有什么问题,怎么解决本题主要考察数据库查询优化的知识,至少要能给出两种解决方案,并说出其各自的优缺点
存在问题:当offset很大时,查询效率会下降,由于mysql并不能直接定位到offset处进行查询,而是查询前offset+rows
行,而后只取后rows条数据,将前面的数据舍弃,因此效率会很低
解决方案:
limit offset, rows
删去,使用where 主键 > offset limit rows
代替,可是使用前提是没有其余where条件对数据进行过滤本题主要考察一些语言层面上的知识,若是知道泛型是语法糖的话,这个问题也能很容易回答出来
Java中final和private、泛型同样,都是一种编程约束,编译器会检查final修饰的变量是否被从新赋值等,在编译后与普通变量没有区别
本题主要考察对Java语言的熟悉程度,能所有说正确固然最好,至少也得要能说出JVM是解释器,Java是解释型语言
Java既是解释型语言也是编译型语言。Java代码须要通过javac编译器编译成class文件,交给JVM进行解释执行,为了加快执行效率,同时Java引入JIT编译技术(Just-in-Time Compile,即时编译技术),将部分热点代码编译成机器码优化执行
本题主要考察对Java优化技术的了解程度,属于加分项,回答好的话能给面试官留下深入印象
Java引入JIT技术后,会将热点代码编译成本地机器相关的机器码,编译时会进行相应的优化,逃逸分析就是JIT优化的基础
一个对象在方法中被定义后,若是被外部方法所引用,好比经过参数传递给其余方法,就叫作(方法)逃逸。一样地,若是一个对象能被其余线程访问到,也叫作逃逸。逃逸分析就是来分析对象是否发生了逃逸,经过逃逸分析,Java编译器能够分析出一个对象的使用范围
当JIT使用逃逸分析时,能够执行相应的优化策略:
逃逸分析这项技术至今仍不成熟,没法保证逃逸分析所提升的运行效率能超过它的性能损耗,可是逃逸分析依然是JIT编译器优化技术中一个重要手段
本题主要考察对TCP协议的了解程度,能回答出来TCP这块基本就不会再问了。通常TCP部分的问题深度由浅至深分别是:TCP/UDP区别 => 三次握手与四次挥手 => 流量控制和拥塞控制 => TCP优化技术与常见问题,必需要作好准备
粘包问题有两种常见状况:
解决方案有两种,一种是只发送固定长度的包,另外一种是在发送消息时带上消息的长度,同时使用特殊标记来标记消息边界
本题考察的是你的思考能力,若是这题答得很差会给面试官留下只会背题的印象,此题不难,即便不知道答案只要给出本身的想法便可,重点是联系到索引的数据结构上
由于innodb索引采用b+树的结构存储,避免插入非规律主键的数据时,致使页分裂
本题考察对JVM知识的掌握程度,虽然本题应用意义不大,可是能很好地考察出被面试者对JVM底层原理的了解状况
抽象方法调用速度快,由于抽象类属于实现类的父类,抽象方法的实现属于方法覆写,能够直接根据偏移量来定位方法,而接口则只能经过遍从来找
String a1 = new String("a") + new String("a"); // 1
a1.intern(); // 2
String a2 = "aa"; // 3
System.out.println(a1 == a2);
// -------------------------------------
String b1 = new String("b") + new String("b"); // 4
String b2 = "bb"; // 5
b1.intern(); // 6
System.out.println(b1 == b2);
复制代码
本题考察的是面试者对String的理解深度,此题的要点就是能答出intern方法的实现原理,可以彻底答对很是难,基本能打趴绝大多数面试者,可以回答出来讲明对JVM的常量池很熟悉,绝对是一个加分项,不过遗憾的是基本没有面试官会问这么深
在jdk1.7以前,返回false false
[1],在jdk1.7及以后的jdk版本中,返回true false
为何在jdk1.7以前返回false false
:
代码1
在堆中建立了“aa”字符串对象,池中没有“aa”字符串对象;代码2
发现常量池中没有“aa”对象,则在池中建立“aa”对象;代码3
发现池中存在“aa”对象,直接返回常量池中对象的引用;此时,a1为堆中字符串对象引用,a2为常量池中字符串对象引用,显然指向的不是同一个对象代码4
在堆中建立了“bb”字符串对象,池中没有“bb”字符串对象;代码5
发现池中没有“bb”对象,则在池中建立“bb”对象;代码6
发现常量池中存在“bb”对象,不执行操做;此时,b1为堆中字符串对象引用,b2为常量池中字符串对象引用,显然指向的不是同一个对象为何在jdk1.7及以后返回true false
:
代码1
在堆中建立了“aa”字符串对象,池中没有“aa”字符串对象;代码2
发现常量池中不存在“aa”对象,则检查Java堆,发现存在“aa”对象,则将堆中该对象的引用添加到常量池中;代码3
发现常量池中存在“aa”对象的引用,则返回该引用;此时,a1为堆中对象的引用,a2也为堆中该对象的引用,指向的是同一对象代码4/5/6
与jdk1.6中的原理彻底一致,就再也不赘述了本题考察的是对ConcurrentHashMap源码熟悉程度,答题要点是分区间处理和单节点加锁。若是是考察HashMap的扩容,则答题要点是先建立新数组,再拷贝原数据
本题主要考察面试者的技术视野,是否仅仅关注本身眼前的技术。这种就属于概念性的问题,能说多少说多少,没有标准答案,能体现出本身有了解过大体的概念便可。这两个问题自己没有太大关联,可是由于都属于这一类问题,不想再单独列出来,就直接放在一块儿了
本题主要考察面试者是否对本身使用的工具备过思考,可以知道“为何用”,一个工程师至少要清楚本身使用工具的场景,而不能是稀里糊涂的“有就用”
本题考察的是面试者对线程安全(特指volatile部分)的掌握程度,若是认真看过JUC包下的源码,就必定会了解到伪共享的概念。不过本题属于加分项,即使不知道也没有太大影响
伪共享指的是两个volatile类型的数据在同一个缓存行中,因为volatile每次都会刷新缓存行,因此致使缓存行没有彻底发挥出做用,导致性能浪费
能够经过在对象或字段的先后加padding,也可使用@sun.misc.Contended
注解(其原理是在对象或字段先后加上128位的padding)
本题主要考察对Springboot的了解程度,答题要点是设置监听器和加载上下文,若是这题没答上来或没答好面试官可能会问IoC和AOP原理相关的问题,因此至少有一个要很是熟悉
@SpringbootApplication
复合了一些注解:@SpringBootConfiguration
:声明该类为配置类@EnableAutoConfiguration
:启用自动配置,原理是使用AutoConfigurationImportSelector类,将全部配置类加载到容器中,并扫描配置文件,将配置项经过反射实例化为配置类,汇总以后加载到容器中@ComponentScan
:自动扫描包下的bean本题主要考察对适配器这种设计模式的掌握程度,如今不少人为了突击面试,设计模式只看过单例和工厂两种,若是问到其余设计模式答不上来,会在面试官的心中大打折扣
应用场景:
应用实例:
本题主要考察面试者是否真正用过CountDownLatch,是否在使用时有考虑过风险。与此题相似的问题还有:
ThreadLocal
使用时须要注意什么,SimpleDateFormat
在多线程下使用有什么风险等
若是执行countDown的线程发生异常,则await()方法会被阻塞。因此要设置超时时间,因此要使用await(timeout, unit)
方法
本题主要考察对zookeeper的掌握程度,能说出一种工具的优势很容易,有时候编也能编个差很少,可是想说出来缺点就须要对它有至关的了解才行。若是是校招的话通常不会问这么深,回答不上来也不用太紧张,可是必定要勇于说出来本身的看法,即便是错的
客户端:
服务端:
本题考察的是对Java语言的理解程度,这个问题几乎没见过有面试官问过,问题自己的价值也不是很大,若是答不上来也没有太大关系,不过确实能反应出面试者对语言的认识程度
JVM会把全部的基本数据类型看成对象处理,JVM有9种设定好的Class对象来对应基本数据类型和void关键字,这些对象都是JVM建立的
除了基本类型以外,枚举也是一种类,注解属于一种特殊的接口,数组也是Object的子类,可是对程序员是透明的
勘误:使用openjdk6测试发现输出依然是true false
,此题有待进一步研究 ↩︎