版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
历年Java面试分类100题(一)
—•、Java基础篇
1、Java中的Math,round(-1.5)等于多少?
【仅供参考】
等于T,因为在数轴上取值时,中间值(0.5)向右取整,所以正0.5是往上
取整,负0.5是直接舍弃。
2、为什么不能用浮点型表示金额?
【仅供参考】
由于计算机中保存的小数其实是十进制的小数的近似值,并不是准确值,所
以,千万不要在代码中使用浮点数来表示金额等重要的指标。
建议使用BigDecimal或者Long来表示金额。
3、Strings="xyz"和Strings=newString("xyz”)区别?
【仅供参考】
两个语句都会先去字符串常量池中检查是否已经存在“xyz”,如果有则直接
使用,如果没有则会在常量池中创建“xyz”对象。
另外,Strings=newString("xyz")还会通过newString()在堆里创建一
个内容与"xyz”相同的对象实例。
所以前者其实理解为被后者的所包含。
4、Files的常用方法都有哪些?
【仅供参考】
Files.exists。:检测文件路径是否存在。
Files.createFileO:创建文件。
Files.createDirectory():创建文件夹。
Files.deleteO:删除一个文件或目录。
Files.copy():复制文件。
Files.move():移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files.write():写入文件。
5、为什么不能根据返回类型来区分重载?
【仅供参考】
如果我们有两个方法如下,当我们调用:test(l)时,编译器无法确认要调用
的是哪个。
//方法1
inttest(inta);
//方法2
longtest(inta);
方法的返回值只是作为方法运行之后的一个“状态”,但是并不是所有调用都
关注返回值,所以不能将返回值作为重载的唯一区分条件。
6、重载(Overload)和重写(Override)的区别?
【仅供参考】
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态
性,而后者实现的是运行时的多态性。
重载:一个类中有多个同名的方法,但是具有有不同的参数列表(参数类型不
同、参数个数不同或者二者都不同)。
重写:发生在子类与父类之间,子类对父类的方法进行重写,参数都不能改
变,返回值类型可以不相同,但是必须是父类返回值的派生类。即外壳不变,
核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。
7、抽象类(abstractclass)和接口(interface)有什么区别?
【仅供参考】
抽象类只能单继承,接口可以多实现。
抽象类可以有构造方法,接口中不能有构造方法。
抽象类中可以有成员变量,接口中没有成员变量,只能有常量(默认就是
publicstaticfinal)
抽象类中可以包含非抽象的方法,在Java7之前接口中的所有方法都是抽象
的,在Java8之后,接口支持非抽象方法:default方法、静态方法等。
Java9支持私有方法、私有静态方法。
抽象类中的方法类型可以是任意修饰符,Java8之前接口中的方法只能是
public类型,Java9支持private类型。
设计思想的区别:
接口是自上而下的抽象过程,接口规范了某些行为,是对某一行为的抽象。我
需要这个行为,我就去实现某个接口,但是具体这个行为怎么实现,完全由自
己决定。
抽象类是自下而上的抽象过程,抽象类提供了通用实现,是对某一类事物的抽
象。我们在写实现类的时候,发现某些实现类具有几乎相同的实现,因此我们
将这些相同的实现抽取出来成为抽象类,然后如果有一些差异点,则可以提供
抽象方法来支持自定义实现。
我在网上看到有个说法,挺形象的:
普通类像亲爹,他有啥都是你的。
抽象类像叔伯,有一部分会给你,还能指导你做事的方法。
接口像干爹,可以给你指引方法,但是做成啥样得你自己努力实现。
8、==和equals的区别是什么?
【仅供参考】
==:运算符,用于比较基础类型变量和引用类型变量。
对于基础类型变量,比较的变量保存的值是否相同,类型不一定要相同。
对于引用类型变量,比较的是两个对象的地址是否相同。
equals:Object类中定义的方法,通常用于比较两个对象的值是否相等。
equals在Object方法中其实等同于==,但是在实际的使用中,equals通常
被重写用于比较两个对象的值是否相同。
9、如何实现对象克隆?
【仅供参考】
实现Cloneable接口并重写Object类中的clone。方法。
实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现
真正的深度克隆。
10>String,StringBuffer和StringBuilder区别
【仅供参考】
可变性
String不可变
StringBuffer和StringBuilder可变
线程安全
String不可变,因此是线程安全的
StringBuilder不是线程安全的
StringBuffer是线程安全的,内部使用synchronized进行同步
11、阐述final、finally、finalize的区别。
【仅供参考】
其实是三个完全不相关的东西,只是长的有点像。。
final如上所示。
finally:finally是对Java异常处理机制的最佳补充,通常配合try、
catch使用,用于存放那些无论是否出现异常都一定会执行的代码。在实际使
用中,通常用于释放锁、数据库连接等资源,把资源释放方法放到finally
中,可以大大降低程序出错的几率。
finalize:Object中的方法,在垃圾收集器将对象从内存中清除出去之前做必
要的清理工作。finalize。方法仅作为了解即可,在Java9中该方法已经被
标记为废弃,并添加新的java.lang.ref.Cleaner,提供了更灵活和有效的方
法来释放资源。这也侧面说明了,这个方法的设计是失败的,因此更加不能去
使用它。
12、BIO、NIO、AI0有什么区别?
【仅供参考】
BIO:Block10同步阻塞式10,就是我们平常使用的传统10,它的特点是模
式简单使用方便,并发处理能力低。
NIO:Non10同步非阻塞10,是传统10的升级,客户端和服务器端通过
Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous10是NI0的升级,也叫NI02,实现了异步非堵塞10,
异步10的操作基于事件和回调机制。
13、Object常用方法有哪些?
【仅供参考】
Java面试经常会出现的一道题目,Object的常用方法。下面给大家整理一下。
Object常用方法有:toStringO>equals()hashCode()>clone。等。
14^==和equals的区别是什么?
【仅供参考】
对于基本类型和引用类型==的作用效果是不同的。
基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;
equals本质上就是==,只不过String和Integer等重写了equals方法。
==对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而
equals默认情况下是引用比较,只是很多类重新了equals方法,比如
String、Integer等把它变成了值比较,所以一般情况下equals比较的是值
是否相等。
15、Java常见异常有哪些
【仅供参考】
java.lang.IllegalAccessError:违法访问错误。当一个应用试图访问、修改
某个类的域(Field)或
者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。
java.lang.InstantiationError:实例化错误。当一个应用试图通过Java的
new操作符构造一个抽象
类或者接口时抛出该异常.
java.lang.OutOfMemoryError:内存不足错误。当可用内存不足以让Java虚拟
机分配给一个对象
时抛出该错误。
java.lang.StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次
太深而导致堆栈溢出
或者陷入死循环时抛出该错误。
java.lang.ClassCastException:类造型异常。假设有类A和B(A不是B的父
类或子类),0是A的
实例,那么当强制将0构造为类B的实例时抛出该异常。该异常经常被称为强
制类型转换异常。
java.lang.ClassNotFoundException:找不到类异常。当应用试图根据字符串
形式的类名构造类,
而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
java.lang.ArithmeticException:算术条件异常。譬如:整数除零等。
java.lang.ArraylndexOutOfBoundsException:数组索引越界异常。当对数组
的索引值为负数或
大于等于数组大小时抛出。
java.lang.IndexOutOfBoundsException:索引越界异常。当访问某个序列的索
引值小于0或大于
等于序列大小时,抛出该异常。
java.lang.InstantiationException:实例化异常。当试图通过
newlnstance()方法创建某个类的实
例,而该类是一个抽象类或接口时,抛出该异常。
java.lang.NoSuchFieldException:属性不存在异常。当访问某个类的不存在
的属性时抛出该异
常。
java.lang.NoSuchMethodException:方法不存在异常。当访问某个类的不存在
的方法时抛出该
异常。-
java.lang.NullPointerException:空指针异常。当应用试图在要求使用对象
的地方使用了null时,
抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算
null对象的长度、使用
throw语句抛出null等等。
java.lang.NumberFormatException:数字格式异常。当试图将一个String转
换为指定的数字类
型,而该字符串确不满足数字类型要求的格式时,抛出该异常。
java.lang.StringlndexOutOfBoundsException:字符串索引越界异常。当使用
索引值访问某个字
符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常。
16、throw和throws的区别是什么?
【仅供参考】
Java中的异常处理除了包括捕获异常和处理异常之外,还包括声明异常和抛出
异常,可以通过
throws关键字在方法上声明该方法要抛出的异常,或者在方法内部通过throw
抛出异常对象。
throws关键字和throw关键字在使用上的几点区别如下:
throw关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块
中的异常,受查异常
和非受查异常都可以被抛出。
throws关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出
的异常列表。一个
方法用throws标识了可能抛出的异常列表,调用该方法的方法中必须包含可
处理异常的代码,否
则也要在方法签名中用throws关键字声明相应的异常。
17、try-catch-finally中,如果catch中return了,finally还会执行
吗?
【仅供参考】
答:会执行,在return前执行。
注意:在finally中改变返回值的做法是不好的,因为如果存在finally代
码块,try中的return语
句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再
向调用者返回其值,
然后如果在finally中修改了返回值,就会返回修改后的值。显然,在
finally中返回或者修改返回
值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种
龌龊的事情,Java
中也可以通过提升编译器的语法检查级别来产生警告或错误。
18、final、finally%finalize有什么区别?
【仅供参考】
final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表
示此方法和此变量不能在被改变,只能使用。
finally:是try{}catch{}finally!)最后一部分,表示不论发生任何情况
都会执行,finally部分可以省略,但如果finally部分存在,则一定会执行
finally里面的代码。
finalize:是Object类的一个方法,在垃圾收集器执行的时候会调用被回收
对象的此方法。
19、Error和Exception区别是什么?
【仅供参考】
Error类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出
等,编译器不会对这
类错误进行检测,JAVA应用程序也不应对这类错误进行捕获,一旦这类错误发
生,通常应用程序
会被终止,仅靠应用程序本身无法恢复;
Exception类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错
误,应对其进行处
理,使应用程序可以继续正常运行。
20、运行时异常和一般异常(受检异常)区别是什么?
【仅供参考】
运行时异常包括RuntimeException类及其子类,表示JVM在运行期间可能出
现的异常。Java编
译器不会检查运行时异常。
受检异常是Exception中除RuntimeException及其子类之外的异常。Java
编译器会检查受检异常。
RuntimeException异常和受检异常之间的区别:是否强制要求调用者必须处理
此异常,如果强
制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常
(RuntimeException)0一般来讲,如果没有特殊的要求,我们建议使用
RuntimeException异常。
二、Java进阶篇
1、HashMap的插入流程是怎么样的?
【仅供参考】
略,从基本逻辑处理,到红黑树,,到链表讲解
2、多线程中synchronized锁升级的原理是什么?
【仅供参考】
synchronized锁升级原理:在锁对象的对象头里面有一个threadid字段,在
第一次访问的时候threadid为空,jvm让其持有偏向锁,并将threadid设
置为其线程id,再次进入的时候会先判断threadid是否与其线程id一致,
如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通
过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要
使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了
synchronized锁的升级。
锁的升级的目的:锁升级是为了减低了锁带来的性能消耗。在Java6之后优
化synchronized的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级
锁的方式,从而减低了锁带来的性能消耗。
3、什么是死锁?
【仅供参考】
当线程A持有独占锁a,并尝试去获取独占锁b的同时,线程B持有独占锁
b,并尝试获取独占锁a的情况下,就会发生AB两个线程由于互相持有对方
需要的锁,而发生的阻塞现象,我们称为死锁。
4、守护线程是什么?
【仅供参考】
守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行
某种任务或等待处理某些发生的事件。在Java中垃圾回收线程就是特殊的守
护线程。
5、说一下atomic的原理?
【仅供参考】
atomic主要利用CAS(CompareAndWwap)和volatile和native方法来保
证原子操作,从而避免synchronized的高开销,执行效率大为提升。
6、线程B怎么知道线程A修改了变量
【仅供参考】
(1)volatile修饰变量
(2)synchronized修饰修改变量的方法
(3)wait/notify
(4)while轮询
7、线程和进程的区别?
【仅供参考】
一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以
有多个线程来增加程序的执行速度。
8、如何停止一个正在运行的线程?
【仅供参考】
有几种方式。
1、使用线程的stop方法。
使用stop。方法可以强制终止线程。不过stop是一个被废弃掉的方法,不推
荐使用。
使用Stop方法,会一直向上传播ThreadDeath异常,从而使得目标线程解锁所
有锁住的监视器,即释放掉所有的对象锁。使得之前被锁住的对象得不到同步
的处理,因此可能会造成数据不一致的问题。
2、使用interrupt方法中断线程,该方法只是告诉线程要终止,但最终何时
终止取决于计算机。调用interrupt方法仅仅是在当前线程中打了一个停止的
标记,并不是真的停止线程。
接着调用Thread.currentThread().islnterrupted()方法,可以用来判断当前
线程是否被终止,通过这个判断我们可以做一些业务逻辑处理,通常如果
islnterrupted返回true的话,会抛一个中断异常,然后通过try-catch捕
获。
3、设置标志位
设置标志位,当标识位为某个值时,使线程正常退出。设置标志位是用到了共
享变量的方式,为了保证共享变量在内存中的可见性,可以使用volatile修饰
它,这样的话,变量取值始终会从主存中获取最新值。
但是这种volatile标记共享变量的方式,在线程发生阻塞时是无法完成响应
的。比如调用Thread,sleep。方法之后,线程处于不可运行状态,即便是主
线程修改了共享变量的值,该线程此时根本无法检查循环标志,所以也就无法
实现线程中断。
因此,interrupt。加上手动抛异常的方式是目前中断一个正在运行的线程最
为正确的方式了。
9、什么是AQS
【仅供参考】
AQS是AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同
步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操
作来管理这个同步状态。
AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用
广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸
如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于
AQS的。
10、线程的sleep()方法和yieldO方法有什么区别?
【仅供参考】
线程执行sleep()方法后进入超时等待(TIMED」AITING)状态,而执行
yieldO方法后进入就绪(READY)状态。
sleepO方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级
的线程运行的机会;yieldO方法只会给相同优先级或更高优先级的线程以运
行的机会。
11、线程有哪些状态?
【仅供参考】
线程的状态:
NEW尚未启动
RUNNABLE正在执行中
BLOCKED阻塞的(被同步锁或者10锁阻塞)
WAITING永久等待状态
TIMEDJVAITING等待指定的时间重新被唤醒的状态
TERMINATED执行完成
12、在Java程序中怎么保证多线程的运行安全?
【仅供参考】
方法一:使用安全类,比如Java.util,concurrent下的类。
方法二:使用自动锁synchronizedo
方法三:使用手动锁Lock。
手动锁Java示例代码如下:
Locklock=newReentrantLockO;
lock,lock();
try(
System,out.printin("获得锁”);
}catch(Exceptione){
//TODO:handleexception
}finally{
System,out.printin("释放锁”);
lock,unlock0;
)
13、synchronized各种加锁场景的作用范围
【仅供参考】
1.作用于非静态方法,锁住的是对象实例(this),每一个对象实例有一个锁。
publicsynchronizedvoidmethod(){}
2.作用于静态方法,锁住的是类的Class对象,因为Class的相关数据存储在
永久代元空间,元空间是全局共享的,因此静态方法锁相当于类的一个全局
锁,会锁所有调用该方法的线程。
publicstaticsynchronizedvoidmethod(){}
3.作用于Lock.class,锁住的是Lock的Class对象,也是全局只有一个。
synchronized(Lock,class){}
4.作用于this,锁住的是对象实例,每一个对象实例有一个锁。
synchronized(this){}
5.作用于静态成员变量,锁住的是该静态成员变量对象,由于是静态变量,因
此全局只有一个。
publicstaticObjectmonitor=newObject();synchronized(monitor)
{}
14、什么是CAS
【仅供参考】
CAS是compareandswap的缩写,即我们所说的比较交换。
cas是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观
锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程
才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资
源,比如通过给记录加version来获取数据,性能较悲观锁有很大的提高。
CAS操作包含三个操作数一一内存位置(V)、预期原值(A)和新值(B)。如
果内存地址里面的值和A的值是一样的,那么就将内存里面的值更新成Bo
CAS是通过无限循环来获取数据的,若果在第一轮循环中,a线程获取地址里
面的值被b线程修改了,那么a线程需要自旋,到下次循环才有可能机会执
行。
java.util.concurrent.atomic包下的类大多是使用CAS操作来
实现的
(Atomiclnteger,AtomicBoolean,AtomicLong)。
15、JavaConcurrencyAPI中的Lock接口(Lockinterface)是什么?对比
同步它有什么优势?
【仅供参考】
Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的
结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。
它的优势有:
(1)可以使锁更公平
(2)可以使线程在等待锁的时候响应中断
(3)可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段
时间
(4)可以在不同的范围,以不同的顺序获取和释放锁
16、JAVA两种方式的动态代理?
【仅供参考】
JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方
法前调用InvokeHandler来处理。
CGLIB动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源
包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处
理。
区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指
定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能
代理final修饰的类。
17^java反射的作用是什么?
【仅供参考】
反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方
法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类
的名字,就可以通过反射机制来获得类的所有信息。这种动态获取的信息以及
动态调用对象的方法的功能称为java语言的反射机制。
18、说一下堆栈的区别?
【仅供参考】
功能方面:堆是用来存放对象的,栈是用来执行程序的。
共享性:堆是线程共享的,栈是线程私有的。
空间大小:堆大小远远大于栈。
19、什么是双亲委派模型?
【仅供参考】
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,
而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,
因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载
器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,
子加载器才会尝试自己去加载。
20、说一下JVM有哪些垃圾回收器?
【仅供参考】
Serial:最早的单线程串行垃圾回收器。
SerialOld:Serial垃圾回收器的老年版本,同样也是单线程的,可以作为
CMS垃圾回收器的备选预案。
ParNew:是Serial的多线程版本。
Parallel和ParNew收集器类似是多线程的,但Parallel是吞吐量优先的收
集器,可以牺牲等待时间换取系统的吞吐量。
ParallelOld是Parallel老生代版本,Parallel使用的是复制的内存回收
算法,ParallelOld使用的是标记-整理的内存回收算法。
CMS:一种以获得最短停顿时间为目标的收集器,非常适用B/S系统。
G1:一种兼顾吞吐量和停顿时间的GC实现,是JDK9以后的默认GC选项。
三、JavaWeb篇
1、常用HTTP状态码是怎么分类的?
【仅供参考】
状态码类别描述
Ixx信息状态码信息,服务器收到请求,需要请求者继续执行操作
2xx成功状态码成功,操作被成功接收并处理
3xx重定向状态码重定向,需要进一步的操作以完成请求
4xx客户端错误状态码客户端错误,请求包含语法错误或无法完成请求
5xx服务器错误状态码服务器错误,服务器在处理请求的过程中发生了错误
HTTP1.0和HTTP1.1和HTTP2.0的区别
HTTP1.0:无状态,无连接
HTTP1.1:长连接,请求管道化,增加缓存处理,增加Host字段,支持断点传
输
HTTP2.0:二进制分帧,多路复用(连接共享),头部压缩,服务器推送
2、三次握手和四次挥手
【仅供参考】
三次握手:
(1)客户端向服务器发出连接请求等待服务器确认
(2)服务器向客户端返回一个响应告诉客户端收到了请求
(3)客户端向服务器再次发出确认信息,此时连接建立
四次挥手:
(1)客户端向服务器发出取消连接请求
(2)服务器向客户端返回一个响应,表示收到客户端取消请求
(3)服务器向客户端发出确认取消信息(向客户端表明可以取消连接了)
(4)客户端再次发送确认消息,此时连接取消
3、说一下tcp粘包是怎么产生的?
【仅供参考】
tcp粘包可能发生在发送端或者接收端,分别来看两端各种产生粘包的原因:
发送端粘包:发送端需要等缓冲区满才发送出去,造成粘包;
接收方粘包:接收方不及时接收缓冲区的包,造成多个包接收。
4、http和https的基本概念
【仅供参考】
-HTTP:
是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求
和应答的标准(TCP),用于计算机之间传输文字,图片,音频,视频等超文本
数据的协议,它可以使浏览器更加高效,使网络传输减少
-HTTPS:
是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入
SSL层,HTTPS的安全基础是SSL,HTTPS就是从HTTP加上加密处理(一般是
SSL安全通信线路)+认证+完整性保护
-HTTPS协议的主要作用:
建立一个信息安全通道,来保证数据传输的安全
确认网站的真实性
5、http响应码301和302代表的是什么?有什么区别?
【仅供参考】
301:永久重定向。
302:暂时重定向。
它们的区别是,301对搜索引擎优化(SE0)更加有利;302有被提示为网络拦
截的风险。
6、说一下JSP的4种作用域?
【仅供参考】
page:代表与一个页面相关的对象和属性。
request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越
多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用
域。
session:代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个
用户相关的数据应该放在用户自己的session中。
application;代表与整个Web应用程序相关的对象和属性,它实质上是跨越
整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
7、什么是长连接和短连接
【仅供参考】
在HTTP/L0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP
操作,就建立一次连
接,任务结束就中断连接
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP
协议,会在响应头加
入这行代码:Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传
输HTTP数据的TCP连
接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连
接。Keep-Alive不会
永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中
设定这个时间。实现
长连接需要客户端和服务端都支持长连接
8、forward和redirect的区别?
【仅供参考】
forward是转发和redirect是重定向:
地址栏url显示:fowardurl不会发生改变,redirecturl会发生改变;
数据共享:forward可以共享request里的数据,redirect不能共享;
效率:forward比redirect效率高。
9、spring有哪些主要模块?
【仅供参考】
springcore:框架的最基础部分,提供ioc和依赖注入特性。
springcontext:构建于core封装包基础上的context封装包,提供了一种
框架式的对象访问方法。
springdao:DataAccessObject提供了JDBC的抽象层。
springaop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
springWeb:提供了针对Web开发的集成特性,例如文件上传,利用servlet
listeners进行ioc容器初始化和针对Web的ApplicationContexto
springWebmvc:spring中的mvc封装包提供了Web应用的Model-View-
Controller(MVC)的实现。
10>说一下springmvc运行流程?
【仅供参考】
springmvc先将请求发送给DispatcherServleto
DispatcherServlet查询一1个或多个HandlerMapping,找到处理请求的
Controller。
DispatcherServlet再把请求提交到对应的Controller。
Controller进行业务逻辑处理后,会返回一个ModelAndView。
Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView
对象指定的视图对象。
视图对象负责渲染返回给客户端。
11、SpringBoot的核心注解是哪个?它主要由哪几个注解组成的?
【仅供参考】
启动类上面的注解是@SpringBootApplication,它也是SpringBoot的核心注
解,主要组合包含了以下3个注解:
@SpringBootConfiguration:组合了©Configuration注解,实现配置文件的
功能。
@Enab1eAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置
的选项,如关闭数据源自动配置功能:
©SpringBootApplication(exclude=
{DataSourceAutoConfiguration.class})。
©ComponentScan:Spring组件扫描。
12、SpringBoot、SpringMVC和Spring有什么区别?
【仅供参考】
Spring:
Spring最重要的特征是依赖注入。所有SpringModules不是依赖注入就是
I0C控制反转。
当我们恰当的使用DI或者是I0C的时候,我们可以开发松耦合应用。松耦合
应用的单元测试可以很容易的进行。
SpringMVC:
SpringMVC提供了一种分离式的方法来开发Web应用。通过运用像
DispatcherServelet,MoudlAndView和ViewResolver等一些简单的概念,开
发Web应用将会变的非常简单。
SpringBoot:
Spring和SpringMVC的问题在于需要配置大量的参数。
SpringBoot通过一个自动配置和启动的项来目解决这个问题。为了更快的构
建产品就绪应用程序,SpringBoot提供了一些非功能性特征。
13>springboot读取配置文件的方式
【仅供参考】
springboot默认读取配置文件为application,properties或者是
application,yml
14、JPA和Hibernate有哪些区别?
【仅供参考】
简而言之
JPA是一个规范或者接口
Hibernate是JPA的一个实现
当我们使用JPA的时候,我们使用javax.persistence包中的注释和接口
时,不需要使用hibernate的导入包。
我们建议使用JPA注释,因为哦我们没有将其绑定到Hibernate作为实现。
后来(我知道-小于百分之一的几率),我们可以使用另一种JPA实现。
15、SpringBoot还提供了其它的哪些StarterProjectOptions?
【仅供参考】
SpringBoot也提供了其它的启动器项目包括,包括用于开发特定类型应用程
序的典型依赖项。
spring-boot-starter-web-services-SOAPWebServices;
spring-boot-starter-web-Web和RESTful应用程序;
spring-boot-starter-test-单元测试和集成测试;
spring-boot-starter-jdbc-传统的JDBC;
spring-boot-starter-hateoas-为服务添加HATEOAS功能;
spring-boot-starter-security-使用SpringSecurity进行身份验证和授
权;
spring-boot-starter-data-jpa一带有Hibeernate的SpringDataJPA;
spring-boot-starter-data-rest-使用SpringDataREST公布简单的REST
服务;
16、为什么我们需要spring-boot-maven-plugin?
【仅供参考】
spring-boot-maven-plugin提供了一些像jar一样打包或者运行应用程序的
命令。
1、spring-boot:run运行你的SpringBooty应用程序。
2、spring-boot:repackage重新打包你的jar包或者是war包使其可执
行
3、spring-boot:start和spring-boot:stop管理SpringBoot应用程
序的生命周期(也可以说是为了集成测试)。
4、spring-boot:buiId-info生成执行器可以使用的构造信息。
17、开启SpringBoot特性有哪几种方式?
【仅供参考】
1)继承spring-boot-starter-parent项目
2)导入spring-boot-dependencies项目依赖
18、MyBatis有哪些执行器(Executor)?
【仅供参考】
MyBatis有三种基本的Executor执行器:
SimpleExecutor:每执行一次update或select就开启一个Statement对
象,用完立刻关闭Statement对象;
ReuseExecutor:执行update或select,以SQL作为key查找Statement
对象,存在就使用,不存在就创建,用完后不关闭Statement对象,而是放置
于Map内供下一次使用。简言之,就是重复使用Statement对象;
BatchExecutor:执行update(没有select,jdbc批处理不支持select),
将所有SQL都添加到批处理中(addBatch。),等待统一执行
(executeBatch()),它缓存了多个Statement对象,每个Statement对象都
是addBatch()完毕后,等待逐一执行executeBatch。批处理,与jdbc批处
理相同。
19、为什么要使用hibernate?
【仅供参考】
hibernate是对jdbc的封装,大大简化了数据访问层的繁琐的重复性代码。
hibernate是一个优秀的ORM实现,很多程度上简化了DA0层的编码功能。
可以很方便的进行数据库的移植工作。
提供了缓存机制,是程序执行更改的高效。
20、hibernate实体类必须要有无参构造函数吗?为什么?
【仅供参考】
hibernate中每个实体类必须提供一个无参构造函数,因为hibernate框架要
使用reflectionapi,通过调用Classnewlnstance()来创建实体类的实例,
如果没有无参的构造函数就会抛出异常。
四、Java数据缓存,消息队列篇
1、RabbitMQ集群中唯一一个磁盘节点崩溃了会发生什么情况?
【仅供参考】
如果唯一磁盘的磁盘节点崩溃了,不能进行以下操作:
不能创建队列
不能创建交换器
不能创建绑定
不能添加用户
不能更改权限
不能添加和删除集群节点
唯一磁盘节点崩溃了,集群是可以保持运行的,但你不能更改任何东西。
2、RabbitMQ有哪些重要的角色?
【仅供参考】
RabbitMQ中重要的角色有:生产者、消费者和代理:
生产者:消息的创建者,负责创建和推送数据到消息服务器;
消费者:消息的接收方,用于处理数据和确认消息;
代理:就是RabbitMQ本身,用于扮演“快递”的角色,本身不生产消息,只
是扮演“快递”的角色。
3、RabbitMQ的使用场景有哪些?
【仅供参考】
抢购活动,削峰填谷,防止系统崩塌。
延迟信息处理,比如10分钟之后给下单未付款的用户发送邮件提醒。
解耦系统,对于新增的功能可以单独写模块扩展,比如用户确认评价之后,新
增了给用户返积分的功能,这个时候不用在业务代码里添加新增积分的功能,
只需要把新增积分的接口订阅确认评价的消息队列即可,后面再添加任何功能
只需要订阅对应的消息队列即可。
4、RabbitMQ的消息是怎么发送的?
【仅供参考】
首先客户端必须连接到RabbitMQ服务器才能发布和消费消息,客户端和
rabbitserver之间会创建一个tcp连接,一旦tcp打开并通过了认证(认
证就是你发送给rabbit服务器的用户名和密码),你的客户端和RabbitMQ就
创建了一条amqp信道(channel),信道是创建在“真实”tcp上的虚拟连
接,amqp命令都是通过信道发送出去的,每个信道都会有一个唯一的id,不
论是发布消息,订阅队列都是通过这个信道完成的。
5、RabbitMQ怎么避免消息丢失?
【仅供参考】
把消息持久化磁盘,保证服务器重启消息不丢失。
每个集群中至少有一个物理磁盘,保证消息落入磁盘。
6、zookeeper怎么保证主从节点的状态同步?
【仅供参考】
zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实
现这个机制的协议叫做zab协议。zab协议有两种模式,分别是恢复模式(选
主)和广播模式(同步)。当服务启动或者在领导者崩溃后,zab就进入了恢复
模式,当领导者被选举出来,且大多数server完成了和leader的状态同步
以后,恢复模式就结束了。状态同步保证了leader和server具有相同的系
统状态。
7^kafkaproducer如何优化打入速度?
【仅供参考】
增加线程
提高batch,size
增加更多producer实例
增加partition数
设置acks=~l时,如果延迟增大:可以增大num.replica,fetchers(follower
同步数据的线程数)来调解;
跨数据中心的传输:增加socket缓冲区设置以及OStcp缓冲区设置。
8、使用kafka集群需要注意什么?
【仅供参考】
集群的数量不是越多越好,最好不要超过7个,因为节点越多,消息复制需要
的时间就越长,整个群组的吞吐量就越低。
集群数量最好是单数,因为超过一半故障集群就不能用了,设置为单数容错率
更高。
9、集群中有3台服务器,其中一个节点宕机,这个时候zookeeper还可以
使用吗?
【仅供参考】
可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。
10、kafka中的broker是干什么的?
【仅供参考】
broker是消息的代理,Producers往Brokers里面的指定Topic中写消息,
Consumers从Brokers里面拉取指定Topic的消息,然后进行业务处理,
broker在中间起到一个代理保存消息的中转站。
11、说一下zookeeper的通知机制?
【仅供参考】
客户端端会对某个znode建立一个watcher事件,当该znode发生变化时,
这些客户端会收到zookeeper的通知,然后客户端可以根据znode变化来做
出业务上的改变。
12>当你使用kafka-topics.sh创建(删除)了一个topic之后,Kafka背后会
执行什么逻辑?
【仅供参考】
1)会在zookeeper中的/brokers/topics节点下创建一个新的topic节点,
如:/brokers/topics/first
2)触发Controller的监听程序
3)kafkaController负责topic的创建工作,并更新metadatacache
13、什么情况会导致kafka运行变慢?
【仅供参考】
cpu性能瓶颈
磁盘读写瓶颈
网络瓶颈
14、Redis持久化有几种方式?
【仅供参考】
Redis的持久化有两种方式,或者说有两种策略:
RDB(RedisDatabase):指定的时间间隔能对你的数据进行快照存储。
AOF(AppendOnlyFile):每一个收到的写命令都通过write函数追加到文件
中。
15、Redis有哪些功能?
【仅供参考】
数据缓存功能
分布式锁的功能
支持数据持久化
支持事务
支持消息队列
16、怎么保证缓存和数据库数据的一致性?
【仅供参考】
合理设置缓存的过期时间。
新增、更改、删除数据库操作时同步更新Redis,可以使用事物机制来保证数
据的一致性。
17、Redis和memcache有什么区别?
【仅供参考】
存储方式不同:memcache把数据全部存在内存之中,断电后会挂掉,数据不能
超过内存大小;Redis有部份存在硬盘上,这样能保证数据的持久性。
数据支持类型:memcache对数据类型支持相对简单;Redis有复杂的数据类
型。
使用底层模型不同:它们之间底层实现方式,以及与客户端之间通信的应用协
议不一样,Redis自己构建了vm机制,因为一般的系统调用系统函数的话,
会浪费一定的时间去移动和请求。
value值大小不同:Redis最大可以达到512mb;memcache只有Imbo
18、Redis为什么是单线程的?
【仅供参考】
因为cpu不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带
宽。既然单线程容易实现,而且cpu又不会成为瓶颈,那就顺理成章地采用单
线程的方案了。
关于Redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。
而且单线程并不代表就慢nginx和nodejs也都是高性能单线程的代表。
19、Redis怎么实现分布式锁?
【仅供参考】
Redis分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的
时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。
占坑一般使用setnx(setifnotexists)指令,只允许被一个程序占有,使用
完调用del释放锁。
20、Redis是什么?都有哪些使用场景?
【仅供参考】
Redis是一个使用C语言开发的高速缓存数据库。
Redis使用场景:
记录帖子点赞数、点击数、评论数;
缓存近期热帖;
缓存文章详情信息;
记录用户会话信息。
五、MySQL篇
1、char和varchar的区别是什么?
【仅供参考】
rchar(n)]:固定长度类型,比如订阅char(10),当你输入〃abc〃三个字符
的时候,它们占的空间还是10个字节,其他7个是空字节。
chat优点:效率高;缺点:占用空间;适用场景:存储密码的md5值,固定
长度的,使用char非常合适。
「varchar(n)」:可变长度,存储的值是每个值占用的字节再加上一个用来记
录其长度的字节的长度。
所以,从空间上考虑varcahr比较合适;从效率上考虑char比较合适,二者
使用需要权衡。
2、说一下MySQL的行锁和表锁?
【仅供参考】
MylSAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。
表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最
高,并发量最低。
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并
发度最高。
3、说一下MySQL常用的引擎?
【仅供参考】
InnoDB引擎:mysql5.1后默认的数据库引擎,提供了对数据库acid事务的
支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容
量的数据库系统。MySQL运行的时候,InnoDB会在内存中建立缓冲池,用于缓
冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不
会保存表的行数的,所以当进行selectcount(*)fromtable指令的时候,
需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度
较高的场景下使用会提升效率的。
MylASM引擎:不提供事务的支持,也不支持行级锁和外键。因此当执行插入和
更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。
不过和InnoDB不同的是,MylASM引擎是保存了表的行数,于是当进行
selectcount(*)fromtable语句时,可以直接的读取已经保存的值而不需要
进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的
支持的,可以将MylASM作为数据库引擎的首选。
4、MySQL是如何保证主备同步?
【仅供参考】
主备关系的建立:
一开始创建主备关系的时候,是由备库指定的,比如基于位点的主备关系,备
库说“我要从binlog文件A的位置P”开始同步,主库就从这个指定的位置开
始往后发。
而主备关系搭建之后,是主库决定要发给数据给备库的,所以主库有新的日志
也会发给备库。
MySQL主备切换流程:
客户端读写都是直接访问A,而节点B是备库,只要将A的更新都同步过来,
到本地执行就可以保证数据是相同的。
当需要切换的时候就把节点换一下,A的节点B的备库
一个事务完整的同步过程:
备库B和主库A建立来了长链接,主库A内部专门线程用于维护了这个长链
接。
在备库B上通过changemaster命令设置主库A的IP端口用户名密码以及从哪
个位置开始请求binlog包括文件名和日志偏移量
在备库B上执行start-slave命令备库会启动两个线程:io_lhread和
sqljhread分别负责建立连接和读取中转日志进行解析执行
备库读取主库传过来的binlog文件备库收到文件写到本地成为中转日志
后来由于多线程复制方案的引入,sql_thread演化成了多个线程。
5、什么是WAL技术,有什么优点?
【仅供参考】
WAL,中文全称是Write-AheadLogging,它的关键点就是日志先写内存,再写
磁盘。MySQL执行更新操作后,在真正把数据写入到磁盘前,先记录日志。
好处是不用每一次操作都实时把数据写盘,就算crash后也可以通过redo
log恢复,所以能够实现快速响应SQL语句。
6、Xid在MySQL内部是怎么生成的呢?
【仅供参考】
MySQL内部维护了一个全局变量global_query_id,每次执行语句(包括
select语句)的时候将它赋值给Query_id,然后给这个变量加1。如果当前
语句是这个事务执行的第一条语句,那么MySQL还会同时把Query_id赋值给
这个事务的Xido
而global_query_id是一个纯内存变量,重启之后就清零了。所以你就知道
了,在同一个数据库实例中,不同事务的Xid也是有可能相同的。但是MySQL
重启之后会重新生成新的binlog文件,这就保证了,同一个binlog文件
里,Xid一定是惟一的。
7、索引的常见类型以及它是如何发挥作用的?
【仅供参考】
根据叶子节点的内容,索引类型分为主键索引和非主键索引。
主键索引的叶子节点存的整行数据,在InnoDB里也被称为聚簇索引。
非主键索引叶子节点存的主键的值,在InnoDB里也被称为二级索引。
8、短时间提高MySQL性能的方法?
【仅供参考】
第一种方法:先处理掉那些占着连接但是不工作的线程。或者再考虑断开事务
内空闲太久的连接。killconnection+id
第二种方法:减少连接过程的消耗:慢查询性能问题在MySQL中,会引发性能
问题的慢查询,大体有以下三种可能:索引没有设计好;SQL语句没写好;
MySQL选错了索引(forceindex)。
9、MySQL是如何保证数据不丢失的?
【仅供参考】
只要redolog和binlog保证持久化磁盘就能确保MySQL异常重启后回复数据
在恢复数据时,redolog状态为commit则说明binlog也成功,直接恢复数
据;如果redolog是prepare,则需要查询对应的binlog事务是否成功,决
定是回滚还是执行。
10、count(*)实现方式以及各种count对比
【仅供参考】
对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都
取出来,返回给server层。server层拿到id后,判断是不可能为空的,就
按行累加。
对于count(1)来说,InnoDB引擎遍历整张表,但不取值。server层对于返
回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。单看这
两个用法的差别的话,你能对比出来,count(1)执行得要比count(主键id)
快。因为从引擎返回id会涉及到解析数据行,以及拷贝字段值的操作。
对于count(字段)来说:如果这个“字段”是定义为notnull的话,一行行
地从记录里面读出这个字段,判断不能为null,按行累加;如果这个“字段”
定义允许为null,那么执行的时候,判断到有可能是null,还要把值取出来
再判断一下,不是null才累加。也就是前面的第一条原则,server层要什么
字段,InnoDB就返回什么字段。
但是count*是例外,并不会把全部字段取出来,而是专门做了优化,不取
值。count(*)肯定不是null,按行累加。
所以结论是:按照效率排序的话,count(字段)〈count(主键
id)〈count(1)—count(X),所以建议尽量使用count(*)0
11、说一下数据库的事务隔离?
【仅供参考】
MySQL的事务隔离是在MySQL,ini配置文件里添加的,在文件的最后添加:
«transaction-isolation=REPEATABLE-READ
99
可用的配置值:READ-UNCOMMITTED,READ-COMMITTED.REPEATABLE-READ.
SERIALIZABLEo
READ-UNCOMM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新版五年级英语下册教案
- 上课迟到检讨书(合集15篇)
- 行业调研报告汇编4篇
- 中考热点素材集合15篇
- 电子公司实习报告汇编7篇
- 《呼兰河传》读书笔记(15篇)
- 边城读书笔记(15篇)
- 喹诺酮类抗菌药物合理使用的理性思考
- 七年级地理教学工作计划范例(20篇)
- 入伍保留劳动关系协议书(2篇)
- 2024版带货主播电商平台合作服务合同范本3篇
- 2025公司资产划转合同
- 2024-2030年中国铝汽车紧固件行业销售规模与盈利前景预测报告
- 广东省清远市2023-2024学年高一上学期期末质量检测物理试题(解析版)
- 2024-2025学年人教版数学五年级上册期末检测试卷(含答案)
- 《外盘期货常识》课件
- 【MOOC】土力学-西安交通大学 中国大学慕课MOOC答案
- 工程设计-《工程勘察设计收费标准》(2002年修订本)-完整版
- 2024年展览主场服务合同
- 工厂铣工安全培训课件
- 餐饮组织架构图(完整版)-20210618215128
评论
0/150
提交评论