0085 java面试高频问题汇总

本文涵盖了Java面试中常见的基础、容器、多线程、设计模式等方面的问题,包括JDK与JRE的区别、==与equals的对比、hashCode()与equals()的关系、final的用途、Math.round()的计算规则、String的特性、线程创建方式、线程状态、多线程同步、反射、序列化、IO流分类、BIO/NIO/AIO的区别、集合类如ArrayList、HashSet、HashMap的实现原理、异常处理、网络编程概念、设计模式的应用、Spring框架及其实现、Spring Boot和Spring Cloud的特点、RabbitMQ与Kafka的消息管理、Zookeeper的集群管理等关键知识点。通过对这些面试题的解析,深入理解Java的核心技术和实践应用。
摘要由CSDN通过智能技术生成

Java基础:

1.JDK 和 JRE 有什么区别?

面向人群不同:

JDK是面向开发人员的,包括java运行时环境(JRE)和一些基础库函数;JRE是面向java程序使用者的,即要运行java程序,就得用到JRE;

安装不同:

如果安装JDK,电脑有两套JRE,一套位于 \jre ,另外一套位于 C:\Program Files\Java\j2re1.4.1_01 目录下。

如果安装JRE,会在 C:\Program Files\Java 目录下安装唯一的一套JRE。

2. == 和 equals 的区别是什么?== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

基本类型:比较的是值是否相同;

引用类型:比较的是引用是否相同;

== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

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

哈希值相等的两个对象不一定相同,相同的对象哈希值一定相同。

4. final 在 Java 中有什么作用?

修饰类,表示类不可被继承;

修饰方法,表示方法不可被重写;

修饰属性,表示属性不可修改,只能赋值一次。

5. Java 中的 Math. round(-1. 5) 等于多少?

round函数对正数是“四舍五入”,对负数是“五舍六入”。 Math. round(-1. 5)= -1

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

不属于。String是一个对象。

java中基本类型只有8个:

字符类型:byte,char

基本整型:short,int,long

浮点型:float,double

布尔类型:boolean

void 有争议。

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

三者本质都是char[]

String:不可变字符串,有final修饰返回值,可为空值;

StringBuffer:可变字符串、效率低、线程安全

StringBuilder:可变字符序列、效率高、线程不安全;

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

不一样;

①是放入常量池,只有唯一的i,再赋给其他对象,也都是公用一个i;②是在对象,放在堆内存

9. 如何将字符串反转?

  1. 单个字符逆序拼接
  2. StringBuffer自带的反转方法
  3. 递归

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

indexOf() 返回指定字符得索引
charAt() 返回指定索引处的字符
repalce() 字符串替换
trim() 去除字符串两端的空白
split() 分割字符串 返回分割后的字符串数组
getBytes() 返回字符串的byte类型数组
length() 返回字符串的长度
toLowerCase() 字符串转小写
toUpperCase() 字符串转大写
substring() 截取字符串
equals() 字符串比较

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

不一定。如抽象类:

abstract class Cat {
    public static void sayHello() {
        System.out.println("miao~");
    }
}

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

普通类可实例化对象,抽象类不行;普通类不能含有抽象的方法

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

不能,抽象类适用于被继承的,final表示类不可被继承。

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

1、接口中的方法都不能实现,抽象类中方法可实现部分方法;

2、接口可以多继承,抽象类只能单继承;

3、接口中的基本数据类型为static,抽象类不是。

接口的功能是实现“协议”,“协议”要求属性公共、静态、最终常量,因此属性要设置为public static final;

抽象类是接口和普通类之间的过渡层,其目的是实现既满足接口的抽象,又满足具体的实现,因此可实现一些公共的方法。

版本2:

  • 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
  • 构造函数:抽象类可以有构造函数;接口不能有。
  • 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
  • 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

15. Java 中 IO 流分为几种?

1、按照数据流向分为:输入流、输出流

2、按照数据类型分为:字节流、字符流

字节流和字符流的区别是:字节流按 8 位传输,字符流按 16 位传输。1字节=8bit,1字符=16bit。

3、按照流数据的包装过程分为:节点流(低级流)、处理流(高级流)

输入流输出流
字符流ReaderWriter
字节流InputStreamOutputStream

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

IO的方式通常分为:

1.同步阻塞的BIO(Blocking I/O): 数据的读写必须阻塞在一个线程内等待其完成,对于连接数小于单机1000的情况下,可使用;

2.同步非阻塞的NIO(New I/O):N可以是non-blocking,它支持面向缓冲的,基于通道的I/O操作方法,在java.nio包中提供了Selector、Channel、Buffer等抽象,主要为了解决BIO的高并发问题。

BIO与NIO一个比较重要的不同,是我们使用BIO的时候往往会引入多线程,每个连接一个单独的线程;而NIO则是使用单线程或者只使用少量的多线程,每个连接共用一个线程

3.异步非阻塞的AIO(Asynchronous I/O): 也叫NIO 2,其区别是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定

适用场景分析

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
  • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
  1. Files的常用方法都有哪些?

    Files.exists() 检测文件路径是否存在
    Files.createFile()创建文件
    Files.createDirectory()创建文件夹
    Files.delete() 删除文件或者目录
    Files.copy() 复制文件
    Files.move() 移动文件
    Files.size()查看文件个数
    Files.read() 读取文件
    Files.write()写入文件

答案,请移步:

动力节点:面试题|Java基础17道常见面试题zhuanlan.zhihu.com图标


Java容器

18. Java 容器都有哪些?

collection,List,Map,ArrayList,LinkedList,HashMap,Hashtable,WeakHashMap键和值都可以是null),TreeMap,Set,HashSet,TreeSort,Vector,Stack

19. Collection 和 Collections 有什么区别?

collection是java的集合接口,为各种具体的集合提供最大化的统一操作方式,List,Set,Queue接口都继承Collection;

Collections是一个服务于collection的工具类,如集合的搜索、排序,线程安全等

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

List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dFbRnU9S-1587776921893)(C:\Users\gendl\Desktop\blog\集合类的区别.jpg)]

21. HashMap 和 Hashtable 有什么区别?

HashMapHashtable
键可为null键不可为null
线程不安全线程安全
性能更好性能不及hashmap
扩容2倍,且2的幂次个扩容2n+1
冲突:1.8:冲突位置元素小于8链表冲突:都是链表的形式
>=8且数组大于64,红黑树,小于6链表 ;1.7: 都是链表
containsValue,ContainsKeycontains等效containsKey,containsValue
继承AbstractMap继承自Dictionary(已弃用)

hashmap的哈希值计算:

static final int hash(Object key) {     
  int h;      
  return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);   

 }

​ hashtable的哈希计算:

int index = (hash & 0x7FFFFFFF) % tab.length;

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

HashMap的key值实现hashcode(),是散列均匀分布的,不支持排序,主要结构为桶(数组),链表或红黑树;TreeMap的key是实现java.lang.Comparable,因此key是默认升序排列的,基于红黑树实现。

HashMap查询速度快O(1),TreeMap增加元素和快速创建的时候效率更高。

23. 说一下 HashMap 的实现原理?

hashmap是一种元素为链表或红黑树的数组,元素以Entry封装键值对。数组的默认长度为16,负载因子为0.75,当数组使用率达到75%,对当前数组长度进行2倍扩容,且总长度为2^n(为了使得哈希值的均匀分布);通过h = key.hashCode()) ^ (h >>> 16)计算元素的存储位置,当发生哈希冲突时,首先判断key值是否一样,如果一样,则覆盖原有内容,若不一样,通过“链式分离”解决,即新加入的元素加入到链表的头部(next指针的final属性决定的),生成一条链。取8的原因是:其一,当负载因子为0.75时,每个位置冲突元素到达8个的概率为千万分之一;其二,红黑树的查找速度为log(n),在元素大于8个时,查找速度更快。数组某位置冲突元素当>=8,链表转换成红黑树;<6,红黑树转链表,中间留有一个过渡状态7,当为7的时候,如果是从小于7增到7,则7为链表;如果是从大于7减小到7,则7为红黑树,其好处是:可以避免频繁增加删除造成频繁链表与树的转换

24. 说一下 HashSet 的实现原理?

HashSet是实现set接口,但底层实际是一个HashMap,将HashSet的value作为HashMap的key,而HashMap的value为一个static final的空对象( private static final Object PRESENT = new Object();)。由于HashMap在添加元素时会对key是否重复进行检查,因此HashSet通过判断key是否存在,存在就不添加,不存在就添加。

24-1 哈希冲突的四种解决方法

1, 开放定址法:
所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入
公式为:fi(key) = (f(key)+di) MOD m (di=1,2,3,……,m-1)
※ 用开放定址法解决冲突的做法是:当冲突发生时,使用某种探测技术在散列表中形成一个探测序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者
碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探测到开放的地址则表明表
中无待查的关键字,即查找失败。
比如说,我们的关键字集合为{12,67,56,16,25,37,22,29,15,47,48,34},表长为12。 我们用
散列函数
f(key) = key mod l2
当计算前S个数{12,67,56,16,25}时,都是没有冲突的散列地址,直接存入:

这里写图片描述
计算key = 37时,发现f(37) = 1,此时就与25所在的位置冲突。
于是我们应用上面的公式f(37) = (f(37)+1) mod 12 = 2。于是将37存入下标为2的位置:
这里写图片描述

2, 再哈希法:
再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,使用第二个,第三个,….,等哈希函数
计算地址,直到无冲突。虽然不易发生聚集,但是增加了计算时间。

3, 链地址法:
链地址法的基本思想是:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向 链表连接起来,如:
键值对k2, v2与键值对k1, v1通过计算后的索引值都为2,这时及产生冲突,但是可以通道next指针将k2, k1所在的节点连接起来,这样就解决了哈希的冲突问题

4, 建立公共溢出区:
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表

25. ArrayList 和 LinkedList 的区别是什么?

1、ArrayList是动态数组(长度可变)、LinkedList是双向链表

2、ArrayList内存中为连续的地址,且当元素达到阈值(数组长度)需要扩容——1.5倍方式;LinkedList的元素分散在内存中,不需要扩容;

3、ArrayList的读取效率更高;LinkedList的插入和删除效率更高;

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

1、数组=>List:Arrays.asList()

2、List=> 数组:List自带的**toArray()**方法,返回是Object[],需进行转换

27. ArrayList 和 Vector 的区别是什么?

1、ArrayList线程不安全,Vector线程安全;

2、ArrayList的性能更好;

3、扩容:ArrayList以1.5倍方式,Vector以2倍的方式。

28. Array 和 ArrayList 有何区别?

1、Array是固定大小的数组,ArrayList是可扩展的数组;

2、Array可以存储基本类型和对象,ArrayList只能存储对象;

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

poll()先获得元素,然后再删除;remove()是直接删除元素;

Queue接口的实现类常用的为LinkedList类。

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

Hashtable、vector、stack是线程安全的;JDK1.5之后,引入java.util.concurrent并发包,集合具有自己的线程安全类。

31. 迭代器 Iterator 是什么?

Iterator是对 Collection 进行迭代的类。迭代器允许调用者在迭代过程中移除元素。

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

Iterator 的特点是更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。

使用方法:

List<String> list = new ArrayList<>();
Iterator<String> it = list. iterator();
while(it. hasNext()){
  String obj = it. next();
  System. out. println(obj);
}

33. Iterator 和 ListIterator 有什么区别?

1、ListIterator 继承自Iterator,添加了更多的方法;

2、Iterator 只能单向遍历,ListIterator 可以双向遍历;

3、ListIterator 只能遍历List,Iterator 可以遍历Set、List。

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

可以用Collections的方法使得集合为只能可读,修改会报错。具体实现方式:

List<String> list = new ArrayList<>();
list. add("x");
Collection<String> clist = Collections. unmodifiableCollection(list);
clist. add("y"); // 运行时此行报错
System. out. println(list. size());

答案,请移步:

动力节点:面试题|不得不看的17道Java容器面试题zhuanlan.zhihu.com图标


Java多线程

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

并行:并行是在不同实体上的多个事件;

并发:并发是在同一实体上的多个事件。

并发 = 两个队列和一台咖啡机。

并行 = 两个队列和两台咖啡机。

36. 线程和进程的区别?

1、性质不同:线程是CPU进行资源分配和调度的基本单位,包含于进程,是进程的实际运作单位;进程是程序在某个数据集上的一次运行活动;一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

2、地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间;

3、资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的

4、进程切换时,消耗的资源大

5、每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

37. 守护线程是什么?

守护线程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。在 Java 中垃圾回收线程就是特殊的守护线程。

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

三种

1、继承Thread类,重写run()方法;

2、实现runnable接口,实现run()方法; 常推荐的方式

3、实现callable接口,实现call()方法。利用到future类,future类用来包装一个未知是否完成的进程的返回结果,若完成则用get方法获取,未完成则会等待其完成。

4、使用线程池例如用Executor框架

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

runnable 没有返回值,callable 可以拿到有返回值,callable 可以看作是 runnable 的补充。

40. 线程有哪些状态?

  • NEW 尚未启动
  • RUNNABLE 正在执行中
  • BLOCKED 阻塞的(被同步锁或者IO锁阻塞)
  • WAITING 永久等待状态
  • TIMED_WAITING 等待指定的时间重新被唤醒的状态
  • TERMINATED 执行完成

42. sleep() 和 wait() 有什么区别?

  • 类的不同:sleep() 来自 Thread,wait() 来自 Object。
  • 释放锁:sleep() 不释放锁;wait() 释放锁。
  • 用法不同:sleep() 时间到会自动恢复;wait() 可以使用 notify()/notifyAll()直接唤醒。

43. notify()和 notifyAll()有什么区别?

notifyAll()会唤醒所有的线程,notify()之后唤醒一个线程。notifyAll() 调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池等待锁被释放后再次参与竞争。而 notify()只会唤醒一个线程,具体唤醒哪一个线程由虚拟机控制

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

start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。run() 可以重复调用,而 start() 只能调用一次。

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

七种

1、newFixedThreadPool:创建固定长度的线程池;

2、newSingleThreadExcutor: 创建单线程线程池资源;

3、newCachedThreadPool: 创建可缓存的线程池;

4、newSchelduledPool:创建定时的工作调度线程池;

5、ThreadPoolExecutor:是最原始的线程池创建

6、newWorkStealingPool(int parallelism):这是一个经常被人忽略的线程池,Java 8 才加入这个创建方法,其内部会构建ForkJoinPool,利用Work-Stealing算法,并行地处理任务,不保证处理顺序;

7、newSingleThreadScheduledExecutor():创建单线程池,返回 ScheduledExecutorService,可以进行定时或周期性的工作调度;

46. 线程池都有哪些状态?

  • RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。
  • SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。
  • STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。
  • TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行钩子方法 terminated()。
  • TERMINATED:terminated()方法结束后,线程池的状态就会变成这个。

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

1、submit()可执行Runnable和Callable类型的任务;execute()只能执行Runnable类型任务;

2、submit()可以获取返回值(Future),可处理Exception;execute()则不行。

3、接受的参数不一样;

48. 在 Java 程序中怎么保证多线程的运行安全?

方法1:使用安全类,如java.util.concurrent下的类;

方法2:使用自动锁sychronized;

方法3:使用手动锁Lock。

49. 多线程中 synchronized 锁升级的原理是什么?

锁的升级的目的:锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方式,使用了偏向锁升级为轻量级锁再升级到重量级锁的方式,从而减低了锁带来的性能消耗。

synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid 设置为其线程 id,再次进入的时候会先判断 threadid 是否与其线程 id 一致,如果一致则可以直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行一定次数之后,如果还没有正常获取到要使用的对象,此时就会把锁从轻量级升级为重量级锁,此过程就构成了 synchronized 锁的升级。

50. 什么是死锁?

线程A持有独占锁a,并尝试去获得独占锁b,同时线程B持有独占锁b,尝试去获得独占锁a,这样AB线程由于互相持有对方需要的锁,就发生了阻塞现象,称之为死锁。

51. 怎么防止死锁?

1、尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。

2、尽量使用 Java. util. concurrent 并发类代替自己手写锁。

3、尽量降低锁的使用粒度,尽量不要几个功能用同一把锁

4、尽量减少同步的代码块

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

ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本而不会影响其它线程所对应的副本

ThreadLocal 的经典使用场景是数据库连接session 管理等

53. 说一下 synchronized 底层实现原理?

Synchronized是通过对象内部的一个叫做监视器锁(monitor)的monitorenter/monitorexit 指令来实现的,监视器锁本质又是依赖于底层的操作系统的Mutex Lock(互斥锁)来实现的。

synchronized 为啥效率低?因为操作系统底层线程切换成本高(用户态-》核心态)高,因此为“重量锁”。

synchronized作用

原子性:synchronized保证语句块内操作是原子的
可见性:synchronized保证可见性(通过“在执行unlock之前,必须先把此变量同步回主内存”实现)
有序性:synchronized保证有序性(通过“一个变量在同一时刻只允许一条线程对其进行lock操作”)

54. synchronized 和 volatile 的区别是什么?

  • volatile 是变量修饰符;synchronized 是修饰类、方法、代码段。
  • volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。
  • volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。

55. synchronized 和 Lock 有什么区别?

  • synchronized 可以给类、方法、代码块加锁;而 lock 只能给代码块加锁
  • synchronized 不需要手动获取锁和释放锁,使用简单,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果使用不当没有 unLock()去释放锁就会造成死锁。
  • 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。

56. synchronized 和 ReentrantLock 区别是什么?

  • ReentrantLock 使用起来比较灵活,但是必须有释放锁的配合动作;
  • ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动释放和开启锁;
  • ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等。

57. 说一下 atomic 的原理?

atomic 主要利用 CAS (Compare And Swap) 和 volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。

答案,请移步:

动力节点:Java面试题|多线程22道必看面试题zhuanlan.zhihu.com图标


Java反射

58. 什么是反射?

反射是指程序可以访问、检测和修改它本身状态的或行为的一种能力。

在java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法;对于任意一个对象,能否调用它的任一方法。

java反射机制主要提供以下功能:

1、在运行时判断一个对象所属的类‘

2、在运行时构造任意一个类的对象;

3、在运行时判断一个类所具有的的成员变量和方法

4、在运行时调用任意一个对象的方法

59. 什么是 Java 序列化?什么情况下需要序列化?

Java序列化是指将对象转化为字节码,可用于存储和传输;

序列化的场景:类对象需要保存;类对象需要网络传输;远程方法调用(RMI)传输对象的时候;

注意事项:

1、父类可以被序列化,子类就可以被序列化

2、声明为 static和 transient的成员变量不能被序列化,因为只有堆内存会被序列化,所以静态变量会天生不会被序列化。

3、反序列化读取序列化的顺序要一致

60. 动态代理是什么?应用场景?

动态代理:在运行时,可以创建目标类、可以调用和扩展目标类的方法;

java中实现动态代理的方法:JDK中动态代理 、 java类库CGLib

应用场景

1、统计每个API的请求耗时;

2、统一的日志输出

3、校验被调用的API是否已登录和权限鉴定

4、Spring AOP模块就是采用动态代理实现切面编程

61. 怎么实现动态代理?

动态代理的两种方式:①利用JDK中的反射机制生成代理(需提供接口)②利用CGLIB代理(直接代理类)

答案,请移步:

动力节点:Java面试题|反射必看的4道面试题zhuanlan.zhihu.com图标


对象拷贝

62. 为什么要使用克隆?

因为克隆的对象可能已经包含修改过的属性,而new的对象属性还是初始时候的值;当需要保存当前对象的“状态”时,就需要克隆。

63. 如何实现对象克隆?

1、实现Cloneable接口,且重写Object的clone()方法;

2、实现Serializable接口,通过对象的序列化反序列化,实现真正的深度克隆;

64. 深拷贝和浅拷贝区别是什么?

浅克隆:当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制

深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制。

答案,请移步:

动力节点:Java面试题|关于对象拷贝的三道面试题zhuanlan.zhihu.com图标


javaweb

​ 65. JSP 和 servlet 有什么区别?各自特点是什么?

​ 66. JSP 有哪些内置对象?作用分别是什么?

​ 67. 说一下 JSP 的 4 种作用域?

​ 68. session 和 cookie 有什么区别?

​ 69. 说一下 session 的工作原理?

​ 70. 假定载客户端禁止 cookie下session如何使用?session与cookie的区别是什么?

​ 71. spring mvc 和 struts 的区别是什么?

​ 72. 如何避免 SQL 注入?

​ 73. 什么是 XSS 攻击,如何避免?

​ 74. 什么是 CSRF 攻击,如何避免?

答案,请移步:

动力节点:Java面试题|Javaweb不得不看的10道面试题zhuanlan.zhihu.com图标


Java异常

​ 75. throw 和 throws 的区别?

​ 76. final、finally、finalize 有什么区别?

​ 77. try-catch-finally 中哪个部分可以省

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

​ 79. 常见的异常类有哪些?

答案,请移步:

动力节点:Java面试题|Java异常不得不看的5道面试题zhuanlan.zhihu.com图标


Java网络编程

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

​ 81. forward 和 redirect 的区别?

​ 82. 简述 tcp 和 udp的区别?

​ 83. tcp 为什么要三次握手,两次不行吗?为什么?

​ 84. 说一下 tcp 粘包是怎么产生的?

​ 85. OSI 的七层模型都有哪些?

​ 86. get 和 post 请求有哪些区别?

​ 87. 如何实现跨域请求?

​ 88. 说一下 JSONP 实现原理?

答案,请移步:

动力节点:Java面试题|Java网络编程9道必看面试题zhuanlan.zhihu.com图标

Java设计模式

89. 请列举出在JDK中几个常用的设计模式?

  • 单例模式:保证被创建一次,节省系统开销。
  • 工厂模式(简单工厂、抽象工厂):解耦代码。
  • 观察者模式:定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
  • 外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。
  • 模版方法模式:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。
  • 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
  • 装饰器设计模式:(Decorator design pattern)被用于多个 Java IO 类中。

90. 什么是设计模式?你是否在你的代码里面使用过任何设计模式?

设计模式是解决特定设计问题的尝试和测试的方法。设计模式是代码可用性的延伸

91. Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式

单例模式重点在于在整个系统上共享一些创建时较耗资源的对象。整个应用中只维护一个特定类实例,它被所有组件共同使用。Java.lang.Runtime是单例模式的经典例子。从 Java 5 开始你可以使用枚举(enum)来实现线程安全的单例。

92. 在 Java 中,什么叫观察者设计模式(observer design pattern)?

观察者模式是基于对象的状态变化和观察者的通讯,以便他们作出相应的操作。简单的例子就是一个天气系统,当天气变化时必须在展示给公众的视图中进行反映。这个视图对象是一个主体,而不同的视图是观察者。

93. 使用工厂模式最主要的好处是什么?在哪里使用?

​ 94. 举一个用 Java 实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类层次?

​ 95. ava 编程为什么不允许从静态方法中访问非静态变量?

​ 96. 如果需要设计一个 ATM 机,你的设计思路是什么?

​ 97. 在 Java语言 中,什么时候用重载,什么时候用重写?

​ 98. 请举例说明什么情况下会更倾向于使用抽象类而不是接口?

​ 99. 简单工厂和抽象工厂有什么区别?

答案,请点击链接:

动力节点:Java面试题|Java设计模式11道常见面试题zhuanlan.zhihu.com图标


更新:

Spring

100.为什么要使用 spring?

1、方便解耦,便于开发;

2、支持AOP编程

3、支持声明式事务

4、方便集成优秀的框架;方便测试(支持junit4)

5、降低javaEE API使用难度

101.解释一下什么是 Aop?

​ 102.解释一下什么是 ioc?

​ 103. spring 有哪些主要模块?

​ 104. spring 常用的注入方式有哪些?

​ 105. spring 中的 bean 是线程安全的吗?

​ 106. spring 支持几种 bean 的作用域?

​ 107. spring 自动装配 bean 有哪些方式?

​ 108. spring 事务实现方式有哪些?

​ 109. 说一下 spring 的事务隔离?

答案,请点击链接:

动力节点:框架系列|Spring10道常见面试题!zhuanlan.zhihu.com图标

Spring MVC

​ 110. 说一下 spring mvc 运行流程?

​ 111. spring mvc 有哪些组件?

​ 112. @RequestMapping 的作用是什么?

​ 113. @Autowired 的作用是什么?

答案,请点击链接:

动力节点:框架系列|SpringMVC 4道必看面试题!zhuanlan.zhihu.com图标

SpringBoot

​ 114. 什么是 SpringBoot?

​ 115. 为什么要用SpringBoot?

​ 116. SpringBoot核心配置文件是什么?

​ 117. SpringBoot配置文件有哪几种类型?它们有什么区别?

​ 118. spring boot 有哪些方式可以实现热部署?

​ 119. jpa 和 hibernate 有什么区别?

答案,请点击链接:

动力节点:框架系列|SpringBoot 6道必看面试题!zhuanlan.zhihu.com图标

Spring Cloud

​ 120. 什么是 spring cloud?

​ 121. spring cloud 断路器的作用是什么?

​ 122. spring cloud 的核心组件有哪些?

答案,请点击链接:

动力节点:框架系列|Spring Cloud 3道必看面试题!zhuanlan.zhihu.com图标

Hibernate

​ 123. 为什么要使用 hibernate?

​ 124. 什么是 ORM 框架?

​ 125. hibernate 中如何在控制台查看打印的 SQL 语句?

​ 126. hibernate 有几种查询方式?

​ 127. hibernate 实体类可以被定义为 final 吗?

​ 128. hibernate里实体类用int和Integer区别

​ 129. hibernate 是如何工作的?

​ 130. get()和 load()的区别?

​ 131. 说一下 hibernate 的缓存机制?

​ 132. hibernate 对象有哪些状态?

​ 133. 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

​ 134. hibernate 实体类必须要有无参构造函数吗?为什么?

答案,请点击链接:

动力节点:框架系列|Hibernate12道必看面试题zhuanlan.zhihu.com图标

MyBatis

​ 135. MyBatis 中 #{}和 ${}的区别是什么?

​ 136. MyBatis 有几种分页方式?

​ 137. RowBounds 是一次性查询全部结果吗?为什么?

​ 138. MyBatis 逻辑分页和物理分页的区别是什么?

​ 139. MyBatis 是否支持延迟加载?延迟加载的原理是什么?

​ 140. 说一下 MyBatis 的一级缓存和二级缓存?

​ 141. MyBatis 和 hibernate 的区别有哪些?

​ 142. MyBatis 有哪些执行器(Executor)?

​ 143. MyBatis 分页插件的实现原理是什么?

​ 144. MyBatis 如何编写一个自定义插件?

答案,请点击链接:

动力节点:框架系列|MyBatis 10道必看面试题zhuanlan.zhihu.com图标

RabbitMQ

​ 145. RabbitMQ 的使用场景有哪些?

​ 146. RabbitMQ 有哪些重要的角色?

​ 147. RabbitMQ 有哪些重要的组件?

​ 148. RabbitMQ 中 vhost 的作用是什么?

​ 149. RabbitMQ 的消息是怎么发送的?

​ 150. RabbitMQ 怎么保证消息的稳定性?

​ 151. RabbitMQ 怎么避免消息丢失?

​ 152. 要保证消息持久化成功的条件有哪些?

​ 153. RabbitMQ 持久化有什么缺点?

​ 154. RabbitMQ 有几种广播类型?

​ 155. RabbitMQ 怎么实现延迟消息队列?

​ 156. RabbitMQ 集群有什么用?

​ 157. RabbitMQ 节点的类型有哪些?

​ 158. RabbitMQ 集群搭建需要注意哪些问题?

​ 159. RabbitMQ 每个节点是其他节点的完整拷贝吗?为什么?

​ 160. RabbitMQ 集群中唯一一个磁盘节点崩溃了会发生什么情况?

​ 161. RabbitMQ 对集群节点停止顺序有要求吗?

答案,请点击链接:

动力节点:框架系列|中间件RabbitMQ必看17道面试题zhuanlan.zhihu.com图标

Kafka

162. kafka 可以脱离 zookeeper 单独使用吗?为什么?

kafka不能脱离zookeeper单独使用,因为需要zookeeper来协调和管理kafka的节点服务器

163. kafka 有几种数据保留的策略?

四种:

1、指定分区号,将数据放到指定分区上;

2、没有分区号,给定数据的key值,通过key的hashCode确定分区;

3、没有分区号,没有key,按照轮询的方式进行分区;

4、自定义分区

方式分别如下:

producer.send(new ProducerRecord<String, String>("test", Integer.toString(i), Integer.toString(i)));
//kafka的第一种分区方式,如果给定了分区号,那么就直接将数据发送到指定的分区号里面去
producer.send(new ProducerRecord<String, String>("test",2,"helloworld",i+""));
//kafka的第二种分区策略,没有给定分区号,给定了数据的key,那么就通过key取hashcode,将数据均匀的发送到三台机器里面去
//注意如果实际工作当中,要通过key取上hashcode来进行分区,那么就一定要 保证key的变化,否则,数据就会全部去往一个分区里面
producer.send(new ProducerRecord<String, String>("test",i+"",i+""));
//kafka的第三种分区策略,既没有给定分区号,也没有给定数据的key值,那么就会按照轮循的方式进行数的发送
producer.send(new ProducerRecord<String, String>("test",i+""));
//kafka的第四种分区策略,自定义分区类,实现我们数据的分区

164. kafka 同时设置了 7天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?

清空数据。不管是时间还是空间达到了上限都将清空数据

165. 怎么设置kafka topic数据存储时间

创建topic “test”:

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 3 --topic test 

​ 设定存储时间:

./kafka-configs.sh --zookeeper localhost:2181 --alter --entity-name test --entity-type topics --add-config retention.ms=86400000

retention.ms=86400000 为一天,单位是毫秒。

166.什么情况会导致 kafka 运行变慢?

  • cpu 性能瓶颈
  • 磁盘读写瓶颈
  • 网络瓶颈

167. 使用 kafka 集群需要注意什么?

  • 集群的数量不是越多越好,最好不要超过 7 个,因为节点越多,消息复制需要的时间就越长,整个群组的吞吐量就越低。
  • 集群数量最好是单数,因为超过一半故障集群就不能用了,设置为单数容错率更高。

答案,请点击链接:

动力节点:框架系列|中间件·Kafka必看6道面试题zhuanlan.zhihu.com图标

Zookeeper

168. zookeeper 是什么?

zk是分布式的应用协助服务,是集群管理者,监视者各个节点的状态,根据节点的提交请求做下一步处理。

其特征有:更新全局有序,对应着一个时间戳zxid

169. zookeeper 都有哪些功能?

1、监控节点存活状态(心跳包检测),运行请求等

2、主节点选举:选举主节点,由zk协助

3、对分布式锁进行控制:包括独占锁、共享锁

4、统一命名服务:客户端根据指定名字获取资源的地址等

5、配置管理:将配置存储到zk的某个目录,当有修改时,zk会通知节点

170. zookeeper 有几种部署模式?

单机、集群、伪集群(一个服务器多个zk服务应用)

171. zookeeper 怎么保证主从节点的状态同步?

原子广播机制保证的,实现该机制的协议叫zab协议。

zab协议有:恢复模式(选主)、广播模式(同步)

172. 集群中为什么要有主节点?

主节点操作的结果共享到从节点,可以减少重复计算。

173. 集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?

可以

宕机节点数 超过一半,就不可使用,包括kafka集群也是。

174. 说一下 zookeeper 的通知机制?

client端会对某个znode建立一个*watcher事件*,当该znode发生变化时,这些client会收到zk的通知,然后client可以根据znode变化来做出业务上的改变等。

175. ZAB和Paxos算法的联系与区别?

  • 相同点:

    • 两者都存在一个类似于Leader进程的角色,由其负责协调多个Follower进程的运行
    • Leader进程都会等待超过半数的Follower做出正确的反馈后,才会将一个提案进行提交
    • ZAB协议中,每个Proposal中都包含一个 epoch 值来代表当前的Leader周期,Paxos中名字为Ballot
  • 不同点:
    ZAB用来构建高可用的分布式数据主备系统(Zookeeper),Paxos是用来构建分布式一致性状态机系统

答案,请点击链接:

动力节点:框架系列|中间件·Zookeeper必看7道面试题zhuanlan.zhihu.com图标

MySQL

​ 176. 数据库的三范式是什么?

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

​ 178. 如何获取当前数据库版本?

​ 179. 说一下 ACID 是什么?

​ 180. char 和 varchar 的区别是什么?

​ 181. float 和 double 的区别是什么?

​ 182. MySQL 的内连接、左连接、右连接有什么区别?

​ 183. MySQL 索引是怎么实现的?

​ 184. 怎么验证 MySQL 的索引是否满足需求?

​ 185. 说一下数据库的事务隔离?

​ 186. 说一下 MySQL 常用的引擎?

​ 187. 说一下 MySQL 的行锁和表锁?

​ 188. 说一下乐观锁和悲观锁?

​ 189. MySQL 问题排查都有哪些手段?

​ 190. 如何做 MySQL 的性能优化?

答案,请点击链接:

动力节点:框架系列|MySQL必看15道面试题zhuanlan.zhihu.com图标

Redis

​ 191. Redis 是什么?都有哪些使用场景?

​ 192. Redis 有哪些功能?

​ 193. Redis 和 memcache 有什么区别?

194. Redis 为什么是单线程的?

​ 195. 什么是缓存穿透?怎么解决?

​ 196. Redis 支持的数据类型有哪些?

​ 197. Redis 支持的 Java 客户端都有哪些?

​ 198. jedis 和 Redisson 有哪些区别?

​ 199. 怎么保证缓存和数据库数据的一致性?

​ 200. Redis 持久化有几种方式?

​ 201. Redis 怎么实现分布式锁?

​ 202. Redis 分布式锁有什么缺陷?

​ 203. Redis 如何做内存优化?

​ 204. Redis 淘汰策略有哪些?

​ 205.单线程的Redis为什么这么快

缓存与数据库一致性:

更新的时候,先删除缓存,然后再更新数据库。
读的时候,先读缓存;如果没有的话,就读数据库,同时将数据放入缓存,并返回响应。

答案,请点击链接:

动力节点:框架系列|Redis 15道必看面试题zhuanlan.zhihu.com图标

JVM

\206. 说一下 JVM 的主要组成部分?及其作用?

\207. 说一下 JVM 运行时数据区?

\208. 说一下堆栈的区别?

\209. 队列和栈是什么?有什么区别?

\210. 什么是双亲委派模型?

\211. 说一下类装载的执行过程?

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

\213. Java 中都有哪些引用类型?

\214. 说一下 JVM 有哪些垃圾回收算法?

\215. 说一下 JVM 有哪些垃圾回收器?

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

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

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

\219. 说一下 JVM 调优的工具?

\220. 常用的 JVM 调优的参数都有哪些?

答案,请点击链接:

动力节点:Java面试题|JVM必看15道面试题zhuanlan.zhihu.com图标

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值