Java复习面试大全

Java面试大全(部分无答案)

从基础到框架,总结了最经常遇到的问题,欢迎各位大佬制证,也欢迎各位收藏(部分没总结答案,见谅~对于博主的内容引用,致以最崇高的敬意!)

Java基础

1 jre与jdk的区别

jre是java运行时环境,jdk是java开发工具包,里面包含了jre与一些工具,jvm是java虚拟机,实现跨平台主要是因为jvm虚拟机。

2 ==与equals的区别

== 是java提供的等于比较运算符,用来比较两个变量指向的内存地址是否相同.而equals()是Object提供的一个方法.Object中equals()方法的默认实现就是返回两个对象==的比较结果.但是equals()可以被重写,所以我们在具体使用的时候需要关注equals()方法有没有被重写.

3 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

不对。不一定。在java中,equals和hashcode是有设计要求的,equals相等,则hashcode一定相等,反之则不然。重写equals()方法,必须重写hashCode()方法,以保证equals方法相等时两个对象hashcode返回相同的值。如果重写了hashCode方法就很可能出现hashCode相同equals为false? 的情况

4 final 在 java 中有什么作用?

final修饰类:该类不可以被继承

final修饰方法:该方法不能被重写

final修饰变量:该量变为常量且不能被二次赋值

finally: try catch 中一个方法,用于关闭资源

finallize :jvm垃圾回收的一个方法

5 java 中的 Math.round(-1.5) 等于多少?

-1

6 String 属于基础的数据类型吗?

不属于,引用数据类型

基本数据类型:

整形:byte 1,short 2,int 4,long 8

浮点型:float 4,double 8

字符型:char

布尔型:boolean

7 java 中操作字符串都有哪些类?它们之间有什么区别?

String,StringBuild,StringBuffer

String是被final修饰的char类型数组,所以长度不可变

StringBuild,StringBuffer长度可变单身Build速度快,线程不同步,Buffer速度慢,线程同步(上锁)

8 String str="i"与 String str=new String(“i”)一样吗?

不一样,使用String str=“i”,java虚拟机会把它分配到常量池中,而 String str=new String(“i”)创建了一个对象,会被分到堆内存中。

9 如何将字符串反转?

调用StringBuild中的reverse方法或者for循环char[]数组反向赋值

10 String 类的常用方法都有那些?

spilt,equals,subString,replace,trim

11 抽象类必须要有抽象方法吗?

不一定,抽象类不一定有抽象方法,但是有抽象方法的一定是抽象类

12 普通类和抽象类有哪些区别?

1 抽象类不能被实例化

2 抽象类可以有抽象方法,抽象方法只需申明,无需实现

3 含有抽象方法的类必须申明为抽象类

4 抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类

5 抽象方法不能被声明为静态

6 抽象方法不能用private修饰

7 抽象方法不能用final修饰

13 抽象类能使用 final 修饰吗?

不能,抽象类不能被实例化,只能被继承,但是被final修饰的类不能被继承

14 接口和抽象类有什么区别?

(1)抽象类可以有构造方法,接口中不能有构造方法。

(2)抽象类中可以有普通成员变量,接口中没有普通成员变量

(3)抽象类中可以包含静态方法,接口中不能包含静态方法

(4) 一个类可以实现多个接口,但只能继承一个抽象类。

(5)接口可以被多重实现,抽象类只能被单一继承

(6)如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法

15 java 中 IO 流分为几种?

从去向上来说:输入流,输出流

从流的性质上说:字节流,字符流

16 BIO、NIO、AIO 有什么区别?

同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。

BIO是一个连接一个线程。

NIO是一个请求一个线程。

AIO是一个有效请求一个线程。

17 Files的常用方法都有哪些?

自行百度

容器

18 java 容器都有哪些?

list,set,map

19 Collection 和 Collections 有什么区别?

Collection是一个接口,Collections是一个工具类

20 List、Set、Map 之间的区别是什么?

主要是在两个方面,是否有序,是否可以存放重复元素

21 HashMap 和 Hashtable 有什么区别?

Hashtable线程同步,HashMap线程不同步单身速度更快。都实现了Map接口

扩展:HashMap和Hashtable之间的另一个显著区别是,HashMap中的迭代器是失败快速迭代器,而Hashtable的枚举器不是,如果任何其他线程通过添加或删除Iterator自己的remove()方法之外的任何元素在结构上修改映射,则抛出ConcurrentModificationException。但是这不是一种有保证的行为,JVM将尽最大努力来完成。这也是Java中枚举和迭代器之间的一个重要区别。

22 如何决定使用 HashMap 还是 TreeMap?

如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。

23 说一下 HashMap 的实现原理?

扩展:

  1. 1.7中采用数组+链表,1.8采用的是数组+链表/红黑树,即在1.7中链表长度超过一定长度后就改成红黑树存储。

           2.   1.7扩容时需要重新计算哈希值和索引位置,1.8并不重新计算哈希值,巧妙地采用和扩容后容量进行&操作来计算新的索引位置。
           3.     1.7是采用表头插入法插入链表,1.8采用的是尾部插入法。
           4.      在1.7中采用表头插入法,在扩容时会改变链表中元素原本的顺序,以至于在并发场景下导致链表成环的问题;在1.8中采用尾部插入法,在扩容时会保持链表元素原本的顺序,就不会出现链表成环的问题了。
    

原理:HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。Entry是HashMap中的一个静态内部类

结论:HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

24 说一下 HashSet 的实现原理?

HashSet 的父类接口是Set集合
HashSet 是以Hash表结构存储
HashSet 多线程不安全
HashMap 可以存null值,
HashSet的底层是用HashMap实现的,将HashMap 值的那一列隐藏,就是HashSet (存在键的那一列)
一般子类需要用到HashCode方法,并且进行重写。

25 ArrayList 和 LinkedList 的区别是什么?

ArrayList底层是数组,LinkedList底层是链表

扩展:存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList
增删操作要影响数组内的其他数据的下标。
综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

26 如何实现数组和 List 之间的转换?

转List使用 asList

转数组 toArray

27 ArrayList 和 Vector 的区别是什么?

ArrayList速度快,但是不安全,不同步的

Vector速度慢,但是安全,线程同步的

扩展:ArrayList 与 Vector 都有一个初始的容量大小,当存储进它们里面的元素的个人超过了容量时,就需要增加 ArrayList 和 Vector 的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要去的一定的平衡。Vector 在数据满时(加载因子1)增长为原来的两倍(扩容增量:原容量的 2 倍),而 ArrayList 在数据量达到容量的一半时(加载因子 0.5)增长为原容量的 (0.5 倍 + 1) 个空间。

28 Array 和 ArrayList 有何区别?

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

Array大小是固定的,ArrayList的大小是动态变化的。

ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

对于基本类型数据,ArrayList 使用自动装箱来减少编码工作量;而当处理固定大小的基本数据类型的时候,这种方式相对比较慢,这时候应该使用Array。

29 在 Queue 中 poll()和 remove()有什么区别?

poll()和remove()都将移除并且返回对头,但是在poll()在队列为空时返回null,而remove()会抛出NoSuchElementException异常。

扩展: Queue(队列)是一个典型的先进先出容器

1 offer()与add()的区别?

add()和offer()都是向队列中添加一个元素。但是如果想在一个满的队列中加入一个新元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。可以据此在程序中进行有效的判断!

2 peek()与element()的区别?

peek()和element()都将在不移除的情况下返回队头,但是peek()方法在队列为空时返回null,调用element()方法会抛出NoSuchElementException异常。

30 哪些集合类是线程安全的?

Vector,实现List接口,与ArrayList相比几乎相同,但是是线程安全的。底层是数组。

Stack,继承Vector类,先进后出。

HashTable,实现Map接口,与HashMap几乎完全相同,但是是线程安全的。

java.util.concurrent包下的所有集合类,例如:ConcurrentHashMap。

31 迭代器 Iterator 是什么?

本身属于一个设计模式,用于顺序访问集合对象的元素,无需知道集合对象的底层实现。

Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。

缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加

32 Iterator 怎么使用?有什么特点?

使用方法:使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。 使用next()获得序列中的下一个元素。使用hasNext()检查序列中是否还有元素。使用remove()将迭代器新返回的元素删除。

特点:Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

33 Iterator 和 ListIterator 有什么区别?

一、方法相同点

1.两种方法都可以遍历集合元素使用

2.都是集合中提供的内部方法

二、方法不同点

1.Iterator在使用过程中,不能对集合元素进行添加操作,否则会抛出异常。

2.使用范围不同;Iterator可以在所有集合中使用,而ListIterator只能在List类型与子类型

3.listIterator有add方法,可以向集合中添加元素,而iterator不能。

4.listiterator和iterator都有hasnext和next方法可以顺序遍历元素, 但是listiterator有hasprevious和previous方法,可以逆向遍历元素

5.listiterator可以定位当前的索引位置 nextIndex和previousIndex可以实现,iterator没有此功能

6.listiterator可以实现对对象的修改set()方法可以实现,iterator仅可以遍历,不能修改。

34 怎么确保一个集合不能被修改?

我们可以采用Collections包下的unmodifiableMap方法,通过这个方法返回的map,是不可以修改的。他会报 java.lang.UnsupportedOperationException错。

img

多线程

35 并行和并发有什么区别?

并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。

36 线程和进程的区别?

线程运行在进程中,是CPU分配内存资源的最小单位

进程是应用程序的一次执行,包含多个线程,当所有线程结束后,进程也会结束

37 守护线程是什么?

是指在程序运行时 在后台提供一种通用服务的线程,这种线程并不属于程序中不可或缺的部分。通俗点讲,任何一个守护线程都是整个JVM中所有非守护线程的"保姆"

38 创建线程有哪几种方式?

继承Thread,实现Runalbe,Callable(有返回值)接口

39 说一下 runnable 和 callable 有什么区别?

有无返回值

40 线程有哪些状态?

开始,就绪,运行,阻塞,结束

41 sleep() 和 wait() 有什么区别?

sleep进入休眠一段时间自动醒来进入就绪状态,wait进入休眠只能被唤醒

42 notify()和 notifyAll()有什么区别?

notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。

void notify(): 唤醒一个正在等待该对象的线程。
void notifyAll(): 唤醒所有正在等待该对象的线程。

两者的最大区别在于:

notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。

43 线程的 run()和 start()有什么区别?

1.start():

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体中的代码执行完毕而直接继续执行后续的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里的run()方法称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2.run():

run()方法只是类的一个普通方法而已。run方法相当于线程的任务处理逻辑的入口方法,就是线程体,它由java虚拟机在运行相应线程时直接调用,而不是由代码进行调用。
3.总结:排队玩游戏机

多线程原理相当于玩游戏机,只有一个游戏机(CPU),start是排队,等CPU轮到你,你就run。
调用start后,线程会被放入到等待队列中,也就是上面说的就绪状态,等待CPU调用,并不是马上调用。然后通过JVM,线程thread会调用run方法,执行本线程的线程体,先调用start,后调用run。为什么不直接调用run呢?为了实现多线程的优点。

44 创建线程池有哪几种方式?

1.newFixedThreadPool(int nThreads):创建一个固定长度的线程池,每当提交一个任务就创建一个线程,直到达到线程池的最大数量,这时线程规模将不再变化,当线程发生未预期的错误而结束时,线程池会补充一个新的线程。

2.newCachedThreadPool():创建一个可缓存的线程池,如果线程池的规模超过了处理需求,将自动回收空闲线程,而当需求增加时,则可以自动添加新线程,线程池的规模不存在任何限制。

3.newSingleThreadExecutor():这是一个单线程的 Executor,它创建单个工作线程来执行任务,如果这个线程异常结束,会创建一个新的来替代它;它的特点是能确保依照任务在队列中的顺序来串行执行。

4.newScheduledThreadPool(int corePoolSize):创建一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

45 线程池都有哪些状态?

1.RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。线程池的初始化状态是RUNNING。线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0。

2.SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。调用线程池的shutdown()方法时,线程池由RUNNING -> SHUTDOWN。

3.STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。调用线程池的shutdownNow()方法时,线程池由(RUNNING or SHUTDOWN ) -> STOP。

4.TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()。因为terminated()在ThreadPoolExecutor类中是空的,所以用户想在线程池变为TIDYING时进行相应的处理;可以通过重载terminated()函数来实现。

当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。

当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。

5.TERMINATED:线程池处在TIDYING状态时,执行完terminated()之后,就会由 TIDYING -> TERMINATED。

46 线程池中 submit()和 execute()方法有什么区别?

execute() 参数 Runnable ;submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable)
execute() 没有返回值;而 submit() 有返回值
submit() 的返回值 Future 调用get方法时,可以捕获处理异常

47 在 java 程序中怎么保证多线程的运行安全?

  • JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
  • synchronized、volatile、LOCK,可以解决可见性问题
  • Happens-Before 规则可以解决有序性问题

48 多线程锁的升级原理是什么?

锁的级别从低到高:
无锁——偏向锁——轻量级锁——重量级锁,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级。

没有优化以前,sychronized是重量级锁(悲观锁),使用 wait 和 notify、notifyAll 来切换线程状态非常消耗系统资源;线程的挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。

所以为了减少获得和释放锁带来的性能消耗,JVM 对 sychronized 关键字进行了优化,把锁分为 无锁、偏向锁、轻量级锁、重量级锁状态。

49 什么是死锁?

我在等待你的资源释放,你再等待我的资源释放

50 如何防止死锁?

获取资源的一致性

51 ThreadLocal 是什么?有哪些使用场景?

Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。

在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。

而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。
ThreadLocal在每个本地线程中创建了一个ThreadLocalMap对象,每个线程可以访问自己内部ThreadLocalMap对象里的value。通过这种方式,实现线程之间的数据隔离。
使用场景:

为每个线程分配一个JDBC连接的Connection。这样可以保证每个线程都在各自的Connection上进行数据库的操作,不会出现A线程关闭了线程B正在使用的Connection。

52 说一下 synchronized 底层实现原理?

53 synchronized 和 volatile 的区别是什么?

(1)、volatile只能作用于变量,使用范围较小。synchronized可以用在变量、方法、类、同步代码块等,使用范围比较广。
(2)、volatile只能保证可见性和有序性,不能保证原子性。而可见性、有序性、原子性synchronized都可以包证。
(3)、volatile不会造成线程阻塞。synchronized可能会造成线程阻塞。

54 synchronized 和 Lock 有什么区别?

Lock是一个类,Syn是关键字

Lock在finally中必须释放锁,不然容易引起线程死锁

https://csdnimg.cn/release/blogv2/dist/pc/themesSkin/skin-whitemove/images/bg.gif

这里写图片描述

55 synchronized 和 ReentrantLock 区别是什么?

56 说一下 atomic 的原理?

反射

57 什么是反射?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

58 什么是 java 序列化?什么情况下需要序列化?

序列化:将 Java 对象转换成字节流的过程。

反序列化:将字节流转换成 Java 对象的过程。

当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。

序列化的实现:类实现 Serializable 接口,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。

注意事项:

某个类可以被序列化,则其子类也可以被序列化
声明为 statictransient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据
反序列化读取序列化对象的顺序要保持一致

59 动态代理是什么?有哪些应用?怎么实现的?

动态代理:当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

动态代理实现:首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。

动态代理的应用:Spring的AOP,加事务,加权限,加日志。

对象拷贝

60 为什么要使用克隆?

克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。

提个醒,我们常见的Object a=new Object();Object b;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。

而通过clone方法赋值的对象跟原来的对象时同时独立存在的。

61 如何实现对象克隆?

先介绍一下两种不同的克隆方法,浅克隆(ShallowClone)深克隆(DeepClone)

在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制,下面将对两者进行详细介绍。

被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)

覆盖clone()方法,访问修饰符设为public**。**方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)

62 深拷贝和浅拷贝区别是什么?

浅拷贝:浅拷贝复制引用属性时,仅仅复制指针值,没有复制指向的对象。
转载于:深拷贝浅拷贝区别

在这里插入图片描述

深拷贝:深拷贝完整复制一份该属性指向的对象

转载于:添加链接描述

img

Object.clone()方法属于浅拷贝。如果想使用深拷贝,必须在类里面重写clone()方法。

63 jsp 和 servlet 有什么区别?

jsp本质是一个servlet,对servlet进行了封装。

jsp注重视图,servlet注重逻辑

64 jsp 有哪些内置对象?作用分别是什么?

1.HttpServletRequet类的Request对象:代表请求对象,主要用于接受客户端通过HTTP协议连接传输服务器端的数据。

2.HttpSevletResponse类的Response对象:代表响应对象,主要用于向客户端发送数据。

3.JspWriter类的out对象:主要用于向客户端输出数据,out的基类是jspWriter

4.HttpSession类的session对象:主要用来分别保存每个月的信息与请求关联的会话;会话状态的维持是web应用开发者必须面对的问题。

5.ServletContext类的application对象:主要用于保存用户信息,代码片段的运行环境;它是一个共享的内置对象,即一个容器中的多个用户共享一个application

,故其保存的信息被所有用户所共享。

6.PageContext类的PageContext对象:管理网页属性,为jsp页面包装页面的上下文,管理对属于jsp的特殊可见部分中已经命名对象的访问,它的创建和初始化都是由容器来完成的。

7.ServletConfig类的Config对象:代码片段配置对象,标识Servlet的配置。

8.Object类的Page对象,处理jsp页面,是object类的一个实例,指的是jsp实现类的实例

9.Exception对象:处理jsp文件执行时发生的错误和异常,只有在错误页面里才使用,前提是在页面指令里要有isErrorPage=true。

65 说一下 jsp 的 4 种作用域?

page:代表与一个页面相关的对象和属性。
request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。

session:代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
application:代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。

66 session 和 cookie 有什么区别?

67 说一下 session 的工作原理?

session 的工作原理是客户端登录完成之后,服务器会创建对应的 session,session 创建完之后,会把 session 的 id 发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着 sessionid,服务器拿到 sessionid 之后,在内存找到与之对应的 session 这样就可以正常工作了。

68 如果客户端禁止 cookie 能实现 session 还能用吗?

如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session失效。

但是可以通过其他方法在禁用 cookie 的情况下,可以继续使用session。

通过url重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数。
服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。
通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。

69 如何避免 sql 注入?

70 什么是 XSS 攻击,如何避免?

71 什么是 CSRF 攻击,如何避免?

异常

72 throw 和 throws 的区别?

throw: 生成一个异常对象,并抛出。使用在方法内部《—》自动抛出异常对象
throws:处理异常的方式。使用在方法声明处的末尾《—》try-catcch-finally

73 final、finally、finalize 有什么区别?

74 try-catch-finally 中哪个部分可以省略?

以下三种情况都是可以的:
try-catch
try-finally
try-catch-finally
可以省略catch或者finally。catch和finally不可以同时省略。

75 try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

会执行,在return 前执行

76 常见的异常类有哪些?

网络

77 http 响应码 301 和 302 代表的是什么?有什么区别?

301 redirect: 301 代表永久性转移(Permanently Moved)

​ 302 redirect: 302 代表暂时性转移(Temporarily Moved )

78 forward 和 redirect 的区别?

79 简述 tcp 和 udp的区别?

80 tcp 为什么要三次握手,两次不行吗?为什么?

不行,可能会发生死锁。

81 说一下 tcp 粘包是怎么产生的?

什么是tcp粘包:发送方发送的多个数据包,到接收方缓冲区首尾相连,粘成一包,被接收。

82 OSI 的七层模型都有哪些?

83 get 和 post 请求有哪些区别?

84 如何实现跨域?

85 说一下 JSONP 实现原理?

设计模式

86 说一下你熟悉的设计模式?

87 简单工厂和抽象工厂有什么区别?

Spring/SpringMvc

88 为什么要使用 spring?

1.方便解耦,便于开发(Spring就是一个大工厂,可以将所有对象的创建和依赖关系维护都交给spring管理)

2.spring支持aop编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能)

3.声明式事务的支持(通过配置就完成对事务的支持,不需要手动编程)

4.方便程序的测试,spring 对junit4支持,可以通过注解方便的测试spring 程序

5.方便集成各种优秀的框架

6.降低javaEE API的使用难度(Spring 对javaEE开发中非常难用的一些API 例如JDBC,javaMail,远程调用等,都提供了封装,是这些API应用难度大大降低)

89 解释一下什么是 aop?

AOP(Aspect-Oriented Programming)指一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)。

90 解释一下什么是 ioc?

什么是 IOC ?

IOC (Inversion Of Control,控制倒转),是spring的核心,贯穿始终,所谓IOC ,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。所有的类都会在spring容器中登记,告诉spring你是个什么,你需要什么,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

什么是控制反转?

对象 a 获得依赖对象 b 的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

什么是依赖注入?

依赖注入让 bean 与 bean 之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起,其实依赖注入和控制反转是同一个概念,不管是依赖注入,还是控制反转,都采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。相当于将需要的接口实现注入到需要它的类中,这可能就是“依赖注入”说法的来源了

IOC 可以给我们带来什么好处?

IOC 的思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理。

​ 第一,资源集中管理,实现资源的可配置和易管理

​ 第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度

91 spring 有哪些主要模块?

Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。

92 spring 常用的注入方式有哪些?

有4种依赖注入方式:

Set方法注入:注入是最简单、最常用的注入方式,支持注解+xml。
构造器注入:是指带有参数的构造函数注入,支持注解+xml。
静态工厂的方法注入:通过调用静态工厂的方法来获取自己需要的对象,只支持xml。
实例工厂的方法注入:获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法,只支持xml。

有2 种实现方式:

注解(如@Autowired,@Resource,@Required)
配置文件(如xml)

93 spring 中的 bean 是线程安全的吗?

首先Spring 中的Bean是哪里来的?
spring中的bean是初始化时,通过扫描,利用反射new出来的。并且缓存在IOC 容器中,所以Spring并没有对你bean做任何处理
所以,spring中的bean 是不是线程安全的,取决于Bean的本身。而Bean的本身是我们自己写的代码。所以你自己的代码决定于这个bean是否是线程安全的。

94 spring 支持几种 bean 的作用域?

只有在 Web 应用中使用Spring时,request、session、global-session 作用域才有效

request:对于每次 HTTP 请求,使用 request 定义的 bean 都将产生一个新实例,即每次 HTTP 请求将会产生不同的 bean 实例。
session:同一个 Session 共享一个 bean 实例。
global-session:同 session 作用域不同的是,所有的Session共享一个Bean实例。

95 spring 自动装配 bean 有哪些方式?

no:默认方式,手动装配方式,需要通过ref设定bean的依赖关系
byName:根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配
byType:根据bean的类型进行装配,当一个bean的属性类型与其他bean的属性的数据类型一致,则自动装配
constructor:根据构造器进行装配,与 byType 类似,如果bean的构造器有与其他bean类型相同的属性,则进行自动装配
autodetect:如果有默认构造器,则以constructor方式进行装配,否则以byType方式进行装配

96 spring 事务实现方式有哪些?

主要方式有以下4种:

1. 编程式事务管理,基于POJO的应用来说是唯一选择。需要在代码中调用 beginTransaction() commit() rollback()等事务管理相关的方法。
2. 基于TransactionProxyFactoryBean的声明式事务管理;
3. 基于@Transactionl的声明式事务管理;
4. 基于Aspectj AOP配置事务。

97 说一下 spring 的事务隔离?

DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
串行化的 (serializable) :避免以上所有读问题.

98 说一下 spring mvc 运行流程?

99 spring mvc 有哪些组件?

100 @RequestMapping 的作用是什么?

101 @Autowired 的作用是什么?

@Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。
@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。

SpringBoot

103 什么是 spring boot?

转载于:SpringBoot介绍

Spring Boot是一款集成框架。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。说白了,springboot就是一款容器,一款里面装了web开发的各种工具的百宝箱。

104 为什么要用 spring boot?

1.就那一点来说,它简化了很多的配置!!
学习过SSM框架的人都知道,在SSM框架中还是需要配置一些文件的,就比如最代表性的springmvc的xml配置,在springboot中直接省略,在maven的pom包中导入即可自动配置!
你可以简单的理解为springboot是ssm框架的升级版。
2.集成了很多的依赖包,自带tomcat容器,设想一下,你再也不用为传统项目中部署tomcat发愁了,有时候tomcat出问题都够你搞的,springboot只要把tomcat的依赖包导入,直接运行,不需要你再添加tomcat了!
3.还有很多其他的依赖包,拿耳熟能详的jdbc啊,mysql啊,thymeleaf啊等等,导入依赖直接使用!直接使用!

105 spring boot 核心配置文件是什么?

Spring Boot 有两种类型的配置文件,application 和 bootstrap 文件
Spring Boot会自动加载classpath目前下的这两个文件,文件格式为 properties 或 yml 格式

*.properties 文件是 key=value 的形式
*.yml 是 key: value 的形式
*.yml 加载的属性是有顺序的,但不支持 @PropertySource 注解来导入配置,一般推荐用yml文件,看下来更加形象

bootstrap 配置文件是系统级别的,用来加载外部配置,如配置中心的配置信息,也可以用来定义系统不会变化的属性.bootstatp 文件的加载先于application文件
application 配置文件是应用级别的,是当前应用的配置文件

106 spring boot 配置文件有哪几种类型?它们有什么区别?

主要有.properties 和 .yml格式,它们的区别主要是书写格式不同。另外,.yml 格式不支持 @PropertySource 注解导入配置。

107 spring boot 有哪些方式可以实现热部署?

Spring Loaded
Spring-boot-devtools

Mybatis

108 mybatis 中 #{}和 ${}的区别是什么?

1、#{}是预编译处理,$ {}是字符串替换。

2、MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值;MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。

3、使用 #{} 可以有效的防止SQL注入,提高系统安全性。

109 mybatis 有几种分页方式?

1 数组

原理:进行数据库查询操作时,获取到数据库中所有满足条件的记录,保存在应用的临时数组中,再通过List的subList方法,获取到满足条件的所有记录。

2 sql语句分页

原理:通过sql语句实现分页也是非常简单的,只是需要改变我们查询的语句就能实现了,即在sql语句后面添加limit分页语句。

3 拦截器分页

4 RowBounds分页

110 mybatis 逻辑分页和物理分页的区别是什么?

物理分页速度上并不一定快于逻辑分页,
逻辑分页速度上也并不一定快于物理分页。
物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端来,
就算速度上存在优势,然而其它性能上的优点足以弥补这个缺点。

111 mybatis 是否支持延迟加载?延迟加载的原理是什么?

mybatis支持延迟加载
适用场景
一对一,多对一   立即加载

112 说一下 mybatis 的一级缓存和二级缓存?

1 一级缓存

一级缓存也叫sqlSession级别的缓存 ,也就是在同一个sqlSession内执行两次多次相同结果的查询语句,只会在第一次时发 出sql查询数据库的数据,然后之后每次从一级缓存中查询数据返回。

2 二级缓存

是mapper级别的缓存,也就是多个sqlSession之间可以实现数据的共享。

113 mybatis 有哪些执行器(Executor)?

simple reuse batch

114 mybatis 分页插件的实现原理是什么?

分页插件的基本原理是使用mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,添加对应的物理分页语句和物理分页参数

Mysql

115 数据库的三范式是什么?

116 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是8;但是如果重启(文中提到的)MySQL的话,这条记录的ID是6。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。

但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是8。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。

117 如何获取当前数据库版本?

使用 select version() 获取当前 MySQL 数据库版本。

118 说一下 ACID 是什么?

原子性: 一个事务可能会包含多种操作,比如转账操作包括从你的账户上扣钱和对方账户加钱。虽然内部有多步操作,但是外部看来它们是一个整体,要么都成功执行,要么都不要执行。否则事务进行到一半出现问题,就可能会出现你的账户扣了钱,但是对方账户没有收到钱的问题

一致性:事务必须使整个系统状态保持一致,比如你和对方来回转账,不管转了多少次,你们两个账户总金额总是一样的,不会出现你转出1000,对方只收到500的情况

隔离性:多个事务同时执行时,必须等前一个事务执行完,才能执行后一个事务,否则会造成数据紊乱。比如你账户有1000元,你给A转账500元。事务进行到一半,也就是把500元从你的账户扣除,但是此时该事务还没有提交,B又向你转账1000元。此时第二个事务查询你的账户仍是1000元,并以这个数据进行后续操作。结果就是第一个事务执行完,你的账户变为500元,然后第二个事务执行完,你的账户变为2000元。银行亏大了。所以正确的做法是第二个事务等待第一个事务执行完,再读取你的账户数据就是正确的500元了。当然数据库中不可能所有事务都是这么串联的,否则效率太低,会通过不同级别的锁来控制事务的隔离性。

持久性:事务运行的结果对系统状态的影响必然是持久的,否则服务器一重启,数据全恢复前一天的记录,银行就甭干了

119 char 和 varchar 的区别是什么?

120 float 和 double 的区别是什么?

float:单精度类型,精度是8位有效数字(其余部分四舍五入),取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间。

double:双精度类型,精度是17位有效数字,取值范围是10的-308次方到10的308次方,double占用8个字节的存储空间。

121 mysql 的内连接、左连接、右连接有什么区别?

122 mysql 索引是怎么实现的?

mysql索引采用的是B+tree,InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶结点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

123 mysql索引分类?

124 怎么验证 mysql 的索引是否满足需求?

explain 关键字,加载select 前面,possible_keys会显示索引名。

125 说一下数据库的事务隔离?

数据库隔离级别有四种:
未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

126 说一下 mysql 常用的引擎?

Innodb和MyIASM。

127 说一下 mysql 的行锁和表锁?

下面的都基于innodb引擎下。

表级锁:每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高.  一般来说,如果where条件中只用到索引项,则加的是行锁;否则加的是表锁。比如说主键索引,唯一索引和聚簇索引等。如果sql的where是全表扫描的,想加行锁也爱莫能助。   共享锁(S):SELECT * FROM table_name WHERE … LOCK IN SHARE MODE  排他锁(X):SELECT * FROM table_name WHERE … FOR UPDATE   mysql 还提供了LOCK TABLES,UNLOCK TABLES,用于加表锁,

128 说一下乐观锁和悲观锁?

129 如何做 mysql 的性能优化?

Redis

130 redis 是什么?都有哪些使用场景?

Redis使用C语言开发的一个开源的高性能键值对(key-value)数据库。他通过提供多种键值数据类型来适应不同场景下的存储需求。
一句话:由C语言实现的直接操作内存的高性能的数据库软件。

场景:

1】缓存(数据查询、短连接、新闻内容、商品内容等等) 最多使用
2】聊天室的在线好友列表 (你的好友也是别人的好友,他的上线下线。)
3】任务队列。(秒杀、抢购、12306等等)
4】应用排行榜 (直播间人数增减)
5】网站访问统计
6】数据过期处理(可以精确到毫秒)
7】分布式集群架构中的session分离

131 Reids的特点

Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。

Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

132 redis 为什么是单线程的?

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

133 缓存击穿,缓存穿透,缓存雪崩解决方法

134 redis 支持的数据类型有哪些?

String Hash List Set ZSet

134 jedis 和 redisson 有哪些区别

Jedis 和 Redisson 都是Java中对Redis操作的封装。Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似。Redisson 不仅封装了 redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis 更加大。

Jedis 是Java 实现的Redis 客户端,它的API提供了全面的类似于Redis 原生命令的支持。相比于其他Redis 封装框架更加原生。

Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。

Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

134 怎么保证缓存和数据库数据的一致性?

转载于:
https://blog.csdn.net/yyqhwr/article/details/107820465?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162919268116780357290122%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162919268116780357290122&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-107820465.first_rank_v2_pc_rank_v29&utm_term=%E6%80%8E%E4%B9%88%E4%BF%9D%E8%AF%81%E7%BC%93%E5%AD%98%E5%92%8C%E6%95%B0%E6%8D%AE%E5%BA%93%E6%95%B0%E6%8D%AE%E7%9A%84%E4%B8%80%E8%87%B4%E6%80%A7%EF%BC%9F&spm=1018.2226.3001.4187

134 redis 怎么实现分布式锁?

SET key value [EX seconds] [PX milliseconds] [NX|XX]

EX second :设置键的过期时间为second秒
PX millisecond :设置键的过期时间为millisecond毫秒
NX :只在键不存在时,才对键进行设置操作
XX:只在键已经存在时,才对键进行设置操作
SET操作成功完成时,返回OK ,否则返回nil
  • 集中过期,由于清除大量的key很耗时,会出现短暂的卡顿现象
  • 解放方案:在设置key的过期时间的时候,给每个key加上随机值

135 redis 如何做内存优化?

136 redis 淘汰策略有哪些?

137 redis 常见的性能问题有哪些?该如何解决?

138 redis 分布式锁有什么缺陷?

JVM

说一下 jvm 的主要组成部分?及其作用?

说一下 jvm 运行时数据区?

说一下堆栈的区别?

队列和栈是什么?有什么区别?

什么是双亲委派模型?

说一下类加载的执行过程?

怎么判断对象是否可以被回收?

java 中都有哪些引用类型?

说一下 jvm 有哪些垃圾回收算法?

说一下 jvm 有哪些垃圾回收器?

详细介绍一下 CMS 垃圾回收器?

新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

简述分代垃圾回收器是怎么工作的?

说一下 jvm 调优的工具?

常用的 jvm 调优的参数都有哪些?

猜你喜欢

转载自blog.csdn.net/weixin_49190101/article/details/120670520