你值得拥有的一份面试题
前言:跨度可能有点大希望能帮到你,这也是我曾经的面试过的题目,多看看对你自己的提升有很大的帮助.
1.异常:
异常的体系结构
Throwable
Error Exception
RuntimeException
2.错误和异常的区别
错误通常是指由于硬件环境或者系统原因导致的程序员
通过代码无法解决的问题 相对较严重
异常是指程序运行过程当中出现的例外情况而已
运行时异常和非运行时异常的区别:
非运行时异常在编译的时候就需要进行异常处理
否则编译都无法通过 它们都直接继承 Exception
运行时异常 编译的时候不需要给出解决方案
运行时异常直接体现 它们继承 RuntimeException
异常都是在什么时候出现:
只要是个异常 都一定在运行的时候出现
3:常见的运行时异常:
NullPointerException
ClassCastException
ArrayIndexOutOfBoundsException
StringIndexOutOfBoundsException
IndexOutOfBoundsException
2.设计模式
单例如何写的 private2 + static2 + public
工厂模式 : 连接工厂 CF 会话工厂 SF
代理模式 : SpringAOP 的核心实现 就是依靠动态代理模式
包装模式 : IO 流
策略模式 : 同一个接口 多种不同的实现类 强调 每种实现类提供的算法不同
观察者模式 : 监听器
命令模式 : Struts result
3.类能继承一个类还是多个类
Java 当中的类只支持单根继承
但是 Java 当中的接口支持多重继承
interface A extends B,C,D{…}
class E implements X,Y,Z{…}
4.多线程如何解决并发错误
加锁
语法级别的锁:synchronized
OO 思想的锁:java.util.concurrent.locks.ReentrantLock 可重入锁
5.HashMap Hashtable 的区别?
Hashtable 底层大量的方法使用了 synchronized 所以线程安全
但是效率低
HashMap 底层没有同步机制 所以效率较高 但是多线程的场景下可能出现并发错误
*:java.util.concurrent.ConcurrentHashMap 支持高并发的 HashMap
对于 null 的处理不同
HashMap 无论主键还是值 都可以添加 null 但是之间唯一
Hashtable 无论主键还是值 都不能放 null 否则空指针异常
底层实现分组和散列算法不同
HashMap 默认 16 组 分组组数必须是 2 的 n 次方 &(分组组数-1)
Hashtable 默认 11 个小组 %分组组数
出现的版本不同
HashMap since JDK1.2
Hashtable since JDK1.0
6. 定时任务怎么实现的
- jdk 自带的库中,有两种技术可以实现定时任务:
- 一种是使用 Timer;
- 另外一个则是 ScheduledThreadPoolExecutor;
- 使用 Quartz 框架
附 1:Timer 方式
public class TimerDemo {
public static void main(String[] args) {
//创建定时器对象
Timer timer = new Timer();
//在 2 秒后执行 EtoakTask 类中的 run 方法,后面每 5 秒执行一次
timer.schedule(new EtoakTask(), 2000, 5000);
}
}
class EtoakTask extends TimerTask {
@Override
public void run() {
System.out.println(“hello world”)
7. Spring 整合 Quartz 定时任务的配置
class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.etoak.job.ClusterJob" /> <!-- 持久化任务 --> <property name="durability" value="true" /> <property name="name" value="clusterJob" /> <property name="group" value="group1" /> </bean> <!-- CronTriggerFactoryBean --> <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail" /> <property name="cronExpression" value="0/5 * * * * ?" /> <property name="name" value="clusterTrigger" /> <property name="group" value="group1" /> </bean> <!-- SchedulerFactoryBean --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="trigger" /> </list> </property>忙于采集的蜜蜂,无暇在人前高谈阔论 89 / 92 <property name="configLocation" value="classpath:quartz.properties" /> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="tx" /> <!-- 解决 spring 管理的 bean 无法注入任务类中-->解决方式一 :把 spring ioc 容器放到调度器的容器中(context 中) --> <property name="applicationContextSchedulerContextKey" value="ioc" /> </bean>```
8 消息队列
8.1 消息队列有没有接触过? 简单介绍一下?
了解,消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,
可伸缩和最终一致性架构;
目前使用较多的消息队列有 ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ;
8.2 说一下消息的类型?
点对点 Point To Point(P2P)
发布/订阅 Publish-Subscribe(Pub\Sub)类型
9. 微服务、SpringCloud微服务的框架了解过嘛?谈谈你对微服务的理解?还了解哪些微服
务框架?
了解过,在 xx 项目使用过 Dubbo;在 xx 项目使用过 SpringCloud;
总体来说,微服务是一种架构风格,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合;
对于一个大型复杂的业务系统:
它的业务功能可以拆分为多个独立的服务;
各个服务之间是松耦合的;
通过远程协议进行通信 ( 异步、同步 );
各个微服务均可被独立部署、扩容、升降级。
其它微服务框架还有 Motan、GRPC、Thrift 等;
接下来可能会让你对比一下 Dubbo 和 SpringCloud。
10.你说一下 Dubbo 和 SpringCloud 的区别
由于 Dubbo 出现的比较早,自己接触的比较早,刚开始接触 SpringCloud 的时候,也拿两者进行了对比,但是渐渐发现,
发现两者的对比的本质是 REST 和 RPC 的对比;
- SpringCloud 借助 SpringBoot 提供一套完整的微服务解决方案,而 Dubbo 的定义是一款高性能的 RPC 框架;
- 如果非要对比的话,我捡几个重要的点进行对比一下:
- 在服务调用方式方面,Dubbo 采用 RPC 方式,而 SpringCloud 使用 REST 方式;
- 在注册中心方面,Dubbo 推荐使用 Zookeeper,而 SpringCloud 推荐使用 Eureka;
- 在服务网关方面,Dubbo 没有服务网关,而 SpringCloud 提供了 Zuul 和 Spring cloud gateway;
- 在断路器方面,Dubbo 不太完善,而 SpringCloud 整合了 Hystrix;
- 在分布式配置方面,Dubbo 没有提供,而 SpringCloud 提供了 spring cloud config;
- 在服务跟踪方面,Dubbo 没有提供,而 SpringCloud 提供了 spring cloud sleuth;
等等