面试题整理
Posted Happy王子乐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题整理相关的知识,希望对你有一定的参考价值。
java基础:
0、synchornized和volatile的区别,以及如何使用?
1、synchornized与lock区别?
2、volatile关键字有什么用处?
3、HashMap底层数据结构是什么?扩容机制是如何实现的?HashMap怎么解决碰撞问题的?
4、设计模式有哪些?你实际使用过哪些?
5、ConcurrentHashMap 底层如何实现的?
6、ArrayList ,Vector,LinkedList 区别?
7、注解的原理是什么?
8、java中有哪些集合类?
8、创建线程的方式有哪些?
9、线程池的几个核心参数是什么?
10、线程池中线程数量变多,说下运行的过程?
11、如何配置线程池参数?
12、讲一下jvm内存模型?
13、Java内存区域和内存模型二者区别?
14、什么是双亲委派机制?
15、JVM内存溢出了,如何排查问题?
16、常见的垃圾回收器有哪些?cms和G1区别?
17、怎么做JVM调优?
18、怎么理解分布式和微服务,为什么要拆分服务,会产生什么问题,怎么解决这些问题?
19、怎么理解幂等性,有遇到过实际场景么,怎么解决的,为什么用redis,redis过期了或者数据没了怎么办
20、kafka是怎么保证高可用性的,讲讲它的设计架构,为什么读写都在主分区,这样有什么优缺点
21、Linux如何查看日志,为什么?
22、反爬虫的机制,有哪些方式?
23、负载均衡怎么做的呢,有哪些策略?
24、讲一下常见编码方式?
25、utf-8编码中的中文占几个字节;int型几个字节?
26、静态代理和动态代理的区别,什么场景使用?
27、Java中实现多态的机制是什么?
28、什么是深拷贝和浅拷贝?
29、死锁的四个必要条件?
30、怎么避免死锁?
31、断点续传的实现?
32、什么是 java 序列化?什么情况下需要序列化?
33、throw 和 throws 的区别?
开源框架:
1、spring中IOC和AOP怎么理解?分别用了哪些设计模式?
2、简要描述Spring Bean生命周期?
3、BeanFactory&FacotryBean的区别?
4、Spring Cloud组件有哪些,自己对哪个最了解,讲解一下?
5、Spring是如何解决循环依赖的问题的?比如A autowired B,Bautowired A,内部是如何是如何实现的?
6、自定义注解?
数据库:
1、简要描述SQL语句执行过程?
2、mysql的索引引擎、存储引擎,有哪些,有什么区别?
3、sql优化思路?
4、最左前缀原则是什么?
5、mysql持久化机制是什么?
6、binlog、redolog、undolog,有什么区别?
7、是否用过分库分表,主流分库分表中间件是如何选型的?
8、添加索引的缺点?
9、亿级的数据必须使用like进行查询,如何优化?
10、回表的概念?
11、InnoDb的事务隔离级别?
12、MySql的锁有哪些?
8、redis为什么这么快?
9、Redis的5种基础数据类型及其对应数据结构?
10、redis和memcached、mongodb的区别
11、缓存雪崩、缓存穿透、缓存击穿,概念是什么,如何解决呢?
12、怎么保证缓存和数据库中的数据的一致性?
13、Redis持久化机制有哪些?
14、AOF和RDB区别?AOF和RDB都如何使用?
15、redis的高级用法了解哪些,都用在什么场景?
16、redis的缓存淘汰机制?
17、分布式锁如何实现?
18、如何使用Redis处理热点数据?
数据结构:
1、有哪些常见的树形结构?分别属于二叉树还是多叉树?
2、红黑树有什么特点?
3、B树有什么特点?
4、B+树有什么特点?
5、树、链表、数组,查询时间复杂度分别是多少?
网络协议:
1、网址栏输入网址,按下回车之后发生了什么?
2、三次握手的过程?
3、session 和 cookie 有什么区别?
4、说一下 session 的工作原理?
5、什么是 XSS 攻击,如何避免?
6、什么是 CSRF 攻击,如何避免?
7、为什么不建议使用长链接?使用大量长连接,会有什么问题?
8、七层模型都有哪些?四层模型有哪些?五层模型有哪些?
9、get 和 post 请求有哪些区别?
10、如何实现跨域?
中间件:
1、Apollo有接触吗?
2、ElasticJob有接触吗?
3、MyCat有了解吗?
4、sharding-jdbc有了解吗,它和MyCat有什么区别?
项目设计:
1、设计一个"微信摇一摇"模块,讲一下需要记录什么数据,使用什么技术实现?
2、设计一个"秒杀系统",讲一下如何实现,使用哪些技术,有什么注意点?
3、设计一个"社交模块",要求能够实现A的好友圈,与B的好友圈,进行交集,查询共同好友,讲下大致思路?
4、设计一个"电梯模型系统",全市包括"住宅"、“公寓”、"写字楼"等建筑,安装电梯时,需要进行参数计算,使用开发的系统进行相关数据统计,使全市电梯耗能最低。将一些需要收集哪些数据?
其他:
1、你项目有什么难点?
2、最近有在学习什么?有没有学习规划?
3、对哪块源码感兴趣呢?
4、用几个关键词形容下自己?
5、你是怎么针对面试,进行查漏补缺的?
6、你觉得哪些特质适合这个岗位?
7、有过这类软件的开发经验吗?
8、如果面试通过了,会有顾虑不接受offer吗?
9、对个人薪资,有什么期望?
MySQL思考问题:
1、MySQL 建立了业务字段索引,也建立了主键字段索引,当没命中任何一个索引时,查询的数据是怎么获取的呢?(查询不走索引就是遍历主B+树)
2、“N叉树”的N值在MySQL中是可以被人工调整的么?(5.6以后可以通过page大小来间接控制)
3、没有主键的表,有一个普通索引。怎么回表?(没有主键的表,innodb会给默认创建一个Rowid做主键,rowid就是聚集索引)
4、查看索引数的结构,比如多少个层,多少节点?(如果要精确的,就要解数据文件,这个工具可以看看 https://github.com/jeremycole/innodb_diagrams)
5、页分裂的概念,当主键自增时,为什么不会出现页分裂?(往后追加就好了)
6、在建立联合索引的时候,如何安排索引内的字段顺序(我们的评估标准是,1、索引的复用能力;2、考虑的原则就是空间)
7、索引下推和回表,有什么区别?(“select * from tuser where name like ‘张%’ and age=10 and ismale=1” MySQL 5.6之前,建立联合索引后,通过索引下推,需要根据业务索引找到主键id,再校验age是否等于10;MySQL 5.6 引入的索引下推优化,在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数)
8、事务隔离 -> 事务回滚记录 -> 为什么建议你尽量不要使用长事务(1、事务回滚记录过大,占用空间;2、占用锁资源,也可能拖垮整个库)
9、InnoDB搜索引擎下,更新一条单表SQL,记录日志操作几次磁盘?批量更新一批单表数据,操作几次磁盘?(3次redolog两次 binlog 1次;并发更新的时候会合并写)
10、物理日志redo log和逻辑日志binlog,其中的“物理”、“逻辑”如何理解?(逻辑日志可以给别的数据库,别的引擎使用,已经大家都讲得通这个“逻辑”;物理日志就只有“我”自己能用,别人没有共享我的“物理格式”;)
11、数据库锁分类(全局锁、表级锁、行级锁;全局锁就是对整个数据库实例加锁,全局锁的典型使用场景是,做全库逻辑备份)
12、要删除一个表里面的前10000行数据,有以下三种方法可以做到,你会选择哪一种方法呢?为什么呢?(选第二种,第一种容易引起长事务,第三种容易引起锁冲突)
第一种,直接执行delete from T limit 10000;
第二种,在一个连接中循环执行20次 delete from T limit 500;
第三种,在20个连接中同时执行delete from T limit 500。
13、优化器选择问题,select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 1;索引两个单字段:a、b。如何解决优化器选择索引问题?(1、采用force index强行选择一个索引;2、把“order by b limit 1” 改成 “order by b,a limit 1”;3、删掉索引b)
14、InnoDB的redo log写满了,会出现什么现象?(更新数据暂停,将redo log中数据,处理一部分,留出部分空间再继续进行,业务感受是有几率性的;)
15、为什么用B+树,不用B树?1、页大小 -> 引发树高;2、B+树不高,稳定性更好;3、链表结构,页加载过程,是加载前一页&后一页,速度比较快;
Java笔试面试题整理第一波
(本系列同步更新于 个人博客小站)本系列整理Java相关的笔试面试知识点。其它几篇文章例如以下:
1、Java变量
Java中主要有例如以下几种类型的变量- 局部变量
- 类变量(静态变量)-- 属于类
- 成员变量(非静态变量)-- 属于对象
2、关于枚举
public class EnumTest {
/**
* 颜色枚举
*/
enum ColorEnum{
RED,
GREEN,
BLUE
}
/**
* 性别枚举
* 可用中文字符。不能单独使用数字
* (枚举值组成:字母、下划线)
*/
enum SexEnum{
男,
女,
MAN,
WOWAM
}
3、訪问控制修饰符
修饰符 | 说明 |
---|---|
private | 私有的,在同一类内可见。 |
默认没写 | 在同一包(包含子类和非子类)内可见。 默认不使用不论什么修饰符。 |
protected | 受保护的。对同一包内的类和全部子类可见。 |
public | 共同拥有的。对全部类可见。 |
主要是默认和protected这两个修饰符,总结起来就是:
(1)这里的可见、可訪问指的是能不能通过 ”类的对象.变量名“的方式訪问,这是由于除static声明的变量属于类变量外,其它的都属于实例变量,是属于某个对象的。
4、UTF-8和GBK编码转换
byte
[] src,dst;
A、dst=String.fromBytes(src,"GBK").getBytes("UTF-8")
B、dst=new String(src,"GBK").getBytes("UTF-8")
C、dst=new String("GBK",src).getBytes()
D、dst=String.encode(String.decode(src,"GBK")),"UTF-8" )
5、try、catch、finally运行顺序问题
1 2 3 4 5 6 7 8 9 | public static int func (){ try { return 1; } catch (Exception e){ return 2; }finally{ return 3; } } |
6、静态代码块、子类、父类初始化顺序
7、关于null对象、static变量和方法
1 2 3 4 5 6 7 8 | public class TestClass { private static void testMethod(){ System.out.println( "testMethod" ); } public static void main(String[] args) { ((TestClass) null ).testMethod(); } } |
B、编译通过,运行异常。报NullPointerException
C、编译通过,运行异常,报IllegalArgumentException
D、编译通过。运行异常,报NoSuchMethodException
E、编译通过,运行异常,报Exception
F、运行正常,输出testMethod
当我们通过类的实例来调用时,最后实际上还是将对象实例转换成了类去掉用该静态方法,所以这里的null仅仅是迷惑大家的跟它没有什么关系。
((TestClass)
null
).testMethod();
也能够写成TestClass t = null; t.testMethod();相同能够正确输出。null能够被强制转换成随意类型对象,尽管这个时候t被赋为了空,但这个“空对象”也是属于TestClass的,那么这个“空对象”也就能够去堆上的静态方法区调用testMethod()方法了。比方TestClass 中有例如以下变量:private static String str = "abc"; 我们通过TestClass t = null; System.out.println(t.str);相同能够正确输出。
8、关于线程启动
例如以下:
9、关于内部类
1 2 3 4 | public class OuterClass{ private float f=1.0f; //插入代码到这里 } |
A、class InnerClass{ public static float func(){return f;} }
B、abstract class InnerClass{ public abstract float func(){} }
C、static class InnerClass{ protected static float func(){return f;} }
D、public class InnerClass{ static float func(){return f;} }
10、Final修饰符、volatile修饰符
也就是说final对象的引用不能改变。可是里面的值能够改变。比方:
Final修饰的方法能够被子类继承,可是不能被子类改动(重写)。
声明final方法的主要目的是防止该方法的内容被改动。
volatile修饰符,Volatile修饰的成员变量在每次被线程訪问时。都强迫从共享内存中重读该成员变量的值。
而且,当成员变量发生变化时。强迫线程将变化值回写到共享内存。
这样在不论什么时刻。两个不同的线程总是看到某个成员变量的同一个值。
一个volatile对象引用可能是null。
11、StringBuffer 和 StringBuilder
StringBuilder类和StringBuffer之间的最大不同在于StringBuilder的方法不是线程安全的(不能同步訪问)。
由于StringBuilder相较于StringBuffer有速度优势。所以多数情况下建议使用StringBuilder类。
然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。
12、可变參数
13、关于异常分类
全部的异常类是从java.lang.Exception类继承的子类。
Exception类是Throwable类的子类。
除了Exception类外,Throwable另一个子类Error 。
Error用来指示运行时环境发生的错误。层次关系如图:
检查性异常: 不处理编译不能通过
非检查性异常:不处理编译能够通过。假设有抛出直接抛到控制台。RuntimeException类的就是非检查性异常
运行时异常(RuntimeException): 继承自
非运行时异常: 就是检查性异常
以下的表中列出了Java的非检查性异常(RuntimeException)。
异常 | 描写叙述 |
---|---|
ArithmeticException | 当出现异常的运算条件时。抛出此异常。 比如,一个整数"除以零"时。抛出此类的一个实例。 |
ArrayIndexOutOfBoundsException | 用非法索引訪问数组时抛出的异常。假设索引为负或大于等于数组大小,则该索引为非法索引。 |
ArrayStoreException | 试图将错误类型的对象存储到一个对象数组时抛出的异常。 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时。抛出该异常。 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不对的參数。 |
IllegalMonitorStateException | 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其它正在等待对象的监视器而本身没有指定监视器的线程。 |
IllegalStateException | 在非法或不适当的时间调用方法时产生的信号。换句话说。即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求操作所要求的适当状态时抛出的异常。 |
IndexOutOfBoundsException | 指示某排序索引(比如对数组、字符串或向量的排序)超出范围时抛出。 |
NegativeArraySizeException | 假设应用程序试图创建大小为负的数组,则抛出该异常。 |
NullPointerException | 当应用程序试图在须要对象的地方使用 null 时,抛出该异常 |
NumberFormatException | 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 |
SecurityException | 由安全管理器抛出的异常,指示存在安全侵犯。 |
StringIndexOutOfBoundsException | 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 |
UnsupportedOperationException | 当不支持请求的操作时,抛出该异常。 |
以下的表中列出了Java定义在java.lang包中的检查性异常类。
异常 | 描写叙述 |
---|---|
ClassNotFoundException | 应用程序试图载入类时。找不到相应的类,抛出该异常。 |
CloneNotSupportedException | 当调用 Object 类中的 clone 方法克隆对象。但该对象的类无法实现 Cloneable 接口时,抛出该异常。 |
IllegalAccessException | 拒绝訪问一个类的时候。抛出该异常。 |
InstantiationException | 当试图使用 Class 类中的 newInstance 方法创建一个类的实例。而指定的类对象由于是一个接口或是一个抽象类而无法实例化时。抛出该异常。 |
InterruptedException | 一个线程被另一个线程中断,抛出该异常。 |
NoSuchFieldException | 请求的变量不存在 |
NoSuchMethodException | 请求的方法不存在 |
其它
A、通过 ClassLoader 寻找和装载 class 文件
B、解释字节码成为指令并运行。提供 class 文件的运行环境
C、进行运行期间垃圾回收
D、提供与硬件交互的平台
B、线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,仅仅要线程是活动的而且 ThreadLocal 实例是可訪问的;在线程消失之后。其线程局部实例的全部副本都会被垃圾回收
C、在Thread类中有一个Map,用于存储每个线程的变量的副本。
B、Vector
C、Hashtable
D、Stack
在集合框架中。有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许很多多非线程安全的类。 以下是这些线程安全的同步的类:
vector:比arraylist多了个同步化机制(线程安全)。由于效率较低,如今已经不太建议使用。在web应用中。特别是前台页面,往往效率(页面响应速度)是优先考虑的。
statck:堆栈类,继承了Vector
hashtable:比hashmap多了个线程安全
enumeration:枚举,相当于迭代器
除了这些之外,其它的都是非线程安全的类和接口。比方经常使用的ArrayList、HashMap都是线程不安全的。
以上是关于面试题整理的主要内容,如果未能解决你的问题,请参考以下文章
精心整理全网最全Tomcat面试专题及答案tomcat面试看这篇就够了!(共19题,含答案解析)
2022Android面试题合集最新整理版,移动开发架构师筑基必备