{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

你遇到过哪些质量很高的Java面试?

2shou2shou 回答0 收藏2
问题描述:你遇到过哪些质量很高的Java面试?
收藏问题

5条回答

chenatu

chenatu

回答于2022-06-28 15:58

笔者曾就职与ucloud,ucloud,samsung,是一个资深码农

如果大家想了解更多程序员的生活或者Java与android技术可以关注我哦

1. java基础以及多个“比较”

1.Collections.sort排序内部原理

在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java 7中,内部实现换成了TimSort,其对对象间比较的实现要求更加严格

2.hashMap原理,java8做的改变

从结构实现来讲,HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全。ConcurrentHashMap线程安全。解决碰撞:当出现冲突时,运用拉链法,将关键词为同义词的结点链接在一个单链表中,散列表长m,则定义一个由m个头指针组成的指针数组T,地址为i的结点插入以T(i)为头指针的单链表中。Java8中,冲突的元素超过限制(8),用红黑树替换链表。

3.String 和 StringBuilder 的区别

1)可变与不可变:String不可变,每一次执行“+”都会新生成一个新对象,所以频繁改变字符串的情况中不用String,以节省内存。

2)是否多线程安全:StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。StringBuffer和String均线程安全。

4.Vector 与 Array 的区别

1)ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。2)Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

5.HashMap 与 Hashtable 的区别

1) 历史原因: Hashtable继承Dictonary类, HashMap继承自abstractMap

2) HashMap允许空的键值对, 但最多只有一个空对象,而HashTable不允许。 3) HashTable同步,而HashMap非同步,效率上比HashTable要高

6.ConncurrentHashMap和hashtable比较

两个线程并发访问map中同一条链,一个线程在尾部删除,一个线程在前面遍历查找,问为什么前面的线程还能正确的查找到后面被另一个线程删除的节点)

ConcurrentHashMap融合了hashtable和hashmap二者的优势。hashtable是做了同步的,即线程安全,hashmap未考虑同步。所以hashmap在单线程情况下效率较高。hashtable在的多线程情况下,同步操作能保证程序执行的正确性。但是hashtable是阻塞的,每次同步执行的时候都要锁住整个结构,ConcurrentHashMap正是为了解决这个问题而诞生的,

ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术(一个Array保存多个Object,使用这些对象的锁作为分离锁,get/put时随机使用任意一个)。它使用了多个锁来控制对hash表的不同部分进行的修改。在JDK 1.6中,有HashEntry结构存在,每次插入将新添加节点作为链的头节点(同HashMap实现),而且每次删除一个节点时,会将删除节点之前的所有节点拷贝一份组成一个新的链,而将当前节点的上一个节点的next指向当前节点的下一个节点,从而在删除以后有两条链存 在,因而可以保证即使在同一条链中,有一个线程在删除,而另一个线程在遍历,它们都能工作良好,因为遍历的线程能继续使用原有的链。

Java8中,采用volatile HashEntry保存数据,table元素作为锁;从table数组+单向链表加上了红黑树。红黑树是一种特别的二叉查找树,特性为:1.节点为红或者黑 2.根节点为黑 3.叶节点为黑 4.一节点为红,则叶节点为黑 5.一节点到其子孙节点所有路径上的黑节点数目相同。

7.ArrayList与 LinkedList 的区别?

最明显的区别是ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。LinkedList是双向链表

8.Java 中,Comparator 与Comparable 有什么不同?

Comparable 接口用于定义对象的自然顺序,是排序接口,而 comparator 通常用于定义用户定制的顺序,是比较接口。我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。

9.抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类?

抽象类是指不允许被实例化的类;一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系

实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。但在Java8中允许接口中有静态默认的方法。

用抽象类是为了重用。减少编码量,降低耦合性。

10.描述 Java 中的重载和重写?

重载和重写都允许你用相同的名称来实现不同的功能,但是重载是编译时活动,而重写是运行时活动。你可以在同一个类中重载方法,但是只能在子类中重写方法。重写必须要有继承

重写:1、在子类中可以根据需要对从基类中继承来的方法进行重写。2、重写的方法和被重写的方法必须具有相同方法名称、参数列表和返回类型。3、重写方法不能使用比被重写的方法更严格的访问权限。

重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。

11.Collection与Collections的区别是什么?

Collection<E>是Java集合框架中的基本接口;

Collections是Java集合框架提供的一个工具类,其中包含了大量用于操作或返回集合的静态方法。

12.Java中多态的实现原理

所谓多态,指的就是父类引用指向子类对象,调用方法时会调用子类的实现而不是父类的实现。多态的实现的关键在于“动态绑定”。

13.object中定义了哪些方法?

clone(), equals(), hashCode(), toString(), notify(), notifyAll(),wait(), finalize(), getClass()

14. Java泛型和类型擦除

泛型即参数化类型,在创建集合时,指定集合元素的类型,此集合只能传入该类型的参数。类型擦除:java编译器生成的字节码不包含泛型信息,所以在编译时擦除:1.泛型用最顶级父类替换;2.移除。

15.说出 5 个 JDK 1.8 引入的新特性?

Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性:Lambda 表达式;允许像对象一样传递匿名函数 Stream API,充分利用现代多核 CPU,可以写出很简洁的代码 ;Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用 扩展方法,现在,接口中可以有静态、默认方法; 重复注解,现在你可以将相同的注解在同一类型上使用多次。

16.java中public,private,protected以及默认关键字的访问范围:

Protected可在包内及包外子类访问,default只能同一包内访问,prvate只能同一类

17. 常用数据结构:

集合,线性结构(数组,队列,链表和栈),树形结构,图状结构

18.Java 中的 TreeMap 是采用什么树实现的?(答案)

Java 中的 TreeMap 是使用红黑树实现的。

19. 匿名内部类是什么?如何访问在其外面定义的变量?

匿名内部类也就是没有名字的内部类,匿名内部类只能使用一次,它通常用来简化代码编写。

匿名内部类只能访问外部类的Final变量. Java 8更加智能:如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰。

20. 如何创建单例模式?说了双重检查,他说不是线程安全的。如何高效的创建一个线程安全的单例?

一种是通过枚举,一种是通过静态内部类。

21.poll() 方法和 remove() 方法的区别?

poll() 和remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

22.写一段代码在遍历 ArrayList 时移除一个元素

使用迭代器。

Iterator itr = list.iterator();while(itr.hasNext()) {if(...) { itr.remove();} }

2. JVM

1.JVM如何加载一个类的过程,双亲委派模型中有哪些方法

类加载过程:加载、验证(验证阶段作用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM造成危害)、准备(准备阶段为变量分配内存并设置类变量的初始化)、解析(解析过程是将常量池内的符号引用替换成直接引用)、初始化。

双亲委派模型中方法:双亲委派是指如果一个类收到了类加载的请求,不会自己先尝试加载,先找父类加载器去完成。当顶层启动类加载器表示无法加载这个类的时候,子类才会尝试自己去加载。当回到最开的发起者加载器还无法加载时,并不会向下找,而是抛出ClassNotFound异常。

方法:启动(Bootstrap)类加载器,标准扩展(Extension)类加载器,应用程序类加载器(Application ),上下文(Custom)类加载器。意义是防止内存中出现多份同样的字节码 。

2.GC算法(什么样的对象算是可回收对象,可达性分析),CMS收集器

jvm是如何判断一个对象已经变成了可回收的“垃圾”,一般是两个方法:引用记数法和根搜索算法。引用记数法没办法解决循环引用的问题,所以用根搜索。从一系列的”GC Roots“对象开始向下搜索,搜索走过的路径称为引用链。当一个对象到”GC Roots“之间没有引用链时,被称为引用不可达。引用不可到的对象被认为是可回收的对象。

3.JVM分为哪些区,每一个区干吗的?

1)方法区(method):被所有的线程共享。方法区包含所有的类信息和静态变量。

2)堆(heap):被所有的线程共享,存放对象实例以及数组,Java堆是GC的主要区域。

3)栈(stack):每个线程包含一个栈区,栈中保存一些局部变量等。

4)程序计数器:是当前线程执行的字节码的行指示器。

4.JVM新生代,老年代,持久代,都存储哪些东西?

持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。所有新生成的对象首先都是放在年轻代的,年老代中存放的都是一些生命周期较长的对象。

5.内存溢出和内存泄漏:

内存溢出:程序申请内存时,没有足够的内存,out of memory;内存泄漏值垃圾对象无法回收,可以使用memory analyzer工具查看泄漏。

6.进程与线程:

进程值运行中的程序(独立性,动态性,并发性),线程指进程中的顺序执行流。区别是:1.进程间不共享内存 2.创建进程进行资源分配的代价要大得多,所以多线程在高并发环境中效率高。

7.序列化与反序列化:

序列化指将java对象转化为字节序列,反序列化相反。主要是为了java线程间通讯,实现对象传递。只有实现了Serializable或Externalizable接口类对象才可被序列化。

8.64 位 JVM 中,int 的长度是多数?

Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。

9.Java 中 WeakReference 与 SoftReference的区别?

Java中一共有四种类型的引用。StrongReference、 SoftReference、 WeakReference 以及 PhantomReference。

StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内,当没有任何对象指向它时将会被GC回收

WeakReference,顾名思义, 是一个弱引用, 当所引用的对象在JVM 内不再有强引用时, 将被GC回收

虽然 WeakReference 与 SoftReference 都有利于提高 GC 和 内存的效率,但是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得SoftReference 非常适合缓存应用

10.解释 Java 堆空间及 GC?

当通过 Java 命令启动Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。

11.Java 中堆和栈有什么区别?

JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

3. 并发,锁

1.volatile关键字, Lock

并发编程中:原子性问题,可见性问题,有序性问题。

volatile关键字能保证可见性,字能禁止指令重排序,但是不能保证原子性。可见性只能保证每次读取的是最新的值,但是volatile没办法保证对变量的操作的原子性。在生成的会变语句中加入Lock关键字和内存屏障。

Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题。用sychronized修饰的方法或者语句块在代码执行完之后锁自动释放,而用Lock需要我们手动释放锁

2.MYSQL常用优化(sql优化,表结构优化等)

SQL优化、表机构优化、索引优化、缓存参数优化

3.java每改一点都需要重新编译打包部署,有没有更好的方法

可以使用热加载

4.进程间通信有哪几种方式?

1)管道(Pipe),2)命名管道(named pipe),3)信号(Signal),4)消息(Message)队列,5)共享内存,6)内存映射(mapped memory),7)信号量(semaphore),8)套接口(Socket)

5.Sychronized修饰静态方法,锁定类本身而不是实例,非静态方法锁定实例。

6. 操作系统什么情况下会死锁?

所谓死锁:是指多个进程在运行过程中因争夺资源而造成的一种僵局。产生的原因:竞争资源:当系统中多个进程使用共享资源,并且资源不足以满足需要,会引起进程对资源的竞争而产生死锁。进程间推进的顺序非法:请求和释放资源的顺序不当,也同样会导致产生进程死锁

7.产生死锁的四个条件:

1.互斥条件(进程独占资源)2.请求与保持(进程因请求资源而阻塞时,对已获得的资源保持不放) 3.不剥夺条件(进程已获得的资源,在末使用完之前,不能强行剥夺) 4.循环等待(若干进程之间形成一种头尾相接的循环等待资源关系)

8. 如何理解分布式锁?

由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题。

9. 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?

线程同步与否 跟 阻塞非阻塞没关系,同步是个过程,阻塞是线程的一种状态。多个线程操作共享变量时可能会出现竞争。这时需要同步来防止两个以上的线程同时进入临界区内,在这个过程中后进入临界区的线程将阻塞,等待先进入的线程走出临界区。

10. 同步和异步有什么区别?

同步和异步最大的区别就在于。一个需要等待,一个不需要等待。同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。

11. 线程池

根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行

12. 如何调用 wait()方法?使用 if 块还是循环?为什么?

wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。

wait(),notify()和notifyall()方法是java.lang.Object类为线程提供的用于实现线程间通信的同步控制方法。等待或者唤醒

13. 实现线程的几种方法

(1)继承Thread类,重写run函数 (2)实现Runnable接口,重写run函数 (3)实现Callable接口,重写call函数

14. 什么是多线程环境下的伪共享(falsesharing)?

伪共享是多线程系统(每个处理器有自己的局部缓存)中一个众所周知的性能问题。缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。

4. 网络、数据库

1.TCP如何保证可靠传输?三次握手过程?

在TCP的连接中,数据流必须以正确的顺序送达对方。TCP的可靠性是通过顺序编号和确认(ACK)来实现的。TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。第一次是客户端发起连接;第二次表示服务器收到了客户端的请求;第三次表示客户端收到了服务器的反馈。

2. Linux下你常用的命令有哪些?

3. 常用的hash算法有哪些?

1.加法hash:所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。

2.位运算hash:这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素

3.乘法hash:33*hash + key.charAt(i)

4. 什么是一致性哈希?

设计目标是为了解决因特网中的热点(Hot spot)问题,一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:1、平衡性(Balance) 2、单调性(Monotonicity) 3、分散性(Spread) 4、负载(Load)

5. 数据库中的范式有哪些?

第一范式----数据库中的表(所有字段值)都是不可分割的原子数据项。

第二范式----数据库表中的每一列都和主键相关,而不能只和主键的某一部分相关。

第三范式----数据库表中每一列数据都和主键直接相关,不能间接相关。范式是为了减小数据冗余。

6. 数据库中的索引的结构?什么情况下适合建索引?

数据库中索引的结构是一种排序的数据结构,数据库索引是通过B树和变形的B+树实现的。什么情况下不适合建立索引:1.对于在查询过程中很少使用或参考的列;对于那些只有很少数据值的列;对于那些定义为image,text和bit数据类型的列;当修改性能远大于检索性能。

根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行

7. concurrent包下面,都用过什么?

java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.lock

8. 常用的数据库有哪些?redis用过吗?

Orcale,MySQL,DB2

9. 你知道的开源协议有哪些?

GPL (GNU General Public License) :GNU通用公共许可协议

LGPL (GNU Lesser General Public License) :GNU宽通用公共许可协议

BSD(Berkeley Software Distribution) :伯克利软件分发许可协议

MIT (Massachusetts Institute of Technology):MIT之名源自麻省理工学院

Apache (Apache License) :Apache许可协议

MPL (Mozilla Public License) :Mozilla公共许可协议

10.表单提交中,get和post区别

1.get从服务器获取信息,post向服务器传信息 2.get传送数据量比较小,post可以比较大 3.get安全性比较低

11. TCP 协议与 UDP 协议有什么区别?(answer答案)

TCP(Tranfer Control Protocol)的缩写,是一种面向连接的保证传输的协议,在传输数据流前,双方会先建立一条虚拟的通信道。可以很少差错传输数据。

UDP(User DataGram Protocol)的缩写,是一种无连接的协议,使用UDP传输数据时,每个数据段都是一个独立的信息,包括完整的源地址和目的地,在网络上以任何可能的 路径传到目的地,因此,能否到达目的地,以及到达目的地的时间和内容的完整性都不能保证。

所以TCP必UDP多了建立连接的时间。相对UDP而言,TCP具有更高的安全性和可靠性。

TCP协议传输的大小不限制,一旦连接被建立,双方可以按照一定的格式传输大量的数据,而UDP是一个不可靠的协议,大小有限制,每次不能超过64K。

评论0 赞同0
  •  加载中...
piapia

piapia

回答于2022-06-28 15:58

你好,自己作为一个多年经验的开发,面试经历还是比较丰富的。

在我印象中,面试质量很高的面试,应该是这样的:

1、java技术面试

1.1、java技术面全

在java技术面试过程中,面试的技术比较全,比如从java基础到java集合、再到多线程、框架和缓存等等方面都问到了,主要考察的还是一个几年经验的java 开发者的技术掌握面和知识掌握度。

1.2、java技术面深

这一块的,在一些比较大的公司,会特别注重java知识点的深度。比如在java集合的考察中,List、set、hashMap 的底层实现以及区别。hashMap 的get方法和put方法的底层实现。在synchronize 关键字在静态方法上和代码块上有什么不同,以及synchronize的底层实现。

2、项目场景与java技术实现

这一块就比java技术面要更难一些了。比如你做的电商项目,是否做过分库分表,如果做了分库分表,怎么保证全局id的?你们系统下订单30分钟后订单未付款自动取消订单,怎么实现的?你们的消息队列系统怎么保证消息不重复消费?等问题。

3、个人工作愿景

这一块的话,主要的考察的还是个人是否有自己的想法或职业规划。一般在大公司都是有这种问题,这个还要自己多多思考,自己想要什么,想做什么样的工作。还有就是个人价值观与公司文化是否吻合等等,这一块的考虑。

可以关注个人微信公众号“我的个人记事

如果想学习java,准备java分布式消息队列面试,在蜻蜓FM,搜索“浅戏互联网”并关注,就可以有免费的互联网高级java面试视频啦,后续不断更新中。

评论0 赞同0
  •  加载中...
Render

Render

回答于2022-06-28 15:58

这是找的记录35轮大厂面试(都是面试重点)

整理笔记的同时,也过了一遍知识点,加油!!

A:Java

  • 通过几段 Java 代码理解 RPC
  • 实体类的属性映射怎么可以少了它?
  • 内存结构和垃圾回收算法
  • 还在重复写空指针检查代码?考虑使用 Optional 吧!
  • 优雅地处理异常真是一门学问啊!
  • 你还在使用JDK7,今天带你来了解一下JDK8,不得不说,真香!
  • 灵魂拷问:为什么 Java 字符串是不可变的?
  • for循环用了那么多次,但你真的了解它么?
  • 我就问你,会不会工厂模式?
  • 看懂 HashMap 中的红黑树实现原理
  • Java IO
  • 掌握 HashMap看这就够了
  • Java:前程似锦的 NIO 2.0
  • 深入浅出分析 Collection 中的 List 接口
  • Java 又双叒叕发布新版本,这么多版本如何灵活管理?
  • Java Serializable:明明就一个空的接口嘛

B:JVM原理

  • Java内存区域的分配
  • Java对象不都是分配在堆上
  • 类加载机制
  • 内存分配(堆上的内存分配)
  • GC回收机制
  • 垃圾收集器
  • Stop The World
  • Java内存模型
  • happens-before
  • JVM调优

C:Spring

  • 什么是Spring
  • Spring MVC流程
  • 解决循环依赖
  • Bean的生命周期
  • Bean的作用域
  • IOC(DI)
  • Spring AOP
  • 研究一下Spring里面的源码,循环依赖你会么?
  • 搞定 Spring 定时任务在此一举!
  • Spring 源码学习(一)-容器的基础结构
  • Spring 源码学习(二)-默认标签解析
  • Spring 源码学习(三)-自定义标签
  • Spring 源码学习(四) bean 的加载
  • Spring 源码学习(五) 循环依赖
  • Spring 源码学习(六)扩展功能 上篇
  • Spring 源码学习(七)扩展功能 下篇
  • Spring 源码学习(八) AOP 使用和实现原理
  • Spring 源码学习(九) Transaction 事务
  • Spring 源码学习总结

D:Spring Boot

  • 什么是Spring Boot?
  • Spring Boot有哪些优点?
  • 什么是JavaConfig?
  • 如何重新加载Spring Boot上的更改,而无需重新启动服务器?
  • Spring Boot中的监视器是什么?
  • 如何在Spring Boot中禁用Actuator端点安全性?
  • 如何在自定义端口上运行Spring Boot应用程序?
  • 如何实现Spring Boot应用程序的安全性?
  • 如何集成Spring Boot和ActiveMQ?
  • 如何使用Spring Boot实现分页和排序?
  • 什么是Swagger?你能用Spring Boot实现了它吗?
  • 我们如何监视所有Spring Boot微服务?
  • Spring Boot(一):入门篇
  • Spring Boot(三):Spring Boot 中 Redis 的使用
  • Spring Boot(四):Thymeleaf 使用详解
  • Spring Boot(五):Spring Boot Jpa 的使用
  • Spring Boot(六):如何优雅的使用 Mybatis
  • Spring Boot(七):Mybatis 多数据源最简解决方案
  • Spring Boot(八):RabbitMQ 详解
  • Spring Boot(九):定时任务
  • Spring Boot (十):邮件服务
  • Spring Boot(十一):Spring Boot 中 MongoDB 的使用
  • Spring Boot(十二):Spring Boot 如何测试打包部署
  • Spring Boot (十三): Spring Boot 小技巧
  • Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管
  • Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例
  • 利用SpringBoot+RabbitMQ,实现一个邮件推送服务
  • 关于SpringBoot还有你不知道的事
  • 利用springboot+dubbo,构建分布式微服务,全程注解开发
  • SpringBoot 2.X 整合Redis做缓存,实战分享

E:MySQL

  • 引擎对比
  • 数据库性能优化
  • SQL优化
  • 事务隔离级别
  • 锁表、锁行
  • 索引
  • 分区分库分表
  • mysql的复制原理以及流程
  • mysql 支持的复制类型
  • mysql 中 myisam 与 innodb 的区别
  • MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

F:Redis

  • 数据类型
  • 集群模式
  • 使用策略
  • 缓存问题
  • 持久化
  • 项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?
  • redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis单线程却能支撑高并发?
  • redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
  • redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?
  • 如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么?
  • redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的
  • redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?
  • 了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况如何处理 redis 的穿透?
  • 如何保证缓存与数据库的双写一致性?
  • redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?
  • 生产环境中的 redis 是怎么部署的?

G:操作系统

  • 线程和进程区别
  • 查看某个进程中的线程
  • 查看某个文件夹中每个文件夹的大小
  • CPU负载的含义

H:网络通信协议

  • TCP/IP
  • HTTP
  • TCP
  • HTTPS

I:数据结构和算法(11节)(字节必问)

  • HashCode为什么使用31作为乘数?
  • HashMap 源码分析(上)
  • HashMap 源码分析(下)
  • 2-3树与红黑树(上)
  • 2-3树与红黑树(下)
  • ArrayList 详细分析
  • LinkedList、ArrayList,插入分析
  • 双端队列、延迟队列、阻塞队列
  • java.util.Collections、排序、二分、洗牌、旋转算法
  • StringBuilder 与 String 对比
  • ThreadLocal 源码分析
  • 数组-快速排序-第K大个数
  • 数组-对撞指针-最大蓄水
  • 数组-滑动窗口-最小连续子数组
  • 数组-归并排序-合并有序数组
  • 链表-链表反转-链表相加
  • 链表-双指针-删除倒数第n个
  • 二叉树-递归-二叉树反转
  • 动态规划-连续子数组最大和
  • 数据结构-LRU淘汰算法

J:设计模式

  • 单例模式
  • 装饰器模式
  • 策略模式
  • 观察者模式

K:从URL到看到网页的过程

  • 从URL开始,定位世界
  • 键盘与硬件中断
  • 浏览器解析URL
  • 按下回车键之后
  • DNS解析
  • 发送DNS查找请求
  • 建立HTTPS、TCP连接
  • 建立TCP连接
  • 进行TLS加密过程
  • 服务端的处理
  • 负载均衡
  • 服务器的处理
  • 浏览器的渲染
  • CSS解析

L:项目举例

  • 秒杀架构
  • 业务上适当规避
  • 技术上硬核抗压

M:系统设计

  • 系统设计-高并发抢红包
  • 系统设计-答题套路
  • 系统设计-在AWS上扩展到数百万用户的系统
  • 系统设计-从面试者角度设计—个系统设计题

N:多线程

  • Thread.start() 启动原理
  • Thread,状态转换、方法使用、原理分析
  • ThreadPoolExecutor
  • 线程池讲解以及JVMTI监控

O:分布式

  • CAP理论
  • 为什么用
  • 实现方式
  • 事务
  • 消息队列
  • 协调器
  • ID生存方式
  • 一致性hash

P:微服务

  • 微服务介绍
  • 服务发现
  • API网关
  • 服务容错保护
  • 服务配置中心

Q:MyBatis

  • MyBatis的实现逻辑
  • MyBatis的缓存实现逻辑
  • #{} 和 ${} 的区别是什么?
  • MyBatis中自定义标签的执行原理
  • 简述Mapper接口的工作原理
  • 在Spring中Mapper接口是如何被注入的?
  • 在Mapper接口中是否可以有重载方法?
  • 当实体类中的属性名和表中的字段名不一样 ,怎么办?
  • 如何获取自动生成的键值?
  • Mybatis有哪些Executor执行器?
  • MyBatis的延迟加载原理
  • MyBatis的插件运行原理
  • Mybatis是如何进行分页的?
  • Mybatis如何处理include标签的?
  • MyBatis与Hibernate有哪些不同?
  • JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
  • Mybatis比IBatis比较大的几个改进是什么?

R:Java开发高级面试题(重点)

  • 消息队列
  • Redis缓存
  • 读写分离
  • 如何设计一个高并发系统?
  • 分布式系统
  • 高可用架构
  • SpringCloud微服务架构

尚硅谷Java大厂面试题第3季,跳槽必刷题目+必扫技术盲点(周阳主讲)_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1Hy4y1B78T?

尚硅谷Java大厂面试题第2季,面试必刷,跳槽大厂神器_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV18b411M7xz?

尚硅谷经典Java面试题第一季(java面试精讲)_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1Eb411P7bP?

强烈推荐一个网站:

Java面试题-帮助你通过Java面试 (zwmst.com)

https://zwmst.com/

评论0 赞同0
  •  加载中...
galaxy_robot

galaxy_robot

回答于2022-06-28 15:58


从ucloud的常规java技术面试角度说一说,一般都是由浅到深去问,思路是先考察基础是否过关,再通过深度考察是否有技术热情和深度,同时可能会通过提出一些质疑和挑战来考察候选人是如何与不同意见进行沟通

考察内容和方式

  • 基础知识:考察基础的时候一般都不会太深入地去问,主要目的是考察知识面,如果发现候选人很多都不知道可能就不会继续进入下一步的考察。
    • JDK 集合、BIO/NIO、annotation 等
    • 虚拟机 内存模型、类加载原理
    • 数据库 索引、事务、死锁 等
    • 并发 并发优缺点、内存可见性(volatile)、锁、同步、线程池框架
    • 网络 TCP/HTTP
    • 常见设计模式
  • 深入考察:深入考察的时候不会像考察基础一样面面俱到,而是会在某个点上深入去聊,这个点的选择可能是让候选人自己选一个点,也可能是面试官根据简历内容去选,主要目的是考察候选人对某个技术点的深入掌握程度,技术是相通的,如果一个人能在某个技术点上达到很深入的程度,其他点上通常也不会有太大问题;相反如果某个人在他声称很了解的点上都支支吾吾、一知半解多半可以判断此人要么技术能力有限、要么遇到问题不愿深入考察、浅尝辄止。
    • JDK ConcurrentHashMap如何提高并发度、NIO的原理(零拷贝、堆外内存),优缺点
    • 虚拟机 包冲突,类冲突的形成原理及解决办法(可能会引申JDK9的模块化设计)、TCCL的存在价值
    • 分布式 一致性哈希、RPC原理和设计(通信协议、序列化方式、超时机制等)、负载均衡、分布式缓存架构设计、分布式消息、分布式事务、paxos(这个可能只有在技术专业型很强的职位上会去问)
    • 数据库 数据库性能优化(慢sql、索引优化、大事务、内核参数调优),也可能会把一些工作中碰到的诡异场景抛出来问
    • 并发 非阻塞锁(CAS)、并发对编译器优化的影响、线程池调优、也肯会把工作中碰到的并发问题抛出来问
    • 技术趋势、docker、微服务等新技术发展历史、带来的福利

如何准备

首先要声明的是,最好的“准备”方式一定是平时多积累、遇到问题不要逃避或者讨巧、深入去思考并解决,在解决一个个问题的过程中积累解决问题的能力,形成自己的知识体系。所以这里说的如何准备不是说临时抱佛脚,而是如何能通过提前准备把自己平时的积累展现出来,不因为临场的表现影响面试官对你的判断。

  1. 针对以上列的知识点思考答案甚至扩展,如果能知道大部分,深入一部分就很好,这个过程主要是整理自己的知识体系
  2. 回忆整理简历和过往项目中的”难点“、”亮点“,因为这些是用来区分候选人很重要的点,合格的面试官一定会问类似于”你在项目中经历的最大的技术难点是什么?“,整理一下思路,不至于在面试时候因为时间久远而回忆不起来细节影响面试效果。
  3. 沟通过程中做到有理有据,不要过于自大,也无需刻意迎合面试官。沟通的本质是信息透明化,工作中也许我们无法做到完全客观公正,但是在技术问题上坚持自己的客观和原则是我认为技术人应该坚持的品格,我这里说的坚持不是一根筋的固执已见,而是根据共同认可的事实进行逻辑推断得出的观点。长远来看这种品格会带给你足够的技术影响力和回报。
同时可以关注下,每周都是定时更新一些Java技术精彩内容分享给大家!

评论0 赞同0
  •  加载中...
SnaiLiu

SnaiLiu

回答于2022-06-28 15:58

目前还真没遇到过,还在动力节点培训学习Java,已经学了4个多月了,马上也该准备刷面试题了!尽管四个多月有老师的辅导,自己也很努力,但是一想到后面真要面试找工作还真有点怂,不过好就好在老师们都特别负责,也特别专业,因为这个学校就是只教Java一门语言的,所以讲师们作为一线大咖,完全问不倒,我也是个特别爱问问题的人,这一点也是我学习效率提高的原因吧,希望我后面面试一切顺利~

评论0 赞同0
  •  加载中...

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<