java面试题

最近在杭州面试 整理下遇到的频率比较高的面试题

------我尽量用好背的形式叙述给大家.

1 ) 你们项目中用到了哪些技术?用到的都要说出来(不然他会觉得你会的少,也不要说不会的)

2) spring特性?优点?阐述两种特性?

特性+优点:
1.IOC控制反转
有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
2.依赖注入
控制反转的别名
https://blog.csdn.net/u012561176/article/details/45974315

3) spring加载类有哪些?

单例预加载(默认)
单例懒加载
多例懒加载仅支持懒加载
反射方式加载类

4) AOP哪两种实现方法?哪几种通知?

1.基于XML配置的spring
2.使用注解配置AOP

通知方式:
前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。
正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。
异常返回通知[After throwing advice]:在连接点抛出异常后执行。
返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。
环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行。

5) ioc怎么管理自己的bean?bean的生命周期?ioc最大的优点?

1.使用标签来将一个类配置到IOC容器中

<bean id="student" class="com.cn.cmc.beans.Student" >
   <property name="name" value="叶清逸"></property>
</bean>

2. Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务。
Spring IOC容器对Bean的生命周期进行管理的过程如下:
       1.通过构造器或工厂方法创建Bean实例
       2.为Bean的属性设置值和对其它Bean的引用
       3.调用Bean的初始化方法
       4.Bean可以使用了
       5.当容器关闭时,调用Bean的销毁方法

6) spring用到的设计模式?

1.简单工厂–spring中的BeanFactory就是简单工厂模式的体现
2.工厂方法–工厂方法为了将对象的创建和使用相分离,因为多处调用时调用的是工厂类,所以当需要修改方法时,修改一个类就ok了
3.单例模式–保证一个类仅有一个实例,并提供一个访问它的全局访问点。
4.适配器模式
5.包装器模式
6.代理模式–在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式
7.观察者模式–定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
8.策略模式–spring中在实例化对象的时候
9.模板方法模式
https://www.cnblogs.com/yuefan/p/3763898.html

7) 进程,线程区别?线程的几种实现方式?

进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。
线程:线程是进程中的一个实体,作为系统调度和分派的基本单位。

线程的几种实现方式?
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
3.通过Callable和FutureTask创建线程(多线程的future模式)
4.通过线程池创建线程

8) start和run方法区别?wait和sleep区别?

start和run方法区别?
调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.

wait和sleep区别?
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

9) 死锁,悲观锁,乐观锁:这些问的少

10) springmvc请求流程?

1.用户向服务器发送请求时,请求被Spring 前端控制器DispatcherServlet获取
2.DispatcherServlet对请求URL进行解析得到请求资源标示符(URI)
3.然后把请求路径(URI)交给处理器映射器(HandlerMapping)
4.处理器映射器(HandlerMapping)选择一个适合的处理器适配器(HandlerAdapter),进行处理
5.Handler执行完成后,向前端控制器(DispatcherServlet)返回一个ModelAndView对象(包含视图名或视图名和模型)
6.DispatcherServlet 借助 视图解析器(ViewResoler) 完成逻辑视图名到真实视图对象的解析,转化成正真的视图View.
7.然后再将Model模型中的数据渲染到View上

11) 你熟悉的集合有哪些?map,set,list区别?

1、List–特点
(1).可以允许重复的对象。
(2).可以插入多个null元素。
(3).是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
常用的实现类有:
1.1、ArrayList–底层是采用数组实现的,查找速度非常快,增加和删除操作非常慢
1.2、LinkedList–LinkedList底层是由双向循环链表实现的,查找速度非常慢,增加和删除操作非常快
1.3、Vector–与ArrayList相似,但只有他是同步的,多线程时可用

2、Set–特点
(1).不允许重复对象
(2). 无序容器,你无法保证每个元素的存储顺序
(3). 只允许一个 null 元素
常用的实现类有:
2.1、HashSet
2.2、TreeSet
2.3、SortSet
2.4、LinkedHashSet

3、Map–特点
(1).Map不是collection的子接口或者实现类。Map是一个接口。
(2).Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
(3). Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
常用的实现类有:
3.1、HashMap–无序
3.2、LinkedHashMap
3.3、TreeMap–TreeMap保存了对象的排列次序
3.4、WeakHashMap
3.5、SortedMap

注:List Set 是collection类的子类

12) arraylist和linkedlist区别?

13) hashmap和hashtable区别?

1.Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。
HashMap不是线程安全的,使用HashMap时就必须要自己增加同步处理,但是它的效率比Hashtable要高好多倍。

14) hashmap和hashset区别?

HashSet实现了Set接口,它不允许集合中出现重复元素。
HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许出现重复的键(Key)。且无序,线程不安全

15) hashmap底层怎么实现的?

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

16) 你了解消息队列吗?(rabbitmq说了一下,其他的我也不会)

17) sql怎么优化?

根据 查询优化器,用索引优化器优化索引

18) 说一下表结构?
19) 数据库怎么提高效率?

中间表的形式,正确使用索引 正确的数据过滤顺序 禁止大量的循环操作数据库

20) 怎么处理并发?

21) 大数据库怎么办?

22) 基础的数据结构?

List Set Map

23) redis有几种数据类型?你们用redis做什么?

1.String(字符串)
2.List(列表)
3.Hash(字典)
4.Set(集合)
5.Sorted Set(有序集合)
应用场景:
1.缓存——热数据
2.排行榜–提供的有序集合数据类构能实现各种复杂的排行榜应用。
3.计数器–浏览访问量+1
4.分布式会话
5.分布式锁–并发量高的场合中
实现一个redis分布式锁,来避免这种情况发生,先说说实现思路:
(1),线程请求访问前先调用加锁的方法,加锁就去里生成一个随机数同时保存在线程本地变量和redis的某key中,此key设有效期为200ms,具体值根据业务执行时间自行调整,加锁成功;
(2).其它线程试着访问拿出它本地变量与redis中某key进行比较,如果不一致,则说明有锁,此线程休眠一段时间,再试着加锁;
(3).加锁成功的线程在操作结束后删掉它持有锁(用lua实现,保证原子性,在它比对和删除锁的过程中,其它线程不会加锁成功),让其它线程再次加锁以执行任务;
说明:锁的时间为200ms可预防线程挂掉之后死锁,200ms后会自动释放
锁代码:
片段1:使用redislock 实现lock来复写它的方法
片段2:试着加锁的方法
在这里插入图片描述
片段3:解锁方法,此处首先从线程本地变量获取它的随机数,然后调用lua脚本,与redis中key相比较,如果相同则删除,否则返回0;
在这里插入图片描述
https://www.sohu.com/a/230599858_100091817
6.社交网络
7.最新列表
8.消息系统–实现一个简单的消息队列系统

24) springboot和springmvc区别,优点?

对使用者来说,换用Spring Boot以后,项目初始化方法变了,配置文件变了,另外就是不需要单独安装Tomcat这类容器服务器了,maven打出jar包直接跑起来就是个网站,但你最核心的业务逻辑实现与业务流程实现没有任何变化。
Spring 是一个“引擎”;
Spring MVC 是基于Spring的一个 MVC 框架 ;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

用Spring MVC做项目要写很多配置文件(即XML文件),SpringBoot的目的就是让开发人员从配置文件中解脱出来(即减少配置文件xml的编写),但是SpringBoot还是会有一个叫application.properties的配置文件用来配置项目用到的配置信息

25) 讲一下事务?四个特性?

⑴ 原子性(Atomicity)
⑵ 一致性(Consistency)
⑶ 隔离性(Isolation)
⑷ 持久性(Durability)

26) 4个隔离级别?

① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

注:
(1).脏读
说明:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
解决办法:一个事务要等另一个事务提交后才能读取数据。

(2)不可重复读
说明:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
解决办法:开始读取数据(事务开启)时,不再允许修改操作

(3)虚读(幻读)
说明:幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
解决办法::Serializable 序列化,Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
https://www.cnblogs.com/fjdingsd/p/5273008.html

27) 相对于隔离界别和数据库性能怎么做权衡?(不经常问)

**28) 修饰符权限有哪些?

public
public是访问权限最高的修饰符,可以在不同包,不同类中被访问。
protected
protected能被该类的子类所访问(子类可以和父类不在一个包中)也可以被本包中其他类访问。
default
default只能在本包中被访问。
private
private只能在本类中被访问。在其他类中是不能被访问的。

29) 接口和抽象类区别?(问的多)

1.抽象类是单一继承,接口是多重实现
2.接口中全是抽象方法,抽象类中可以有抽象方法,也可有方法体的方法
3.接口中无构造方法,不可继承,可实现;抽象类可有构造方法,不可被实例化
4.抽象类的抽象方法不能使用private,final,static,方法不能用private,final修饰
5.接口的属性默认是用public,static,final修饰,接口中方法是默认用public,abstract修饰

30) 单例模式有哪些实现?

1.懒汉模式
2.饿汉模式
3.双重检查
4.静态代码块
5.枚举

31) 剖析框架,说一下AOP的底层是怎么实现的?(简答)

1.AOP是一种面向切面编程的思想,底层实现机制AOP的核心是:利用动态代理来实现切面拦截。即在目标类的基础上添加切面逻辑(包括在目标类前执行,在目标类后执行等形式的逻辑代码)
2.如何实现切面逻辑的织入(对就是这个织)呢?其通过两种动态代理来实现拦截切入功能:
(1).jdk动态代理,由java内部的反射机制来实现,反射机制在生成类的过程中比较高效
(2).cglib动态代理,借助ASM来实现,ASM在生成类之后的相关执行过程中比较高效
3.所以是两种方法同时存在.的方式实现AOP的.

注:神马是ASM?
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类
来源: https://blog.csdn.net/zhuoxiuwu/article/details/78619645

32) 说一下你知道的SQL函数.以及定时器,触发器的使用?

33) 说一下你对消息队列的应用?原理?(ActiveMQ)

使用场景
1.异步处理
2.应用解耦
3.流量削锋
4.日志处理
5.消息通讯
使用方法
是一个中间件,即一个软件,通过导入一个jar包,然后配置文件,以像get,set的形式进行储存,和取出,但是他可以慢慢的一点点的取出进行操作.
主要特点是异步处理,主要目的是减少请求响应时间和解耦。所以主要的使用场景就是将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列。同时由于使用了消息队列,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响,即解耦和。

https://www.zhihu.com/question/34243607/answer/58314162
https://blog.csdn.net/kingcat666/article/details/78660535

34) dubbo的工作原理和工作流程?

dubbo是一种分布式服务框架
dubbo 工作原理
第一层:service 层,接口层,给服务提供者和消费者来实现的
第二层:config 层,配置层,主要是对 dubbo 进行各种配置的
第三层:proxy 层,服务代理层,无论是 consumer 还是 provider,dubbo 都会给你生成代理,代理之间进行网络通信
第四层:registry 层,服务注册层,负责服务的注册与发现
第五层:cluster 层,集群层,封装多个服务提供者的路由以及负载均衡,将多个实例组合成一个服务
第六层:monitor 层,监控层,对 rpc 接口的调用次数和调用时间进行监控
第七层:protocal 层,远程调用层,封装 rpc 调用
第八层:exchange 层,信息交换层,封装请求响应模式,同步转异步
第九层:transport 层,网络传输层,抽象 mina 和 netty 为统一接口
第十层:serialize 层,数据序列化层

工作流程
第一步:provider 向注册中心去注册
第二步:consumer 从注册中心订阅服务,注册中心会通知 consumer 注册好的服务
第三步:consumer 调用 provider
第四步:consumer 和 provider 都异步通知监控中心

注:https://www.cnblogs.com/steven520213/p/7606598.html

35) zookeeper的工作原理和工作流程?

1.Zookeeper是什么?ZooKeeper是用来保证数据在集群间的事务性一致,是一个分布式的,开放源码的分布式应用程序协调服务
2.应用场景?Zookeeper主要是用于dubbo框架的注册中心。Dubbo框架的提供者会向Zookeeper下的provider目录注册自己的URL。消费者订阅提供者的注册URL,并在consumer下注册自己的URL,以便在后续执行中调用提供者。消费者获取到URL之后,netty调用提供者提供的服务。提供者若发生了变化会主动通过zookeeper推送给消费者。
3.配置方法
在conf目录下创建一个配置文件zoo.cfg

tickTime=2000  //发送心跳的间隔时间,单位:毫秒
dataDir=/Users/zdandljb/zookeeper/data   //zookeeper保存数据的目录。
clientPort=2181  //客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
initLimit=5  //初始化连接时最长能忍受多少个心跳时间间隔数。
syncLimit=2  //请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,
server.1=server1:2888:3888
server.2=server2:2888:3888
server.3=server3:2888:3888

server.A=B:C:D:其 中
A 是一个数字,表示这个是第几号服务器;
B 是这个服务器的 ip地址;
C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
https://www.cnblogs.com/raphael5200/p/5285380.html

4.工作原理
Zookeeper集群模式至少需要3台主机进行搭建,且必须是奇数,通过选举算法
选举流程
目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:

  1. 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking。
  2. 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
  3. 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为leader,服务器1,2成为follower。
  4. 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为follower。
  5. 服务器5启动,后面的逻辑同服务器4成为follower。

36) nignx的使用?

nginx是一个高性能的HTTP和反向代理服务器,,及电子邮件(IMAP/POP3)代理服务器,同时也是一个非常高效的反向代理、负载平衡服务器。多进程异步非阻塞事件处理机制:运用了epoll模型.
反向代理方式实际上就是一台负责转发的代理 服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的数据。这样说,其实nginx 完成的就是这样的工作。我们让nginx监听一个端口,譬如80端口,但实际上我们转发给在8080端口的tomcat,由它来处理真正的请求,当请求完 成后,tomcat返回,但数据此时没直接返回,而是直接给nginx,由nginx进行返回,这里,我们会以为是nginx进行了处理,但实际上进行处 理的是tomcat。
https://blog.csdn.net/liuhailiuhai12/article/details/75009661

更新中…

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值