Java经典面试题

						面试题总结

一 : 简要概述一下SpringMVC的执行流程
1.客户端通过url发送请求
2.核心控制器Dispather Servlet接收到请求,通过系统自定义的映射器配置找到对应的Handler,并将url映射的控制器Controller返回给核心控制器
3.通过核心控制器找到系统或默认的适配器
4.由适配器调用实现对应接口的处理器并将结果返回给适配器.结果中包含数据模型和视图对象,再由适配器返回给核心控制器
5.核心控制器将获取到的数据和视图结合的对象传递给视图解析器,获取解析得到的结果,并由视图解析器响应给核心控制器
6.核心控制器将结果返回给客户端
二 : 浅谈你对SpringMVC的理解
MVC是 model - view - controller 的简称,即 模型 - 视图 - 控制器,MVC是一种设计模式,它强制的把应用程序的输入,处理,和输出分开.
MVC中的模型,视图,控制器的任务
视图 : 视图是用户看到并与之交互的界面,视图向用户显示相关的数据,并接受用户的输入.视图不进行任何业务逻辑的处理.
模型 : 模型表示业务数据和业务处理,相当于JavaBean.一个模型能为多个视图提供数据,这提高了应用程序的复用性
控制器 : 控制器接收用户的请求并调用相应的模型去处理请求,然后根据处理结果调用相应的视图来显示处理的结果

MVC的处理过程:
首先控制器接收用户的请求,调用相关的模型来进行业务处理,并返回数据给控制器.控制器调用相应的视图来显示处理的结果,并通过视图呈现给用户
三 : 浅谈你对Servlet的理解 :
1.什么是Servlet :
Servlet是一个继承了HTTPServlet的一个类文件,功能是在服务器根据客户端的不同请求给予相应的响应服务.Servlet的运行环境是Tomcat.
2.Servlet的生命周期 :
触发 : url请求触发
加载 : ClassLoader加载相关需要用到的类
实例化 : init()方法传递配置参数,为服务做准备
初始化 : 调用构造方法,创建Servlet类对象
服务 : doGet(),doPost(),Servlet()方法提供服务
退出服务 : destroy()销毁内存中的无用数据
从服务器启动开始,如果没有请求触发的话,就不会有响应的Servlet对象.创建以后到结束,一直都只有一个Servlet对象,以多线程的形式执行,多个请求发送到同一个Servlet类.

四. Spring 的AOP原理解析 :
AOP是面向切面编程,是面向对象(OOP)编程的补充与完善.AOP技术利用一种称为”横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块.将那些与业务无关,却为业务模块所共同调用得到逻辑或责任封装起来,便于 减少系统的重复代码,降低模块间的耦合.
实现AOP的两种方案 :
1.动态代理技术
利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行
2.静态织入 的方式
引入特定的语法创建切面,从而使编译器可以在编译期间织入有关切面的代码

五.HTTPClient跨域请求 :
HTTPclient是由Apache公司提供,他可以获取页面最终的HTML源文件 .直接可以获取页面返回的JSON数据,可以在代码内部模拟发起http请求,将请求的结果捕捉,将获取到的json数据利用JackSonObjectMapper对象把json数据转为java对象.

六.RestFul是什么 :
一种软件架构风格,设计风格.它提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次.更易于实现缓存机制.

七.RestFul的请求方法 :
1.GET请求 : 用于查询数据,不会影响当前资源的内容.
2.PUT请求 : 用于修改数据,不会增加数据的种类.
3.POST请求 : 用于提交数据,请求会改变数据的种类
4.DELETE请求 : 用于删除数据
5.HEAD请求 : HEAD中不含有呈现数据,仅仅是Http头信息.
6.OPTIONS请求 : 用于获取当前url所支持的方法,若请求成功,则会在http头中包含一个名为”Allow”的头,值是所支持的方法

八.Override和Overload的区别 :
1.Override(重写)
存在于父类和子类之间(实现),方法名,返回值,参数相同.子类方法不能缩小父类方法的访问权限.子类方法可以不抛出异常,但不能抛出比父类方法更多的异常.若方法被定义为final ,则不可被重写
2.Overload(重载)
存在于父类和子类,同类方法中.参数的类型,个数,顺序至少有一个不相同…重载与返回值无关

九.浅谈你对Spring的理解
Spring是一个开源框架,实际上是一种容器,是实现了IOC的容器,是一个Bean的工厂,对Bean进行管理.
IOC(控制反转) : 将类独栋创建和依赖关系写在配置文件中,由配置文件注入,实现了低耦合.
AOP(面向切面) : 将公共的服务对于程序逻辑相对独立的功能抽取出来,利用Spring的配置文件将这些功能插入,提高了可维护性和复用性.

十.数据库的三范式 :
第一范式(1NF) : 字段具有原子性,不可再分.数据库表中的字段都是单一属性,不可再分.
第二范式(2NF) : 建立在第一范式上,要求数据库表中的每个实例必须可以被唯一区分.这个唯一属性被称为主关键字或主键.
第三范式(3NF) : 建立在第二范式上,数据库表中 :
1.每一列都只有一个值
2.每一行都能区分
3.每一个表都不包含其他表已经包含的非主键信息

十一.Java中常见的几种设计模式
1.单例设计模式
无论程序如何运行,采用单例模式设计的类,永远只会有一个实例对象产生
单例的实现 :
1.构造方法私有化(private)
2.在其内部产生该类得到实例化对象,将其疯转为private static类型
3.定义一个静态方法返回该实例
/**

  • 线程安全的单例模式
    */
    public class Java {
    //生成本类的实例化对象
    private static Java java;
    //私有化构造方法
    private Java() {
    }
    //定义一个方法返回此对象的实例
    private static Java getInstance() {
    //判断此实例化对象是否为空
    if (java == null) {
    //上锁
    synchronized (Java.class) {
    //再次判断
    if (java == null) {
    //创建 此空实例对象
    java = new Java();
    }
    }
    }
    //返回此对象的实例
    return java;
    }
    }

2.工厂设计模式
程序在接口和子类之间加入一个过渡端,通过此过渡端可以动态获取实现了共同接口的子类实例化对象

3.代理设计模式
由一个代理主题来操作真实主题,真实主题执行具体业务流程,而代理主题负责其他相关业务的处理.

4.观察者模式
观察者模式定义了对象间的一对多依赖关系,让一个或多个观察者对象观察一个主题对象.当主题对象的状态发生变化时.系统能通知所有的依赖于此对象的观察者对象,从而使观察者对象能够自动更新

5.建造者模式
工厂类模式提供的是单个类的模式,建造者模式则是将各种对象集中管理,用来创建复合对象.复合对象指某个类具有不同的属性

6.适配器设计模式
适配器模式试讲某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题

7.装饰模式
装饰模式就是给一个对象增加一些新的功能,而且是动态的.要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例

8.策略模式
策略模式定义了一系列算法 ,并且将每个算法封装起来,使他们可以相互替换,且算法的变换不含影响到使用算法的客户,需要设计一个接口,为一系列实现了类提供统一的方法.多个实现类实现该接口,设计一个抽象类,提供辅助函数,策略模式的决定权在用户.系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装.因为策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可

十二.什么是SpringBoot 以及特点 :
SpringBoot是一个轻量级框架,一种全新的编程规范.简化了框架的使用,简化了Spring中众多框架所需要的配置文件.SpringBoot是一个服务于框架的框架.作用是简化配置文件
特点 :
让文件配置变得简单,让应用部署变得简单.可以快速开启一个web容器进行开发,使监控变得简单
优点 :
1.能够快速构建项目
2.对主流开发框架的无配置集成
3.项目可独立运行,无需外部依赖Servlet容器
4.提供运行时的应用监控
5.提高了开发部署的效率

十三.JWT的缺点及解决方案
1.无法刷新登录状态
①在服务端记录某个token有效时间(破坏了无状态登录)
②每次验证token时,都重新生成token(带来额外的cpu压力)
2.退出登录问题,token无法销毁
①在服务端记录某个token有效时间(破坏了无状态登录)
②删除cookie方案

十四.什么是SpringCloud,以及特点
SpringCloud是一系列框架的有序集合,它利用SpringBoot的开发便利性巧妙的简化了分布式系统基础设施的开发.可以做到一键启动和部署.是一套简单易懂,易部署和易维护的分布式系统开发工具包
特点 :
1.易于开发和维护
2.单个微服务启动快
3.轻量级通信机制

十五.IOC是什么 作用是什么
IOC(inversion of control) 控制反转.是一种程序设计思想 .在Java开发中,IOC意味着将你设计好的对象交给容器控制.IOC容器控制了对象,控制了外部资源获取
控制反转 : 依赖倒置原则的一种代码设计的思想,具体采用的方法就是依赖注入
IOC的好处 :
1.开发更方便组织分工
2.代码更容易进行复用
3.更容易进行测试
4.软件演化有更好的灵活性,能快速响应需求变化 ,维护代价变小

十六.Bean的作用域及使用场景
1.Singleton单例模式 : 在整个IOC容器中,使用Singleton定义的Bean只有一个实例
2.Prototype原型模式 : 每次通过容器的getBean方法获取Bean时,都将产生一个新的Bean实例
3.Request : 每次http请求都会创建一个Bean,该作用域仅在基于web的Spring ApplicationContext情况下生效
4.Session : 对于每次http Session,使用Session定义的Bean都会产生一个新实例
5.Global - Session : 在一个全局HTTP Session 中,一个Bean对应一个单独的实例

十七.请描述一个Spring的事务
Spring提供的事务管理可以分为两类 : 编程式和声明式.编程式的比较灵活,但是代码量较大;声明式的比编程式更为灵活,代码量也较少
1.PROAGATION_REQUIRED : 支持当前事务,如果当前没有事务,就新建一个事务
2.PROAGATION_SUPPORTS : 支持当前事务,如果当前没有事务,就以非事务方式执行
3.PROAGATION_MANDATORY : 支持当前事务,如果当前没有事务,就抛出异常
4.PROAGATION_REQUIRES_NEW : 新建事务,如果当前存在事务,把当前事务挂起
5.PROAGATION_NOT_SUPPORTED : 以非事务方法执行操作,如果当前存在事务,就把当前事务挂起
6.PROAGATION_NEVER : 以非事务方式执行,如果当前存在事务,则抛出异常
7.PROAGATION_NESTED : 如果当前存在事务,则嵌套事务内执行,如果当前没有事务,则进行与PROAGATION_REQUIRED类似的操作

十八.Dubbo是什么 作用以及特点
Dubbo是一个分布式框架 ,致力于提升高性能和透明化的PRC远程服务调用方案
核心部分 :
1.远程通讯 : 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及请求响应模型的信息交换方式
2.集群容错 : 提供基于接口方法的透明远程过程调用,包括多协议支持,软负载均衡,失败容错,地址路由,动态配置等集群支持
3.自动发现 : 基于注册中心目录服务,使服务消费方能动态的查找服务提供发,使地址透明,使服务提供发可以平滑增加或减少机器
作用 :
1.透明化的远程方法调用,简单配置,无API侵入
2.软负载均衡及容错机制,降低成本,减少单点
3.服务自动注册与发现,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑的添加或删除服务提供者
什么是PRC :
PRC — 远程过程调用协议,是一种服务间调用方式,通过网络从远程计算机程序请求服务.不需要了解底层网络技术的协议
使用场景 : 在用户量很大,请求频繁的场景下

十九.什么是Spring的依赖注入 :
依赖类不由开发者实例化,通过Spring容器帮我们new指定实例并且将实例注入到需要该对象的类中(控制反转).

二十. 有哪些不同类型的IOC(依赖注入) 方式 :
1.Set注入
2.构造器注入
3.静态工厂的方法注入
4.实例工厂的方法注入

二十一. 什么是Bean的自动装配
无须在Spring配置文件中描述JavaBean之间到底依赖关系.IOC容器 会自动建立JavaBean之间的关联关系

二十二. GC(垃圾处理机制)
1.Java中的垃圾收集的方式与流程 :
1.自动 : 自动会不定期进行回收,释放无用的空间
2.手动 : 通过调用System.gc()方法.此方法实际上调用的是Runtime类中的gc()方法,当一个对象被回收之前将调用类中的finlalize()方法,此方法由Object类提供,表示对象回收前到达收尾工作,即使出现异常,也不影响程序执行.

  1. 什么是GC,为什么要有GC
    GC是垃圾回收的意思(Gabage Collection).Java提供的GC功能,可以自动检测对象是否超过作用域从而达到自动回收内存的目的.Java语言没有提供释放已分配的显示操作方法.

  2. 垃圾回收的优点和原理
    垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存.垃圾回收器通常是作为一个单独的低级别的线程运行.不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除与回收.开发者不能实时调用垃圾回收器对某个对象进行回收

4.两种回收机制 :

  1. 分代复制垃圾回收 : 把不同生命周期的对象放在不同代上,不同代采用最适合它的垃圾 回收方式进行回收.
    三代 : 年轻代 : 小对象,频繁被回收,重视回收率
    年老代 : 长期存活对象,堆空间大
    持久代 : 存放VM和Java类的元数据
    2.标记垃圾回收 : 未引用的对象并不会被立即回收,当垃圾对象一直堆在内存耗尽时,程序挂起.开始回收垃圾.当所有垃圾对象被清理完毕后,程序才会继续执行.
    标记清除算法的两个阶段 :
    1.标记阶段 : 标记所有可以访问的对象
    2.收集阶段 : 垃圾手机算法扫描堆并回收所有未标记对象
    优缺点 :
    1.优点 : 可以正确标记并执行垃圾回收工作.对引用对象的常规操作不会产生任何的额外开销
    2.缺点 : 当垃圾回收算法执行时,正常的程序会被挂起
    3.增量垃圾回收 :
    为了解决标记清除的长停顿问题,增量回收将GC分成几部分来执行

二十三. 在SpringAOP中,关注点和横切关注的区别
关注点是应用中的一个模块的行为.横切关注点是一个关注点,是整个应用都会使用的功能,并影响整个应用

二十四. Spring的通知是什么? 有哪几种
通知是程序执行时要通过SpringAOP框架触发 的代码段
五种类型的通知:
1.before : 前置通知,在一个方法执行前被调用
2.After : 无论方法执行是否成功,在方法执行后调用
3.After-returning : 当方法完成后执行的通知
4.After-throwing : 在方法抛出异常退出时执行的通知
5.Around : 环绕通知 在方法执行之前和方法执行之后调用的方法

二十五. Redis数据库持久化
1.RDB持久化 :
把当前内存中的数据集快照写入磁盘,恢复时将快照文件直接读取到内存中
快照 : 把整个内存数据映射得到磁盘中,存储与读取极快.是Redis默认持久化方案
2.AOF持久化 :
将Redis执行的所有操作命令保存到单独的日志文件中.当Redis重启后重新执行这些命名来恢复数据
3.无持久化 : 让数据只在服务器运行时存在
当同时应用RDB和AOF时,Redis会优先使用AOF恢复数据.因为AOF保存的数据较RDB更为完整

RDB持久化的优缺点 :
优点 :
1.RDB是一个非常紧凑的文件,它保存了Redis在某个时间点上的数据集,这种文件非常适合备份与恢复
2.生成RDB文件时,Redis主进程会fork()一个子进程来处理所有保存工作,主进程无需进行任何磁盘IO操作
3.RDB在恢复大数据集时速度比AOF快
缺点 :
1.RDB无法做到实时持久化数据,可能会丢失数据.如果Redis意外宕机,就会丢失最后一次快照后等待所有数据
2.在每次保存RDB时,Redis都要fork()出一个子进程,在数据较为庞大的时候,可能会非常耗时,影响性能
AOF持久化的优缺点 :
优点 :
1.AOF持久化会使Redis变得非常耐久,就算发生故障停机,也最多只会丢失一秒钟的数据
2.AOF是一个只进行追加操作的日志文件,即使因为某些原因未写入完整的命令.redis-check-aof工具也可以轻易修复这种问题(追加 到旧的AOP文件后)
缺点 :
1.AOF文件要比RDB文件更庞大
2.性能消耗比RDB高
3.数据恢复比RDB慢

二十六. Redis的主从复制(读写分离)
好处 :
1.避免Redis单点故障
2.构建读写分离架构,满足读多写少的应用场景
复制的原理过程 :
1.当从库与主库建立关系后,从库会向主库发送PSYNC命令
2.主库接收到命令后,会开始在后台保存快照文件,并将期间接收到的数据缓存起来
3.当RDB持久化快照完成后,主库会将快照文件和命令发送给从库
4.从库接收到后,载入快照文件并执行命令
5.之后,主库每当接收到写命令时就会将命令发送给从库,从而保持数据的一致

二十七. Redis的哨兵机制
哨兵的作用是对Redis系统的运行情况进行监控
功能 :
1.监控主从数据库是否运行正常
2.主库出现故障导致宕机后哨兵会自动将从库切换为主库

二十八. MySQL语句优化
1.当只需要一条数据的时候使用LIMIT 1
2.查询避免SELECT *
3.为每张表设置一个id为主键,并将其设置为自增长
4.使用enum而不是varchar,enum保存的是tinyint类型,但现实为字符串
5.尽可能的使用not null
6.为需要搜索的字段建立索引
7.在join表的时候使用相当类型的例并将其索引
8.拆分大的DELETE或INSERT语句
9.选择正确的储存引擎
10.使用一个对象关系映射器
11.不在数据库做运算
12.不同类型不可进行比较
13.尽量不要使用LIKE关键字查询
14.查询条件中尽量不要使用聚合函数

二十九. Redis的数据结构
1.String — 字符串 : key - value结构
2.Hash — 字典
3.List — 列表 : 链表
4.Set — 集合
5.Sorted Set — 有序集合

三十. List Map ,Set集合的区别
1.List :
实现类 : ArrayList , LinkedList Vector
特点 : 有序,元素可重复
ArrayList :
底层由Object类型的数组组成.ArrayList继承自AbstractList抽象父类,实现了List接口.RandomAccess(可随机访问),Cloneable(可拷贝),Serializable(可序列化)
通过System.ArrayCype方法实现长度可变,在调用add方法是初始化一个长度为10,扩容长度为原来的1.5倍
底层查询快,增删慢
LinkedList :
底层由双向循环链表实现
增删快,查询慢
Vector :
底层由数组实现,线程是安全的
增删慢,查询慢

ArrayList和LinkedList 的区别 :
1.ArrayList基于动态数据的数据结构,LinkedList基于链表的数据结构
2.查询效率ArrayList优于LinkedList,因为LinkedList要移动指针
3.增删效率LinkedList优于ArrayList,因为ArrayList要移动数据

2.Set :
实现类 : HashSet , TreeSet
特点 : 存取无序,元素不可重复
HashSet :
底层由HashMap实现,元素不可重复
LinkedHashSet :
继承自HashSet,底层使用LinkedHashMap,具有可预知迭代顺序,由哈希表和链表实现

3.Map:
实现类 : HashMap LinkedHashMap,SortMap
特点 : 数据以键值对的形式出现 key - value
Map的底层实现 : 可变数组 + 单链表 + 二叉树
HashMap底层实现 :
JDK1.8 前 : 数组 + 链表
JDK1.8 后 : 数组 + 二叉树

HashMap和HashTable的区别 :
1.HashMap是非线程安全的,并且key 和 value 的值支持为null
2.HashTable是线程安全的,但不支持Key 和 value 的值为null,在单线程的情况下,HashMap的性能要优于HashTable

ConcumentHashMap :
底层采用分段的数组 + 链表结构 线程安全,通过吧整个Map分为多个Segment,可以提供相同的线程安全,效率提升约16倍

三大集合的区别 :
1.List : List集合中对象按索引的位置排序,可以有重复元素
2.Set : Set集合中元素无序,不可有重复元素
3.Map : Map中元素以键值对的形式出现,键(key)不可重复,值(value)可重复

三十一. 数组和链表的区别
数组 :
数组是将元素在内存中连续存储的
优点 :
因为数据内存地址连续,所以查找效率较高
缺点 :
在储存之前,需要申请一块连续的内存,并在编译前就确定了内存大小.而这块内存并不能随需求增大或减小.数组元素太大,可能会出现越界.数组元素较小,浪费内存.增删改效率低,但查询快
链表 :
链表中动态申请内存空间,根据需求来动态申请或删除内存空间.数据的增删改效率高,但查询慢

三十二. 面向对象都有哪些特性
1.封装 :
封装是将数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口.封装将一切可隐藏的数据隐藏,只向外界提供简单的编程接口
2.继承 :
继承是从已有类中得到继承信息从而创建新类的过程,继承让软件系统有了一定的延续性,是封装程序的重要手段
3.多态 :
多态是用同样的对象引用调用同样的方法但是做了不同的事.多态分为编译时多态和运行时多态.方法重写实现的是运行时多态,而方法重载实现的是编译时多态
实现多态的两个条件 :
1.方法重写,子类继承并重写父类中已有的方法
2.父类引用指向子类对象
4. 抽象:
抽象是将一类对象的共同特征总结出来构造类的过程.包括数据抽象和行为抽象两方面.抽象只关注对象的属性和行为,并不关心这些属性和行为的细节

三十三. 抽象类和接口有什么异同
抽象类 :
1.抽象类可以定义构造器
2.可以有抽象方法和非抽象方法
3.抽象类中的成员全是public修饰的
4.抽象类中可以定义成员变量
5.有抽象方法的类一定是抽象类,抽象类不一定有抽象方法
6.抽象类可以包含静态方法
7.一个类只能继承一个抽象类
接口 :
1.接口不可以定义构造器
2.方法全部是抽象方法
3.接口中的成员可以是private,default,protected,public修饰
4.接口中不能有静态方法
5.一个类可以实现多个接口
相同 :
1.都不能被实例化
2.可以将抽象类和接口类型作为引用类型
3.一个类如果继承了抽象类或实现了接口,需要对其中的抽象方法全部进行实现

三十四. Java的异常处理 :
异常分类 : CheckException 编译时异常
在编译时期就会报错,程序无法继续向下执行
RuntimeException 运行时异常
只有在编译后运行时才会报错,一旦报错,程序无法向下执行
异常处理 :
1.当前方法如果知道如何处理该异常,使用try…catch处理异常
2.当前方法如果不知道如何处理,则声明抛出异常
3.异常要么用try…catch捕获,要么使用throws字句抛出
Error和exception的区别:
Error指程序本身无法克服和恢复的严重问题,无法解决
Exception表示程序还能克服和恢复的问题,可以解决

三十五. 写出5个常见的运行时异常
1.NoSuchMethodException 方法不存在异常
2.NullPointerException 空指针异常
3.ClassNotFoundException 类找不到异常
4.IndexOutOfBoundException 数组下标越界异常
5.ClassCastException 类转换异常

三十六. 字节流和字符流的区别
1.字节流在读取的时候,读到一个字节就返回一个字节,字符流使用字节流读取一个或多个字节
2.字节流可以处理所有类型的数据,而字符流只能处理字符数据
3.字节流用于数据传输以及上传下载,字符流只能处理文本数据
三十七. Java多线程的实现方式
1.继承Thread类实现多线程
Thread是实现了Runnable接口的实例,代表一个线程的实例,通过重写run()方法,就可以启动新线程
2.实现Runnable接口创建实例
如果当前类已经继承其他类而无法继承Thread类时,使用Runnable接口
3.使用ExecutorService ,Callable,Future实现有返回结果的线程
4.实现Callable接口,通过FutureTask包装器来创建线程

三十八. 多线程使用的优缺点
优点 :
1.多线程技术使程序响应速度更快
2.可以随时停止任务
3.可以分别设置各个任务的优先级以及优化性能
4.占用大量处理时间的任务可以定期将处理器时间让给其他任务
缺点 :
1.对线程进行管理要求额外的cpu开销
2.等候使用共享资源时造成程序的运行速度变慢
3.可能会出现线程阻塞死锁情况

三十九. 线程调度算法是什么
抢占式,一个线程使用完cpu后,操作系统会根据线程的优先级,线程的饥饿情况等数据算出一个点的优先级并分配下一个时间片给某个线程执行

四十. 什么是乐观锁与悲观锁

  1. 乐观锁 :
    对于并发间操作产生的线程安全问题持乐观态度.乐观锁认为竞争不会总是产生,因此不需要持有锁.将比较-设置这两个动作作为下一个原子操作尝试去修改内存中的变量,如果失败,就有相应的重试逻辑
    2.悲观锁 :
    对于并发间操作哦产生的线程安全问题持悲观态度.悲观锁认为竞争总是会产生,因此每次对某资源进行操作时,都会持有一个独占的锁,直接对操作资源上了锁

四十一. 线程池
作用 :
线程池的作用就是限制系统中执行线程的数量
为什么要用线程池 :
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
2.可以根据系统的承受能力,调整线程池中工作线程的数目.防止因为消耗过多的内存,导致服务器宕机

四十二. 什么是线程安全和不安全
线程安全 :
多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护.其他线程不能进行访问,直到该线程读取完,其他线程才可以使用
线程不安全 :
就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

四十三. 动态代理和静态代理的区别
1.静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类
2.静态代理实现知道要代理什么,而动态代理不知道,只有在运行的时候才知道

四十四. JVM的内存划分
JVM内存可划分为线程共享区和线程独占区
线程共享区 : 堆区 方法区
线程独占区 : Java栈 本地方法栈 程序计数器

1.Java栈 : 存放栈帧,每个栈帧对应被调用的一个方法,栈帧中包括局部变量表,操作数栈,指向运行时常量池的引用,方法返回地址
2.本地方法栈 : 与Java栈作用和原理相似,本地方法栈执行本地方法
3.程序计数器 : 保存程序当前执行的指令地址
4.堆 : 用来储存对象和数组
5.方法区 : 储存类信息,静态变量,常量以及编译后的代码

四十五. 类的初始化的6种情况
1.创建类的实例,也就是new一个对象
2.访问某个类或接口的静态变量,或对该静态变量赋值
3.调用类的静态方法
4.反射
5.初始化一个类的子类
6.JVM启动时标明的启动类,即文件名和类名相同的类

四十六. 类的初始化步骤
1.如果这个类还没有被加载和链接,那先进行加载和链接
2.假如这个类存在直接父类,并且这个类还没被初始化,那就初始化这个类的父类
3.假如类中存在初始化语句,那就依次执行这些初始化语句

四十七. cookie和Session的区别
1.无论客户端做什么设置,Session都能正常工作,当客户端禁用cookie时将无法使用cookie
2.在存储的数据量方面 :
1)Session能够存储任意的Java对象
2)Cookie只能存储String类型的对象

四十八. 谈谈你对Ajax的理解
Ajax是一种创建交互式网页应用的网页开发技术

特点 :

可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验

优势 :
1.优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
2.承担了一部分本来由服务器承担的工作,从而减少大用户量下的服务器负载

四十九. SQL的聚合函数
1.Avg() 求平均值
2.Count() 求指定值的总和
3.Max() 求最大值
4.Min() 求最小值
5.Sum() 求和
6.Group by() 分组

五十. MySQL事务的四大特征
1.原子性 :
整个事务中的所有操作,要么全部完成,要么全部不完成
2.一致性 :
在事务开始前和结束后,数据库完整性约束没有被破坏
3.隔离性 :
隔离状态执行事务,确保每一事务在系统中人为只有该事务在使用系统
4.持久性 :
在事务完成后,该事务所对数据库所做的更改便持久的保存在数据库中,并且不会回滚

五十一. MySQL事务的四种隔离级别
1.READ UNCOMMITTED 读未提交
2.READ COMMITTED 读已提交
3.REPEATABLE READ 可重复读
4.SERIALIZABLE 可序列化/串行化

五十二. Spring常用注解
1.@Autowired 按类型注入.装配对象
2.@Configuration 把一个类作为IOC容器
3.@scope 作用域
4.@Service 标注当前类为业务层
5.@controller 标注当前类为控制层

五十三. Mybatis的编程步骤
1.创建SqlSessionFactory
2.通过SqlSessionFactory创建SqlSession
3.通过SqlSession执行数据库操作
4.调用commit() 方法提交事务
5.调用close() 方法释放资源

五十四. Nginx反向代理为什么能够提升性能
Nginx会把Request在读取完整前buffer住,这样交给后端的就是一个完整得到HTTP请求,从而提高后端效率.同样,也可以把Responsebuffer住

五十五. solr简介
Solr是一个独立的企业级搜索应用服务器,基于Lucene的全文搜索服务器.实现了可配置,可扩展并对查询性能进行了优化,并提供一个完善的功能管理界面

五十六. RabbitMQ如果确保消息不丢失
消息持久化,前提是队列持久化
RabbitMQ确保持久性消息能从服务器重启恢复的方式是,将他们写入磁盘上的一个持久化日志文件.当发布一条持久性消息到持久交换器上时,Rabbit会在消息提交到日志文件后才发送响应
一旦消费者从持久队列中消费了一条持久化消息,RabbitMQ会在持久化日志中把这条消息标记为等待垃圾收集.如果持久化消息在被消费之前RabbitMQ重启,那么RabbitMQ会自动重建交换器和队列,并重新发布持久化日志文件中的消息到合适的队列.

如果觉得对你有帮助,支持一下作者吧!!!

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值