一、Java 基础
1.JDK 和 JRE 有什么区别?
jdk:java development kit
jre:java runtime Environment
jdk是面向开发人员的,是开发工具包,包括开发人员需要用到的一些类。
jre是java运行时环境,包括java虚拟机等,是提供给使用java的人用的
篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
2.== 和 equals 的区别是什么?
==比较的是两个对象,包括对象的地址位,如果比较的两个对象地址位不同,值相同也会返回false
equals比较的是两个字符串的值,只要值相同,就会返回true
3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,hashCode也是可以重写的,所以不一定。
反之,如果equals()相同,那么hashCode是一定相等的。
4.final 在 java 中有什么作用?
修饰类不可被继承;
修饰方法不可被重写;
修饰变量不能被修改。
5.JAVA 中的 Math.round(-1.5) 等于多少?
-1
向上取整Math.ceil();
向下取整Math.floor();
四舍五入Math.round(x); //==Math.floor(x+0.5)
6.String 属于基础的数据类型吗?
不属于,是final修饰的Java类。
java中的基本数据类型:byte、char、short、int、long、float、double、boolean
7.java 中操作字符串都有哪些类?它们之间有什么区别?
String、StringBuffer、StringBuilder
String类型的字符串是不可变的,StringBuffer和StringBuilder是可以对同一个对象做更新操作的
StringBuffer是线程安全的,StringBuilder不是线程安全的。
8.String str="i"与 String str=new String("i")一样吗?
不一样。他们不是同一个对象
前者如果定义多个变量都为相同值的话,会共用同一个地址,创建的对象应该放在了常量池中;
后者是创建了一个新的对象,放在的是堆内存中。
9.如何将字符串反转?
使用StringBuffer 或 StringBuilder 的 reverse 成员方法。
篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
10.String 类的常用方法都有那些?
"".toCharArray("");
"".charAt();
"".split();
"".indexOf();
"".equals();
"".contains();
"".length();
"".subString("");
"".replace("","");
11.抽象类必须要有抽象方法吗?
不是。抽象类可以没有抽象方法,但是如果你的一个类已经声明成了抽象类,即使这个类中没有抽象方法,它也不能再实例化,即不能直接构造一个该类的对象。如果一个类中有了一个抽象方法,那么这个类必须声明为抽象类,否则编译通不过。
12.普通类和抽象类有哪些区别?
普通类可以被继承,不能包含抽象方法,不可以被实现。
抽象类也可被继承,但是子类必须要实现父类中的抽象方法;
抽象类中的方法不能包含主体。
抽象类中的方法在扩展性和延伸性要比普通类的更好;
抽象类可以应用多态,普通类不可以。
13.抽象类能使用 final 修饰吗?
不能。
14.接口和抽象类有什么区别?
接口是要被实现的,抽象类是要被继承;
接口用interface修饰;抽象类使用abstract修饰;
两者均不能被实例化,方法都不包含主体;
一个类只能继承一个抽象类,但是可以实现多个接口。
15.java 中 IO 流分为几种?
字节流:InputStream、OutputStream
字符流:Reader、Writer
字节流是最基本的
1.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
2.字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
读文本的时候用字符流,例如txt文件。读非文本文件的时候用字节流,例如mp3。
16.BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO
NIO:Non IO 同步非阻塞 IO
AIO:Asynchronous IO 异步非阻塞IO
BIO是一个连接一个线程。JDK4之前的唯一选择
NIO是一个请求一个线程。JDK4之后开始支持,常见聊天服务器
AIO是一个有效请求一个线程。JDK7之后开始支持,常见相册服务器
17.Files的常用方法都有哪些?
file.getName();
file.getPath();
file.delete();
file.exits();
file.createDirectory();
file.copy();
file.move();
file.size();
file.read();
file.write();
18.重写和重载的区别
重载:必须有不同的参数列表;可以有不同的访问修饰符;可以抛出不同的异常;
重写:参数列表必须要与被重写的相同;返回的类型必须保持一致;修饰符和抛出的异常不能在被重写的方法之外
重写是父类与子类的关系,是垂直关系;重载是同一个类方法中的关系,是水平关系。
19.什么是多态
一种事物的多种表现形态就是多态,比如定义一个类为动物,那么动物可以被子类继承,从而实现具体动物的方法。
二、容器
1.java 容器都有哪些?
数组、Util下的容器:Collection(Set、List)、Map
2.Collection 和 Collections 有什么区别?
Collection是集合的接口,其实现类有List和Set;
Collections是工具类,包含许多有关集合操作的静态多态方法,可以直接使用。
3.List、Set、Map 之间的区别是什么?
List:有序集合、元素可重复
Set:元素不可重复,HashSet无序,LinkedHashSet按照插入排序,SortedSet可排序
Map:键值对集合,存储键、值之间的映射。key无序,唯一,value可重复
4.HashMap 和 Hashtable 有什么区别?
HashMap不是线程安全的,HashTable是线程安全的
HashMap允许Null Key和Null Value,HashTable不允许
5.如何决定使用 HashMap 还是 TreeMap?
如果需要得到一个有序的结果应该使用TreeMap
如果不需要排序最好选用HashMap,性能更优
6.说一下 HashMap 的实现原理?
HashMap基于Hash算法实现,通过put(key,value)存储,get(key)来获取value
当传入key时,HashMap会根据key,调用Hash(Object key)方法,计算出Hash值,根据Hash值将Value保存在Node对象里,Node对象保存在数组里。
当计算出的Hash值相同时,称为Hash冲突,HashMap的做法是用链表和红黑树存储相同Hash值的value
当Hash冲突的个数:小于等于8使用链表,大于8使用红黑树解决链表查询慢的问题。
7.说一下 HashSet 的实现原理?
HashSet是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet的操作相对比较简单,相关HashSet的操作,基本上都是直接调用底层的HashMap的相关方法来完成,HashSet不允许有重复的值,并且元素是无序的
篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
8.ArrayList 和 LinkedList 的区别是什么?
ArrayList的数据结构是动态数组;LinkedList的数据结构是双向链表。
ArrayList比LinkedList在随机访问的时候效率要高,因为LinkedList是线性的数据结构,需要依次往后查找
在非首尾的增删操作,LinkedList要比ArrayList的效率要高,因为ArrayList在操作增删时要影响其他元素的下标
总结:需要频繁读取集合中的元素时,推荐使用ArrayList;插入和删除操作较多时,推荐使用LinkedList
9.如何实现数组和 List 之间的转换?
List转数组:String[] list = List.toArray(array);//array为List
数组转List:List list = java.util.Arrays.asList(array);//array为数组
10.ArrayList 和 Vector 的区别是什么?
相同点:都实现了List接口,都是有序集合
区别:Vector是线程安全的,ArrayList不是线程安全的;
当Vector或ArrayList中的元素超过它的初始大小时,Vector会将容量翻倍,而ArrayList只会将容量扩大50%
11.Array 和 ArrayList 有何区别?
Array类型的变量在声明时必须实例化;ArrayList可以只是先声明;
Array大小是固定的,而ArrayList的大小是动态变化的;
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型
12.在 Queue 中 poll()和 remove()有什么区别?
Queue中poll()和remove()都是用来从队列头部删除一个元素;
在队列元素为空的情况下,remove()方法会抛出NoSuchElementException异常,而poll()只会返回null
13.哪些集合类是线程安全的?
- Vector:相比ArrayList多了线程安全;
- HashTable:相比HashMap多了线程安全;
- ConcurrentHashMap:高效且线程安全;
- Stack:继承于Vector,也是线程安全
14.迭代器 Iterator 是什么?
迭代器是一种设计模式,它是一个对象,可以遍历并选择序列中的对象。
15.Iterator 怎么使用?有什么特点?
next();
hashNext();
remove();
Iterator接口被Collection接口继承,Collection接口的iterator()方法返回一个iterator对象。
16.Iterator 和 ListIterator 有什么区别?
ListIterator有add()方法,可以向List中添加对象,而Iterator不能;
ListIterator有hasPrevious()和previous()方法,可以向前遍历,Iterator不能;
ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现;
ListIterator可以实现对对象的修改,使用set()实现;而Iterator只能遍历,不能修改
17.怎么确保一个集合不能被修改?
可以使用Collections.unmodifiableCollection(Collection c) 方法创建一个只读集合
这样改变集合的任何操作都会抛出Java. lang. UnsupportedOperationException异常。
三、多线程
1.并行和并发有什么区别?
并行是指两个或多个事件在同一时刻发生,是在不同实体上的多个事件;
并发是指两个或多个事件在同一时间间隔发生,是在同一个实体上的多个事件
2.线程和进程的区别?
进程是资源分配最小单位,线程是程序执行最小单位
每个进程都有相应的线程
进程有独立的地址空间,线程没有
线程是指处理机调度的基本单位
进程执行开销大,线程执行开销小
3.守护线程是什么?
在java线程开发中,有两种线程:User Thread(用户线程);Daemon Thread(守护线程)
普通用户进程在JVM退出时依然会继续执行,导致JVM并不能退出
普通进程可以使用setDaemon(true)方法升级为守护进程,守护进程在JVM退出时会自动结束运行。
守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点
4.创建线程有哪几种方式?
继承Thread类并实现run方法,调用继承类的start方法开启线程;
通过实现Runnable接口,重写run方法,调用线程对象的start方法开启线程;
除此之外,还可以通过实现Callable接口,实现call方法,并用FutureTask类包装Callable对象开启线程。
5.说一下 runnable 和 callable 有什么区别?
实现Callable接口的任务线程能返回执行结果,而实现Runnable接口的任务线程并不能返回执行结果
Callable接口的call方法允许抛出异常,而Runnable接口的run方法的异常只能在内部消化,不能继续上抛
6.线程有哪些状态?
新建、就绪、运行、阻塞、死亡
7.sleep() 和 wait() 有什么区别?
sleep后程序不会释放同步锁,wait后程序会释放同步锁
sleep可以指定睡眠时间,自动唤醒,wait可以直接用notify唤醒
sleep的类是Thread,wait的类是Object
8.notify()和 notifyAll()有什么区别?
notify()方法会唤醒对象等待池中的一个线程,进入锁池;
notifyAll()方法会唤醒等待池中的所有线程,进入锁池
9.线程的 run()和 start()有什么区别?
调用start()方法是用来启动线程的,轮到该线程执行时,会自动调用run方法;
直接运行run方法无法达到启动多线程的目的,相当于调用Thread对象中的run方法
一个线程的start方法只能调用一次,多次调用会抛出异常;而run方法可以多次调用
10.创建线程池有哪几种方式?
主要使用Excutors提供的通用线程池创建方法,去创建不同配置的线程池
newCachedThreadPool();特点:用来处理大量短时间工作任务的线程池
newFixedThreadPool(int nThreads);特点:重用指定数目(nThreads)的线程
newSingleThreadExecutor();特点:工作线程数目限制为1
newSingleThreadScheduledExecutor()和newScheduledThreadPool(int corePoolSize)可以进行周期或定时性的工作调度
newWorkStealingPool(int parallelism);特点:JDK8以后才加入
11.线程池都有哪些状态?
RUNNING:线程池被创建,可以接收新线程
SHUTDOWN:线程池被关闭,不接收新线程,但是可以处理已有的线程。通过调用shutdown()方法;
STOP:线程池停止,不接受新线程,中断当前的线程,并且不会处理已有的线程。通过调用shutdownnow()方法;
TIDYING:线程池等待,当线程池处于SHUTDOWN或者STOP状态,并且任务队列为空且执行中任务为空则会转变;
TERMINATED:线程池彻底终止,线程池在TIDYING状态中执行完terminated()方法后就会转变为此状态。
篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
12.线程池中 submit()和 execute()方法有什么区别?
execute() 参数 Runnable ;submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable)
execute() 没有返回值;而 submit() 有返回值
submit()的返回值Future调用get方法时,可以捕获处理异常
13.在 java 程序中怎么保证多线程的运行安全?
JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
synchronized、volatile、LOCK,可以解决可见性问题
Happens-Before 规则可以解决有序性问题
14.多线程锁的升级原理是什么?
锁的级别:无锁 => 偏向锁 => 轻量级锁 => 重量级锁
无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个能修改成功,其他的线程会不断尝试,直至修改成功。
偏向锁:对象的代码一直被同一线程执行,不存在多个线程竞争,偏向锁,指的就是偏向第一个加锁线程,该线程不会主动释放偏向锁,只有当其他线程尝试竞争偏向锁时才会被释放。
偏向锁的撤销,需要在某个时间点上没有字节码正在执行时,先暂停拥有偏向锁的线程,然后判断锁对象是否处于被锁定状态。如果线程不处于活动状态,则将对象头设置成无锁状态,并撤销偏向锁;
如果线程处于活动状态,升级为轻量级锁的状态。
轻量级锁:轻量级锁是指当锁是偏向锁的时候,被第二个线程 B 所访问,此时偏向锁就会升级为轻量级锁,线程 B 会通过自旋的形式尝试获取锁,线程不会阻塞,从而提高性能。当前只有一个等待线程,则该线程将通过自旋进行等待。但是当自旋超过一定的次数时,轻量级锁便会升级为重量级锁;当一个线程已持有锁,另一个线程在自旋,而此时又有第三个线程来访时,轻量级锁也会升级为重量级锁。
重量级锁:指当有一个线程获取锁之后,其余所有等待获取该锁的线程都会处于阻塞状态。
15.什么是死锁?
死锁是指两个或两个以上的进程在竞争资源的过程中造成的不可解堵塞。两个线程都在互相等待。
16.怎么防止死锁?
预防:资源一次性分配;可剥夺资源;资源有序分配;超时放弃
避免:银行家算法;
检测:为每个进程和每个资源建立唯一的ID,建立资源分配表和进程等待表
解除:剥夺资源;撤销进程
17.ThreadLocal 是什么?有哪些使用场景?
ThreadLocal是线程本地存储,在每个线程中都创建了一个ThreadLocalMap对象,每个线程可以访问自己内部ThreadLocal对象内的value。
经典的使用场景是为每个线程分配一个JDBC连接的Connection,这样就可以保证每个线程都在各自的Connection上进行数据库的操作,不会出现A线程关了B线程的Connection,还有Session管理等问题。
18.说一下 synchronized 底层实现原理?
同步代码块是通过monitorenter和monitorexit指令获取线程的执行权;
同步方法是通过加ACC_SYNCHRONIZED 标识实现线程的执行权的控制
19.synchronized 和 volatile 的区别是什么?
- volatile本质是在告诉vm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
synchronize则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞。- volatile仅能实现变量的修改可见性,不能保证原子性;synchronize可以保证变量的修改可见性和原子性。
- volatile不会造成线程的阻塞;synchronize可能会造成线程的阻塞。
- volatile标记的变量不会被编译器优化,synchronize标记的变量可以被编译器优化
20.synchronized 和 Lock 有什么区别?
synchronized是关键字,属于jvm层面;Lock是具体类,是api层面的锁;
synchronized无法获取锁的状态,Lock可以判断;
synchronized用于少量同步,Lock用于大量同步。
21.synchronized 和 ReentrantLock 区别是什么?
synchronized代码执行结束后线程自动释放对锁的占用;Reentrantlock需要手动释放锁;
synchronized不可中断,除非抛出异常或者执行完成;Reentrantlock可中断;
synchronize非公平锁;Reentrantlock默认非公平锁,也可公平锁;
ReentrantLock用来实现分组唤醒需要唤醒的线程,可以精确唤醒,而不是像synchronized要么随机唤醒一个,要么唤醒全部线程。
22.说一下 atomic 的原理?
作用:多线程下将属性设置为atomic可以保证读取数据的一致性。
CAS(Compare And Swap),乐观锁的机制,先比较再交换,以实现原子性
23.理解乐观锁和悲观锁
乐观锁:认为每次去拿数据的时候别人不会修改,所以不会上锁,但是每次要拿数据的时候都会先判断数据是否被别人修改
悲观锁:认为每次去拿数据的时候别人都会修改,所以每次都会上锁。
使用场景:乐观锁使用于多读少写的应用类型,这样可以提高吞吐量;相反的情况则使用悲观锁
四、反射
1.什么是反射?
java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能成为java的反射机制。
2.什么是 java 序列化?什么情况下需要序列化?
序列化:将java对象转换成字节流的过程。
反序列化:将字节流转换成java对象的过程。
当java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理。
序列化的实现:类实现Serializable接口。
3.动态代理是什么?有哪些应用?
在运行时,创建一个新的类,即创建动态代理,可以调用和扩展目标类的方法。动态代理的类是自动生成的。
应用:Spring的AOP,加事务,加权限,加日志
4.怎么实现动态代理?
基于jdk,需要实现InvocationHandler接口,重写invoke方法。
基于cglib,需要jar包依赖;
五、对象克隆
61.为什么要使用克隆?
如果直接使用=给对象赋值的话,那么两个对象其实指向的是同一个地址,其中一个值改变时,另一个也会随之改变。
62.如何实现对象克隆?
1、实现Coloneable接口并重写Object类中的clone()方法;
2、实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
63.深克隆和浅克隆区别是什么?
深克隆:新旧对象不共享一个地址;
浅克隆:新旧对象共享一个地址,改变一个,另一个也会改变
篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
六、Java Web
1.jsp 和 servlet 有什么区别?
Jsp:Java Server Page,是一种动态页面技术,其根本是一个简化的Servlet设计,用来封装产生动态网页的逻辑处理。
Servlet:服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求与服务器响应的中间层。
相同点:jsp经编译后就变成了Servlet,jsp本质就是servlet,jvm只能识别java的类,不能识别jsp代码,web容器将jsp的代码编译成jvm能够识别的java类。
2.jsp 有哪些内置对象?作用分别是什么?
- request:用户端请求(get/post)
- response:网页传回用户端的响应
- pageContext:管理网页的属性
- session:与请求有关的会话期
- application servlet:正在执行的内容
- out:用来传送回应的输出
- config: servlet的架构部件
- page JSP:网页本身
- exception:针对错误网页,未捕捉的例外
3.说一下 jsp 的 4 种作用域?
- application:在所有应用程序中有效
- session:在当前会话中有效;
- request:在当前请求中有效;
- page:在当前页面有效
4.session 和 cookie 有什么区别?
- 存储位置不同
cookie的数据信息存放在客户端浏览器上
session的数据信息存放在服务器上- 存储容量不同
单个cookie保存的数据<=4Kb,一个站点最多保存20个cookie
对于session来说没有上限- 存储方式不同
cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据;
session中能够存储任何类型的数据- 隐私策略不同
cookie对客户端是可见的,所以它是不安全的;
session存储在服务器上,对客户端是透明的,不会信息泄露- 有效期不同
可以通过设置cookie的属性,使cookie长期有效;
session不能达到长期有效的结果- 服务器压力不同
cookie保存在客户端,不占用服务器资源
session是保存在服务器的,如果并发访问的用户十分多,会产生很多的session,耗费大量的内存- 浏览器支持不同
cookie是需要浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效
session只能在本窗口以及子窗口有效,而cookie可以为本浏览器上的一切窗口有效- 跨域支持不同
cookie支持跨域名访问
session不支持跨域名访问
5.说一下 session 的工作原理?
客户端登录完成之后,服务器会创建相应的session,session创建完成之后,会把session的id发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着sessionid,服务器拿到sessionid之后,在内存找到与之对应的session就可以正常工作了。
6.如果客户端禁止 cookie,session 还能用吗?
如果浏览器禁用了cookie,那么客户端访问服务端时无法携带sessionid,服务端无法识别用户身份,便无法进行会话控制,session就会失效,但是可以通过其他办法实现:
- 通过URL重写,把sessionid作为参数追加的原URL中,后续的浏览器与服务器交互中携带session
- 服务器的返回数据中包含sessionid,浏览器发送请求时,携带sessionid参数
7.spring mvc 和 struts 的区别是什么?
- 拦截机制不同
Struts2是类级别的拦截,每次请求就会创建一个Action
SpringMVC是方法级别的拦截,一个方法对应一个Request上下文。- 底层框架不同
Struts2采用Filter实现,SpringMVC采用Servlet实现- 性能不同
Struts2需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截。
所以,SpringMVC开发效率和性能高于Struts2- 配置方面
SpringMVC 和 Spring 是无缝的,从这个项目的管理和安全上也比Struts2高。
8.如何避免 sql 注入?
SQL注入是Web开发中最常见的一种安全漏洞,可以用它来从数据库获取敏感信息,进行数据库的一系列非法操作。
- 校验参数的数据格式是否合法
- 对进入数据库的特殊字符进行转义处理,或编码转换
- 预编译SQL,参数化查询方式,避免SQL拼接
- 发布前利用工具进行SQL注入检测
9.什么是 XSS 攻击,如何避免?
XSS(Cross Site Scripting)跨站脚本攻击,它是Web程序中常见的漏洞。
原理:攻击者往web页面里插入恶意的HTML代码,当用户浏览该页面时,嵌入其这个你的HTML代码会被执行,从而达到恶意攻击用户的目的。
避免措施:
- web页面中可由用户输入的地方,对输入的数据转义、过滤处理
- 前端对HTML标签属性、css属性赋值的地方进行校验
- 后台输出页面的时候,也需要对输出内容进行转义、过滤处理
10.什么是 CSRF 攻击,如何避免?
CSRF(Cross-site request forgery),也被称为one-click attack 或者 session riding,通常缩写为CSRF或XSRF,
是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
预防措施:
- 验证HTTP Referer字段
- 验证码
- 添加token验证
- 尽量使用post,限制get
七、异常
1.throw 和 throws 的区别?
throw:表示方法内抛出某种异常对象,如果异常对象不是RuntimeException,则需要在方法声明时加上该异常的抛出,即需要加上throws语句,或者在方法体内try catch异常,否则编译会报错;执行到throw语句则后面的语句块不再执行
throws:方法的定义上使用此关键字表示这个方法可能抛出某种异常,需要由方法的调用者进行异常处理。
2.final、finally、finalize 有什么区别?
final:修饰类时表示不能被继承;修饰方法时表示不能被重载;修饰变量时表示不能被修改。
finally:在异常处理时提供finally代码块来执行异常处理。
finalize:是方法名,java允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。
3.try-catch-finally 中哪个部分可以省略?
catch 和 finally可以被省略其中一个,finally代码块是无论是否捕捉到异常,都会执行finally代码块的逻辑。
4.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
捕获到异常后,不会直接返回,会先执行完finally代码块的语句继续执行catch代码块中的return。
5.常见的异常类有哪些?
NullPointerException、SQLException、IndexOutOfBoundException、NumberFormatException、FileNotFoundException
IOException、IllegalArgumentException、NoSuchMethodException
八、网络
1.http 响应码 301 和 302 代表的是什么?有什么区别?
301:Moved Permanently ——被请求的资源已经永久移动到新位置
302:Found——被请求URL临时转移到新的URL
其他的响应码:
信息响应(100-199)、成功响应(200-299)、重定向(300-399)、客户端错误(400-499)、服务器错误(500-599)
2.forward 和 redirect 的区别?
- redirect是客户端发起的请求;forward是服务端发起的请求
- redirect浏览器显示被请求的URL;forward浏览器地址不显示被请求的URL
- redirect重新开始一个request,原页面的request生命周期结束;
forward另一个连接的时候,request变量是在其生命周期内的。- redirect实质上是两次HTTP请求;forward是一次请求
3.简述 tcp 和 udp的区别?
- TCP是面向连接的,TCP提供可靠的服务,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达。
UDP是无连接的,没有可靠性,但是速度快,操作简单,要求系统资源较少,可以实现广播发送。- TCP是面向字节流的,UDP是面向报文的;TCP是全双工的可靠信道,UDP是不可靠信道
4.tcp 为什么要三次握手,两次不行吗?为什么?
- 两次握手只能保证单向连接是畅通的。
- 只有经过第三次握手,才能确保双向都可以收到对方发送的数据
篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
5.说一下 tcp 粘包是怎么产生的?
TCP粘包:发送方发送的多个数据包,到接收方缓冲区首尾相连,粘成一包,被接收
产生原因:TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
接收方原因:接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。
6.OSI 的七层模型都有哪些?
OSI(Open System Interconnection Reference Model)开放式系统互联网通信
应用层、表达层、会话层、传输层、网络层、数据链路层、物理层
7.get 和 post 请求有哪些区别?
- get是从服务器上获取数据;post是向服务器传送数据
- get请求通过URL直接请求数据,数据信息可以在URL中看到;post请求是放在请求头中的,用户看不到;
- get传送的数据量小,有限制,不能大于2kb,post传送的数据可以没有限制
- get安全性比较低,post相对较安全
8.如何实现跨域?
- 使用JSONP,利用了script不受同源策略的限制;
- 代理跨域请求;
- HTML5 postMessage方法;
- 修改document.domain跨子域;
- 基于HTML5 websocket协议
9.说一下 JSONP 实现原理?
同源:同协议、同主机、同端口号
json是一种数据格式,jsonp是一种数据调用的方式,带callback的json就是jsonp。
首先在客户端注册一个callback,然后把callback的名字传给服务器,此时,服务器先生成json数据,然后以JavaScript语法的方式,生成function,返回给客户端,客户端解析script,并执行callback函数。
简单的说,就是利用script标签没有跨域限制的"漏洞"来达到与第三方通讯的目的。
10.单工、半双工、全双工
单工:只支持数据在一个方向上传输;
半双工:允许数据在两个方向上传输,但在某一时刻,只允许数据在同一个方向上传输;
全双工:允许数据可以同时接收和发送信息,实现双向通信
九、设计模式
1.说一下你熟悉的设计模式?
单例模式:懒汉式(先声明变量,等到实际用到时再创建对象)饿汉式(直接创建对象)
工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。
适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起使用的类能够在一起工作。
模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑,不同的子类可以从不同的方式实现这些抽象方法,从而实现不同的业务逻辑。
2.简单工厂和抽象工厂有什么区别?
- 简单工厂
由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数创建不同的对象的实例。可以生产结构中的任意产品,不能增加新的产品。- 抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类,生产多个系列产品,生产不同产品族的全部产品,不能新增产品,可以新增产品族。
十、Spring/Spring MVC
1.为什么要使用 spring?
- 方便解耦,便于开发
- 支持aop编程
- 声明式事务的支持
- 方便程序的测试
- 方便集成各种优秀的框架
- 降低JavaEE API的使用难度
2.解释一下什么是 aop?
AOP(Aspect Oriented Programming)面向切面编程
通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
通俗的解释:在运行时,动态的将代码切入到类的指定方法、指定位置的编程思想就是面向切面的编程。
3.解释一下什么是 ioc?
IOC(Inversion Of Control)控制反转
它是一种设计思想,在java开发中,将设计好的对象交给容器控制,而不是显示地用代码进行对象的创建。
把创建和查找依赖对象的控制权交给IOC容器,由IOC容器进行注入、组合对象,这样对象与对象之间是松耦合,便于测试,功能可复用,使得程序的整个体系结构可维护,灵活性、扩展性变高。
4.spring 有哪些主要模块?
- Spring Core
框架的基础部分,提供IOC容器,对bean进行管理。- Spring Context
基于bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。- Spring DAO
提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法- Spring ORM
提供了常用的“对象/关系”映射APIs的集成层。其中包括JPA、JDO、hibernate、Mybatis等。- Spring AOP
提供了面向切面编程。- Spring Web
提供了基础的Web开发的上下文信息,可与其他Web进行集成。- Spring Web MVC
提供了Web应用的Model-View-Controller 全功能实现。
5.spring 常用的注入方式有哪些?
构造方法注入、setter注入、基于注解的注入
6.spring 中的 bean 是线程安全的吗?
Spring 中的Bean本身不具备线程安全的特性
7.spring 支持几种 bean 的作用域?
- singleton:单例,默认作用域
- prototype:原型,每次创建一个新对象
- request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下
- session:会话,同一个会话共享一个实例,不同会话使用不同的实例
- global-session:全局会话,所有会话共享一个实例
8.spring 自动装配 bean 有哪些方式?
- default:默认的方式和no方式一样
- no:不自动装配,需要使用<ref/>节点或参数
- byName:根据名称进行装配
- byType:根据类型进行装配
- constructor:根据构造函数进行装配
9.spring 事务实现方式有哪些?
- 编程式事务管理,需要在代码中调用beginTransaction()、commit()、rolback()等事务管理相关的方法
- 基于TransactionProxyFactoryBean的声明式事务管理
- 基于@Transactional的声明式事务管理
- 基于Aspectj AOP配置事务
10.说一下 spring 的事务隔离?
- 事务产生的问题
名称 数据的状态 实际行为 产生原因 脏读 未提交 打算提交但是数据回滚了,读取了提交的数据 数据的读取 不可重复读 已提交 读取了修改前的数据 数据的修改 幻读 已提交 读取了插入前的数据 数据的插入
- 事务隔离级别
名称
结果 脏读 不可重复读 幻读 Read UnCommitted(读未提交) 什么都不解决 √ √ √ Read Committed(读提交) 解决了脏读的问题 – √ √ Repeatable Read(重复读) 解决了不可重复读 – – √ Serializable(序列化) 解决所有问题 – – –
11.说一下 spring mvc 运行流程?
- 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获。(捕获)
- DispatcherServlet对请求 URL进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping获得该Handler配置的所有相关的对象(包括 Handler对象以及 Handler对象对应的拦截器),最后以 HandlerExecutionChain对象的形式返回;(查找 handler)
- DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。提取Request 中的模型数据,填充 Handler 入参,开始执行 Handler(Controller), Handler执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象(执行 handler)
- DispatcherServlet 根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver) (选择 ViewResolver)
- 通过 ViewResolver 结合 Model 和 View,来渲染视图,DispatcherServlet 将渲染结果返回给客户端。(渲染返回)
总结:核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回
12.spring mvc 有哪些组件?
- 前端控制器(DispatcherServlet)
- 处理器映射器(HandlerMapping)
- 处理器适配器(HandlerAdapter)
- 拦截器(HandlerInterceptor)
- 视图解析器(ViewResolver)
- 文件上传处理器(MultipartResolver)
- 异常处理器(HandlerExceptionResolver)
- 消息转换器(HttpMessageConverter)
- ...
13.@RequestMapping 的作用是什么?
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或者方法上,用来标识 http 请求地址与 Controller 类的方法之间的映射。
14.@Autowired 的作用是什么?
@Autowired是一个注解,他可以对类成员变量、方法及构造函数进行标注,让spring完成bean自动装配的工作。
十一、Spring Boot/Spring Cloud
1.什么是 spring boot?
SpringBoot是Spring开源框架下的子项目,是Spring的一站式解决方案,主要是简化了spring的使用难度,降低了对配置文件的要求,使得开发人员更容易上手。
2.为什么要用 spring boot?
- 简化了Spring配置文件
- 没有代码和XML文件的生成
- 内置tomcat
- 能够独立运行
- 简化监控
3.spring boot 核心配置文件是什么?
SpringBoot有两种类型的配置文件,application和Bootstrap文件
4.spring boot 配置文件有哪几种类型?它们有什么区别?
SpringBoot会自动加载classpath下的这两个文件,文件格式为properties或yml格式
- *.properties 是 key = value 的形式
- *.yml 是 key : value 的形式
Bootstrap配置文件是系统级别的,用来加载外部配置,也可以用来定义系统不会变化的属性,.bootstrap文件的加载要先于application文件
5.spring boot 有哪些方式可以实现热部署?
- Spring Loaded
- spring-boot-devtools
- JRebel插件
- 使用调试模式Debug实现热部署
- 模板热部署
6.jpa 和 hibernate 有什么区别?
JPA(Java Persistence API)
- Hibernate是JPA规范的一个实现。
- hibernate有JPA没有的特性
- hibernate的效率更高
- JPA有更好的移植性,通用性
7.什么是 spring cloud?
spring cloud是在SpringBoot基础上构建的,用于快速构建分布式系统的通用模式的工具集。
SpringCloud是一个微服务框架,提供全套的分布式系统解决方案。
篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
8.spring cloud 断路器的作用是什么?
当一个服务调用另一个服务,由于网络原因或者自身原因出现问题时,调用者就会等待被调用者的响应,当更多的服务请求到这些资源时,导致更多的请求等待,这样就会发生连锁效应,断路器就是为了解决这个问题。
- 全开:
一定时间内,达到一定的次数无法调用,并且多次检测没有恢复的迹象,断路器完全打开,那么下次请求就不会请求到该服务- 半开:
短时间内有恢复迹象,断路器会将部分请求发给该服务,当能正常调用时,断路器关闭。- 关闭:
当服务一直处于正常状态,能正常调用,断路器关闭
9.spring cloud 的核心组件有哪些?
- 服务发现——Netflix Eureka
- 客户端负载均衡——Netflix Ribbon
- 断路器——Netflix Hystrix
- 服务网关——Netflix Zuul
- 分布式配置——Spring Cloud Config
10.SpringBoot的启动流程
主要分为两个步骤:
1、创建SpringApplication对象。
2、调用SpringApplication对象的run()方法实现启动,并且返回当前容器的上下文。
详细步骤:
一、创建SpringApplication对象,SpringBoot容器的初始化操作。
三、setInitializers读取springboot包下的META-INF/spring.factories获取到对应的ApplicationContextInitializer装配到集合中
四、setListeners读取springboot包下面的META-INF/spring.factories获取到对应的ApplicationListener装配到集合中
五、mainApplicationClass获取当前运行的主函数
六、调用SpringApplication的run()方法实现启动
七、stopWatch.start();开始记录项目的启动时间
八、getRunListeners(args);读取META-INF/spring.factories,将SpringApplicationRunListeners类型存入带集合中
九、listeners.starting();循环调用starting()方法
十、ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
listeners.environmentPrepared(environment);循环读取配置文件到springboot容器中,因为配置文件可以自定义,就会存在多个。
十一、Banner printedBanner = printBanner(environment);打印Springboot启动标志
十二、context = createApplicationContext();创建springboot上下文
十三、prepareContext(context, environment, listeners, applicationArguments, printedBanner);为springboot上下文设置environment属性。
十四、refreshContext(context);刷新上下文
十七、afterRefresh(context,applicationArguments);定义一个空的模板给其他子类实现重写
十八、listeners.started(context);使用广播和回调机制通知监听器springboot容器启动成功
十九、listeners.running(context);使用广播和回调机制通知监听器springboot容器已成功running