JAVA面试知识点1
1.1、Java基础
-
面向对象的特征:继承、封装和多态
-
可参考这一篇文章:https://blog.csdn.net/ztj111/article/details/1854611
-
final, finally, finalize 的区别
-
1、final修饰符(关键字)。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用,不能重载。
-
2、finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。
-
3、finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
-
Exception、Error、运行时异常与一般异常有何异同
-
1、Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出).假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的.
-
2、Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误.但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。
-
请写出5种常见到的runtime exception
-
常见的RuntimeException(运行时异常):
IndexOutOfBoundsException(下标越界异常)
NullPointerException(空指针异常)
NumberFormatException (String转换为指定的数字类型异常)
ArithmeticException -(算术运算异常 如除数为0)
ArrayStoreException - (向数组中存放与声明类型不兼容对象异常)
SecurityException -(安全异常)
IOException(其他异常)
FileNotFoundException(文件未找到异常。)
IOException(操作输入流和输出流时可能出现的异常。)
EOFException (文件已结束异常) -
int 和 Integer 有什么区别,Integer的值缓存范围
-
Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。integer缓存范围为-128-127。
-
Integer i4 = 127;//编译时被翻译成:Integer i4 = Integer.valueOf(127);
-
Integer i5 = 127;
-
System.out.println(i4 == i5);//true
-
Integer i6 = 128;
-
Integer i7 = 128;
-
System.out.println(i6 == i7);//false
-
-
包装类,装箱和拆箱
-
我们都知道,Java中有一个系统类型由两部分组成,包含基本类型(primitive),例如int、float、double等,和引用类型(reference type),如String和List。而基本数据类型是不具备对象特征的,每个基本类型都有一个对应的引用类型,称作是装箱基本类型(boxed primitive)或包装类。而基本类与包装类的关系如下表:
包装类主要提供了两大类方法:
1. 将本类型和其他基本类型进行转换的方法
2. 将字符串和本类型及包装类互相转换的方法以Integer为例(其他包装类类似)说明这两种转换:
而自从JDK1.5以后Java中引入了自动拆箱和装箱的机制,包装类和基本类型之间的转换就更加轻松便利了。
装箱:把基本类型转换成包装类,使其具有对象的性质,又可分为手动装箱和自动装箱
拆箱:和装箱相反,把包装类对象转换成基本类型的值,又可分为手动拆箱和自动拆箱
实际上基本类型和装箱基本类型之间还有很大的区别的,这些区别容易导致一些麻烦
-
String、StringBuilder、StringBuffer
-
重载和重写的区别
-
override(重写)
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载)
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
-
抽象类和接口有什么区别
-
抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板
-
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情
1 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
2 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
3接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。
4 接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。
5 接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
6 接口里不能包含初始化块,但抽象类里完全可以包含初始化块。
7一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。
-
说说反射的用途及实现
-
Java反射机制主要提供了以下功能:在运行时构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。反射最大的应用就是框架
- 确定一个对象的类
- 取出类的modifiers,数据成员,方法,构造器,和超类.
- 找出某个接口里定义的常量和方法说明.
- 创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).
- 取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
- 在运行时刻调用动态对象的方法.
- 创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.
- 参考:https://blog.csdn.net/cbjcry/article/details/70154810
-
说说自定义注解的场景及实现
- 类属性自动赋值。
- 验证对象属性完整性。
- 代替配置文件功能,像spring基于注解的配置。
- 可以生成文档,像java代码注释中的@see,@param等
- 参考https://blog.csdn.net/bluuusea/article/details/79996572
-
HTTP请求的GET与POST方式的区别
-
安全,效率,请求报文次数,参数大小,编码格式等...
-
参考:https://blog.csdn.net/qq_26360877/article/details/70665820
-
-
Session与Cookie区别
-
安全,位置,效率,机制
-
https://blog.csdn.net/weixin_37196194/article/details/55806366
-
列出自己常用的JDK包
-
java.lang/io/util/math/text/sql/nio/awt
-
MVC设计思想
-
mvc(model view controller)
mvc是一种软件架构的思想,将一个软件按照模型、视图、控制器进行划分。其中,模型用来封装业务逻辑,视图用来实现表示逻辑,控制器用来协调模型与视图(视图要通过控制器来调用模型,模型返回的处理结果也要先交给控制器,由控制器来选择合适的视图来显示 处理结果)。
1)模型: 业务逻辑包含了业务数据的加工与处理以及相应的基础服务(为了保证业务逻辑能够正常进行的事务、安全、权限、日志等等的功能模块)
2)视图:展现模型处理的结果;另外,还要提供相应的操作界面,方便用户使用。3)控制器:视图发请求给控制器,由控制器来选择相应的模型来处理;模型返回的结果给控制器,由控制器选择合适的视图
-
参考:https://blog.csdn.net/daijin888888/article/details/51169156
-
equals与==的区别
-
“==”比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】
equal用于比较两个对象的值是否相同【不是比地址】
【特别注意】Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。
"=="比"equal"运行速度快,因为"=="只是比较引用. -
hashCode和equals方法的区别与联系
-
参考:https://blog.csdn.net/suyebiubiu/article/details/78781141
-
什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用
-
Object类中常见的方法,为什么wait notify会放在Object里边?
1、toString(),equals(),hashCode()
https://blog.csdn.net/tomcmd/article/details/54895935
2、因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。
-
Java的平台无关性如何体现出来的
-
JDK和JRE的区别
-
参考:https://blog.csdn.net/u012491783/article/details/51961273
-
Java 8有哪些新特性
-
十大新特性:https://blog.csdn.net/u014470581/article/details/54944384
1.2、Java常见集合
-
List 和 Set 、Map 区别
-
Set和hashCode以及equals方法的联系
-
sethash 是一个无序不重复的集合,sethash根据hashCode返回值和equals来判断两个对象是否相同
-
参考:https://blog.csdn.net/w3045872817/article/details/73294491
-
ArrayList,LinkedList, Vector 区别
-
参考:https://blog.csdn.net/Li_lingxiao/article/details/78299550
-
HashMap 和 Hashtable,HashSet.,ConcurrentHashMap 的区别
-
HashMap null可以作为键,线程不安全,判断是否存在某个键需要用containsKey();Hashtable 线程安全,无论是key还是value都不能为null
-
参考:https://blog.csdn.net/universe_ant/article/details/58661724
-
HashMap 的工作原理及代码实现,什么时候用到红黑树
-
参考:https://blog.csdn.net/yinbingqiu/article/details/60965080
-
多线程情况下HashMap死循环的问题
-
讲的不错:https://blog.csdn.net/linsongbin1/article/details/54708694
-
HashMap出现Hash DOS攻击的问题
-
ConcurrentHashMap 的工作原理及代码实现,如何统计所有的元素个数
-
手写简单的HashMap
-
https://blog.csdn.net/lishaoran369/article/details/61920036 //自己动手写一下
-
看过那些Java集合类的源码
-
ArrayList,HashMap,LinkedList,List,Map and so on 自己多研究
1.3、进程和线程
-
线程和进程的概念、并行和并发的概念
-
创建线程的方式及实现
-
进程间通信的方式
-
说说 CountDownLatch、CyclicBarrier 原理和区别
-
说说 Semaphore 原理
-
说说 Exchanger 原理
-
ThreadLocal 原理分析,ThreadLocal为什么会出现OOM,出现的深层次原理
-
讲讲线程池的实现原理
-
线程池的几种实现方式
-
线程的生命周期,状态是如何转移的
-
可参考:《Java多线程编程核心技术》
1.4、锁机制
-
说说线程安全问题,什么是线程安全,如何保证线程安全
-
重入锁的概念,重入锁为什么可以防止死锁
-
产生死锁的四个条件(互斥、请求与保持、不剥夺、循环等待)
-
如何检查死锁(通过jConsole检查死锁)
-
volatile 实现原理(禁止指令重排、刷新内存)
-
synchronized 实现原理(对象监视器)
-
synchronized 与 lock 的区别
-
AQS同步队列
-
CAS无锁的概念、乐观锁和悲观锁
-
常见的原子操作类
-
什么是ABA问题,出现ABA问题JDK是如何解决的
-
乐观锁的业务场景及实现方式
-
Java 8并法包下常见的并发类
-
偏向锁、轻量级锁、重量级锁、自旋锁的概念
-
可参考:《Java多线程编程核心技术》
1.5、JVM
-
JVM运行时内存区域划分
-
内存溢出OOM和堆栈溢出SOE的示例及原因、如何排查与解决
-
如何判断对象是否可以回收或存活
-
常见的GC回收算法及其含义
-
常见的JVM性能监控和故障处理工具类:jps、jstat、jmap、jinfo、jconsole等
-
JVM如何设置参数
-
JVM性能调优
-
类加载器、双亲委派模型、一个类的生命周期、类是如何加载到JVM中的
-
类加载的过程:加载、验证、准备、解析、初始化
-
强引用、软引用、弱引用、虚引用
-
Java内存模型JMM
1.6、设计模式
-
常见的设计模式
-
设计模式的的六大原则及其含义
-
常见的单例模式以及各种实现方式的优缺点,哪一种最好,手写常见的单利模式
-
设计模式在实际场景中的应用
-
Spring中用到了哪些设计模式
-
MyBatis中用到了哪些设计模式
-
你项目中有使用哪些设计模式
-
说说常用开源框架中设计模式使用分析
-
动态代理很重要!!!
1.7、数据结构
-
树(二叉查找树、平衡二叉树、红黑树、B树、B+树)
-
深度有限算法、广度优先算法
-
克鲁斯卡尔算法、普林母算法、迪克拉斯算法
-
什么是一致性Hash及其原理、Hash环问题
-
常见的排序算法和查找算法:快排、折半查找、堆排序等
1.8、网络/IO基础
-
BIO、NIO、AIO的概念
-
什么是长连接和短连接
-
Http1.0和2.0相比有什么区别,可参考《Http 2.0》
-
Https的基本概念
-
三次握手和四次挥手、为什么挥手需要四次
-
从游览器中输入URL到页面加载的发生了什么?可参考《从输入URL到页面加载发生了什么》
二、数据存储和消息队列
2.1、数据库
-
MySQL 索引使用的注意事项
-
DDL、DML、DCL分别指什么
-
explain命令
-
left join,right join,inner join
-
数据库事物ACID(原子性、一致性、隔离性、持久性)
-
事物的隔离级别(读未提交、读以提交、可重复读、可序列化读)
-
脏读、幻读、不可重复读
-
数据库的几大范式
-
数据库常见的命令
-
说说分库与分表设计
-
分库与分表带来的分布式困境与应对之策(如何解决分布式下的分库分表,全局表?)
-
说说 SQL 优化之道
-
MySQL遇到的死锁问题、如何排查与解决
-
存储引擎的 InnoDB与MyISAM区别,优缺点,使用场景
-
索引类别(B+树索引、全文索引、哈希索引)、索引的原理
-
什么是自适应哈希索引(AHI)
-
为什么要用 B+tree作为MySQL索引的数据结构
-
聚集索引与非聚集索引的区别
-
遇到过索引失效的情况没,什么时候可能会出现,如何解决
-
limit 20000 加载很慢怎么解决
-
如何选择合适的分布式主键方案
-
选择合适的数据存储方案
-
常见的几种分布式ID的设计方案
-
常见的数据库优化方案,在你的项目中数据库如何进行优化的
2.2、Redis
-
Redis 有哪些数据类型,可参考《Redis常见的5种不同的数据类型详解》
-
Redis 内部结构
-
Redis 使用场景
-
Redis 持久化机制,可参考《使用快照和AOF将Redis数据持久化到硬盘中》
-
Redis 集群方案与实现
-
Redis 为什么是单线程的?
-
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
-
使用缓存的合理性问题
-
Redis常见的回收策略
2.3、消息队列
-
消息队列的使用场景
-
消息的重发补偿解决思路
-
消息的幂等性解决思路
-
消息的堆积解决思路
-
自己如何实现消息队列
-
如何保证消息的有序性
三、开源框架和容器
3.1、SSM/Servlet
-
Servlet的生命周期
-
转发与重定向的区别
-
BeanFactory 和 ApplicationContext 有什么区别
-
Spring Bean 的生命周期
-
Spring IOC 如何实现
-
Spring中Bean的作用域,默认的是哪一个
-
说说 Spring AOP、Spring AOP 实现原理
-
动态代理(CGLib 与 JDK)、优缺点、性能对比、如何选择
-
Spring 事务实现方式、事务的传播机制、默认的事务类别
-
Spring 事务底层原理
-
Spring事务失效(事务嵌套),JDK动态代理给Spring事务埋下的坑,可参考《JDK动态代理给Spring事务埋下的坑!》
-
如何自定义注解实现功能
-
Spring MVC 运行流程
-
Spring MVC 启动流程
-
Spring 的单例实现原理
-
Spring 框架中用到了哪些设计模式
-
Spring 其他产品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等)
-
有没有用到Spring Boot,Spring Boot的认识、原理
-
MyBatis的原理
3.2、Netty
-
为什么选择 Netty
-
说说业务中,Netty 的使用场景
-
原生的 NIO 在 JDK 1.7 版本存在 epoll bug
-
什么是TCP 粘包/拆包
-
TCP粘包/拆包的解决办法
-
Netty 线程模型
-
说说 Netty 的零拷贝
-
Netty 内部执行流程
-
Netty 重连实现
-
Kafka零拷贝Zero Copy技术
3.3、Tomcat
-
Tomcat的基础架构(Server、Service、Connector、Container)
-
Tomcat如何加载Servlet的
-
Pipeline-Valve机制
-
可参考:《四张图带你了解Tomcat系统架构!》
四、分布式
4.1、Nginx
-
请解释什么是C10K问题或者知道什么是C10K问题吗?
-
Nginx简介,可参考《Nginx简介》
-
正向代理和反向代理.
-
Nginx几种常见的负载均衡策略
-
Nginx服务器上的Master和Worker进程分别是什么
-
使用“反向代理服务器”的优点是什么?
4.2、分布式其他
-
谈谈业务中使用分布式的场景
-
Session 分布式方案
-
Session 分布式处理
-
分布式锁的应用场景、分布式锁的产生原因、基本概念
-
分布是锁的常见解决方案
-
分布式事务的常见解决方案
-
集群与负载均衡的算法与实现
-
说说分库与分表设计,可参考《数据库分库分表策略的具体实现方案》
-
分库与分表带来的分布式困境与应对之策
4.3、Dubbo
-
什么是Dubbo,可参考《Dubbo入门》
-
什么是RPC、如何实现RPC、RPC 的实现原理,可参考《基于HTTP的RPC实现》
-
Dubbo中的SPI是什么概念
-
Dubbo的基本原理、执行流程
五、微服务
5.1、微服务
-
前后端分离是如何做的?
-
微服务哪些框架
-
Spring Could的常见组件有哪些?可参考《Spring Cloud概述》
-
领域驱动有了解吗?什么是领域驱动模型?充血模型、贫血模型
-
JWT有了解吗,什么是JWT,可参考《前后端分离利器之JWT》
-
你怎么理解 RESTful
-
说说如何设计一个良好的 API
-
如何理解 RESTful API 的幂等性
-
如何保证接口的幂等性
-
说说 CAP 定理、BASE 理论
-
怎么考虑数据一致性问题
-
说说最终一致性的实现方案
-
微服务的优缺点,可参考《微服务批判》
-
微服务与 SOA 的区别
-
如何拆分服务、水平分割、垂直分割
-
如何应对微服务的链式调用异常
-
如何快速追踪与定位问题
-
如何保证微服务的安全、认证
5.2、安全问题
-
如何防范常见的Web攻击、如何方式SQL注入
-
服务端通信安全攻防
-
HTTPS原理剖析、降级攻击、HTTP与HTTPS的对比
5.3、性能优化
-
性能指标有哪些
-
如何发现性能瓶颈
-
性能调优的常见手段
-
说说你在项目中如何进行性能调优
六、其他
6.1、设计能力
-
说说你在项目中使用过的UML图
-
你如何考虑组件化、服务化、系统拆分
-
秒杀场景如何设计
6.2、业务工程
-
说说你的开发流程、如何进行自动化部署的
-
你和团队是如何沟通的
-
你如何进行代码评审
-
说说你对技术与业务的理解
-
说说你在项目中遇到感觉最难Bug,是如何解决的
-
介绍一下工作中的一个你认为最有价值的项目,以及在这个过程中的角色、解决的问题、你觉得你们项目还有哪些不足的地方
6.3、软实力
-
说说你的优缺点、亮点
-
说说你最近在看什么书、什么博客、在研究什么新技术、再看那些开源项目的源代码
-
说说你觉得最有意义的技术书籍
-
工作之余做什么事情、平时是如何学习的,怎样提升自己的能力
-
说说个人发展方向方面的思考
-
说说你认为的服务端开发工程师应该具备哪些能力
-
说说你认为的架构师是什么样的,架构师主要做什么
-
如何看待加班的问题