关于java:金九银十想去跳槽面试那这份Java面经你真得看看了写的非常详细

7次阅读

共计 6832 个字符,预计需要花费 18 分钟才能阅读完成。

前言

前两天在和敌人吃饭的时候聊到工夫这个货色是真的过的好坏啊,金三银四好像还在昨天。一眨眼金九银十又快到了,对程序员来说这两个是一年最合适的跳槽涨薪环节了,往年的你曾经做好筹备了吗?无妨看看这篇文章吧,根本的面试流程以及面试题全整顿在下方了!

一、面试整体流程

1. 简略的自我介绍
2. 简略介绍一下你的我的项目
为了解决 XXX 问题,开发了一套 XXX 零碎,该零碎次要有那些局部组成,简略介绍我的项目的架构,参加哪个模块的开发,说一下这个模块的业务及设计
3. 问一些 JAVA 的基础知识
4. 个别会问你还有什么须要问我的吗?
(1)公司要做的我的项目?
(2)我的项目中会应用什么技术?
(3)如果我来实习的话,是间接加入我的项目吗?
(4)实习的话,你们对我有什么要求吗?
(5)你们这个产品的顶峰并发量是多少?
5. 技术面完后,会让你回家等音讯或者等 HR 谈薪资

二、Java 根底

1.Java8 的新个性


Lambda 表达式 Java 8 中最大的语言扭转;它容许咱们将函数当成参数传递给某个办法,或者把代码自身当作数据处理。
最简略的 Lambda 表达式可由逗号分隔的参数列表、-> 符号和语句块组成

Arrays.asList("a", "b", "d").forEach(e -> System.out.println( e) );

Lambda 的设计者们为了让现有的性能与 Lambda 表达式良好兼容,思考了很多办法,于是产生了函数接口这个概念。函数接口指的是只有一个函数的接口,这样的接口能够隐式转换为 Lambda 表达式。
接口的默认办法和静态方法
Java 8 应用两个新概念扩大了接口的含意:默认办法和静态方法。默认办法使得接口有点相似 traits,不过要实现的指标不一样。默认办法使得开发者能够在 不毁坏二进制兼容性的前提下,往现存接口中增加新的办法,即不强制那些实现了该接口的类也同时实现这个新加的办法。

默认办法和形象办法之间的区别在于形象办法须要实现,而默认办法不须要。接口提供的默认办法会被接口的实现类继承或者覆写。
办法援用
办法援用使得开发者能够间接援用现存的办法、Java 类的构造方法或者实例对象。办法援用和 Lambda 表达式配合应用,使得 java 类的构造方法看起来紧凑而简洁,没有很多简单的模板代码。
反复注解
自从 Java 5 中引入注解以来,这个个性开始变得十分风行,并在各个框架和我的项目中被宽泛应用。不过,注解有一个很大的限度是:在同一个中央不能屡次应用同一个注解。Java 8 突破了这个限度,引入了反复注解的概念,容许在同一个中央屡次应用同一个注解。

2.JDK 和 JRE 有什么区别?

Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

3.== 和 equals 的区别是什么?
对于根本类型和援用类型 == 的作用成果是不同的
根本类型:比拟的是值是否雷同;
援用类型:比拟的是援用是否雷同;
equals
equals 实质上就是 ==,判断两个对象的某些特色是否相等。

int 多少字节

4 字节 32 位

String 属于根底的数据类型吗?

String 不属于根底类型,根底类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

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

操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 申明的是不可变的对象,每次操作都会生成新的 String 对象,而后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 能够在原有对象的根底上进行操作,所以在常常扭转字符串内容的状况下最好不要应用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程平安的,而 StringBuilder 是非线程平安的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下举荐应用 StringBuilder,多线程环境下举荐应用 StringBuffer。

String 类的罕用办法都有那些?

equals():字符串比拟
charAt():返回指定索引处的字符。
indexOf():返回指定字符的索引。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
replace():字符串替换。

抽象类能应用 final 润饰吗?
不能,定义抽象类就是让其余类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能润饰抽象类

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

实现:抽象类的子类应用 extends 来继承;接口必须应用 implements 来实现接口。
构造函数:抽象类能够有构造函数;接口不能有
实现数量:类能够实现很多个接口;然而只能继承一个抽象类。
拜访修饰符:接口中的办法默认应用 public 润饰;抽象类中的办法能够是任意拜访修饰符。

HashMap 和 Hashtable 有什么区别?

hashMap 去掉了 HashTable 的 contains 办法,然而加上了 containsValue()和 containsKey()办法。
hashTable 同步的,而 HashMap 是非同步的,效率上逼 hashTable 要高。
hashMap 容许空键值,而 hashTable 不容许

如何决定应用 HashMap 还是 TreeMap?

对于在 Map 中插入、删除和定位元素这类操作,HashMap 是最好的抉择。然而,如果你须要对一个有序的 key 汇合进行遍历,TreeMap 是更好的抉择。基于你的 collection 的大小,兴许向 HashMap 中增加元素会更快,将 map 换为 TreeMap 进行有序 key 的遍历。

说一下 HashMap 的实现原理?

HashMap 的数据结构:在 java 编程语言中,最根本的构造就是两种,一个是数组,另外一个是模仿指针(援用),所有的数据结构都能够用这两个根本构造来结构的,HashMap 也不例外。HashMap 实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

当咱们往 Hashmap 中 put 元素时, 首先依据 key 的 hashcode 从新计算 hash 值, 杜绝 hash 值得到这个元素在数组中的地位(下标), 如果该数组在该地位上曾经寄存了其余元素, 那么在这个地位上的元素将以链表的模式寄存, 新退出的放在链头, 最先退出的放入链尾. 如果数组中该地位没有元素, 就间接将该元素放到数组的该地位上。

须要留神 Jdk 1.8 中对 HashMap 的实现做了优化, 当链表中的节点数据超过八个之后, 该链表会转为红黑树来进步查问效率, 从原来的 O(n)到 O(logn)

ArrayList 和 LinkedList 的区别是什么?

最显著的区别是 ArrrayList 底层的数据结构是数组,反对随机拜访,而 LinkedList 的底层数据结构是双向循环链表,不反对随机拜访。应用下标拜访一个元素,ArrayList 的工夫复杂度是 O(1),而 LinkedList 是 O(n)。

三、多线程

并行和并发有什么区别?

并行是指两个或者多个事件在同一时刻产生;而并发是指两个或多个事件在同一时间距离产生。
并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

线程和过程的区别?

简而言之,过程是程序运行和资源分配的根本单位,一个程序至多有一个过程,一个过程至多有一个线程。过程在执行过程中领有独立的内存单元,而多个线程共享内存资源,缩小切换次数,从而效率更高。线程是过程的一个实体,是 cpu 调度和分派的根本单位,是比程序更小的能独立运行的根本单位。同一过程中的多个线程之间能够并发执行。

创立线程有哪几种形式?

①. 继承 Thread 类创立线程类
定义 Thread 类的子类,并重写该类的 run 办法,该 run 办法的办法体就代表了线程·要实现的工作。因而把 run()办法称为执行体。
·创立 Thread 子类的实例,即创立了线程对象。
·调用线程对象的 start()办法来启动该线程。

②. 通过 Runnable 接口创立线程类
定义 runnable 接口的实现类,并重写该接口的 run()办法,该 run()办法的办法体同样是该线程的线程执行体。
创立 Runnable 实现类的实例,并依此实例作为 Thread 的 target 来创立 Thread 对象,该 Thread 对象才是真正的线程对象。
调用线程对象的 start()办法来启动该线程。

③. 通过 Callable 和 Future 创立线程

线程有哪些状态?

线程通常都有五种状态,创立、就绪、运行、阻塞和死亡。
1. 创立状态。在生成线程对象,并没有调用该对象的 start 办法,这是线程处于创立状态。
2. 就绪状态。当调用了线程对象的 start 办法之后,该线程就进入了就绪状态,然而此时线程调度程序还没有把该线程设置为以后线程,此时处于就绪状态。在线程运行之后,从期待或者睡眠中回来之后,也会处于就绪状态。
3. 运行状态。线程调度程序将处于就绪状态的线程设置为以后线程,此时线程就进入了运行状态,开始运行 run 函数当中的代码。
4. 阻塞状态。线程正在运行的时候,被暂停,通常是为了期待某个工夫的产生 (比如说某项资源就绪) 之后再持续运行。sleep,suspend,wait 等办法都能够导致线程阻塞。
5. 死亡状态。如果一个线程的 run 办法执行完结或者调用 stop 办法后,该线程就会死亡。对于曾经死亡的线程,无奈再应用 start 办法令其进入就绪

创立线程池有哪几种形式?

①. newFixedThreadPool(int nThreads)
创立一个固定长度的线程池,每当提交一个工作就创立一个线程,直到达到线程池的最大数量,这时线程规模将不再变动,当线程产生未预期的谬误而完结时,线程池会补充一个新的线程。

②. newCachedThreadPool()
创立一个可缓存的线程池,如果线程池的规模超过了解决需要,将主动回收闲暇线程,而当需要减少时,则能够主动增加新线程,线程池的规模不存在任何限度。

③. newSingleThreadExecutor()
这是一个单线程的 Executor,它创立单个工作线程来执行工作,如果这个线程异样完结,会创立一个新的来代替它;它的特点是能确保按照工作在队列中的程序来串行执行。

线程池都有哪些状态?

线程池有 5 种状态:Running、ShutDown、Stop、Tidying、Terminated。

什么是死锁?

死锁是指两个或两个以上的过程在执行过程中,因为竞争资源或者因为彼此通信而造成的一种阻塞的景象,若无外力作用,它们都将无奈推动上来。此时称零碎处于死锁状态或零碎产生了死锁,这些永远在相互期待的过程称为死锁过程。是操作系统层面的一个谬误,是过程死锁的简称.

怎么避免死锁?

死锁的四个必要条件:
1. 互斥条件:过程对所调配到的资源不容许其余过程进行拜访,若其余过程拜访该资源,只能期待,直至占有该资源的过程应用实现后开释该资源
2. 申请和放弃条件:过程取得肯定的资源之后,又对其余资源发出请求,然而该资源可能被其余过程占有,此事申请阻塞,但又对本人取得的资源放弃不放
3. 不可剥夺条件:是指过程已取得的资源,在未实现应用之前,不可被剥夺,只能在应用完后本人开释
4. 环路期待条件:是指过程产生死锁后,若干过程之间造成一种头尾相接的循环期待资源关系

四、Java Web

jsp 和 servlet 有什么区别?

1.jsp 经编译后就变成了 Servlet.(JSP 的实质就是 Servlet,JVM 只能辨认 java 的类,不能辨认 JSP 的代码,Web 容器将 JSP 的代码编译成 JVM 可能辨认的 java 类)
2.jsp 更善于体现于页面显示,servlet 更擅长于逻辑管制。
3.Servlet 中没有内置对象,Jsp 中的内置对象都是必须通过 HttpServletRequest 对象,HttpServletResponse 对象以及 HttpServlet 对象失去。

jsp 有哪些内置对象?作用别离是什么?
JSP 有 9 个内置对象:

request:封装客户端的申请,其中蕴含来自 GET 或 POST 申请的参数;
response:封装服务器对客户端的响应;
pageContext:通过该对象能够获取其余对象;
session:封装用户会话的对象;
application:封装服务器运行环境的对象;
out:输入服务器响应的输入流对象;
config:Web 利用的配置对象;
page:JSP 页面自身(相当于 Java 程序中的 this);
exception:封装页面抛出异样的对象。

说一下 jsp 的 4 种作用域?

1.page 代表与一个页面相干的对象和属性

2.request 代表与 Web 客户机收回的一个申请相干的对象和属性。一个申请可能逾越多个页面,波及多个 Web 组件;须要在页面显示的长期数据能够置于此作用域。
3.session 代表与某个用户与服务器建设的一次会话相干的对象和属性。跟某个用户相干的数据应该放在用户本人的 session 中。
4.application 代表与整个 Web 应用程序相干的对象和属性,它本质上是逾越整个 Web 应用程序,包含多个页面、申请和会话的一个全局作用域。

三次握手

第一次握手:客户端 TCP 过程也先建设传输管制块 TCB,而后向服务端发送连贯申请报文段,此时 SYN=1, 随机选定一个初始序号 seq=x,,此报文不能携带数据,然而要消耗掉一个序号,发送结束后,客户端进入 SYN-SENT(同步已发送)状态

第二次握手:服务端收到客户端申请连贯报文段后,若批准建设连贯,则发送确认报文,确认报文中 SYN=1、ACK=1, 确认号 ack=x+1, 同时随机选定一个本人序号 seq=y, 确认报文段同样不能携带数据,然而也要消耗掉一个序号,发送结束后服务端进入 SYN-RCVD(同步收到)状态

第三次握手:客户端收到确认报文后,查看 ACK=1,ack=x+ 1 是否正确,若正确,则向服务端发送确认报文,确认报文中 ACK=1,ack=y+1,seq=x+1, 发送后进入 ESTAB-LISHED 状态,服务端收到确认报文后,也进入 ESTAB-LISHED 状态,此时单方 TCP 连贯正式建设。

下面的连贯建设过程就是 TCP 三次握手。

为什么是三次握手?

为什么 client 收到确认报文后,还要再发送一次确认报文给 server 呢?这次要是为了避免已生效的连贯申请报文段忽然又送到了 Server 端。
如果只是两次握手,至少只有连贯发起方的起始序列号能被确认,另一方抉择的序列号则得不到确认。

总结起来看,TCP 三次握手过程就是 client 与 server 在互相确认各自发送和接管是否失常的过程:
第一次握手:client—>server,server 确认了 cilent 的发送能力和本人的接管能力是失常的

第二次握手:server—>client,client 确认了本人的发送能力和 server 的接管能力是失常的,然而 server 此时不分明本人的发送能力是否失常

第三次握手:client—>server,server 确认了本人的发送能力失常,同时也表明单方也都确认结束,能够开始传输数据。

简述 tcp 和 udp 的区别?

1.TCP 面向连贯(如打电话要先拨号建设连贯);UDP 是无连贯的,即发送数据之前不须要建设连贯。
2.TCP 提供牢靠的服务。也就是说,通过 TCP 连贯传送的数据,无差错,不失落,不反复,且按序达到;UDP 尽最大致力交付,即不保障牢靠交付。
3.UDP 具备较好的实时性,工作效率比 TCP 高,实用于对高速传输和实时性有较高的通信或播送通信。
4.TCP 对系统资源要求较多,UDP 对系统资源要求较少。

spring mvc 有哪些组件?

Spring MVC 的外围组件:
1.DispatcherServlet:地方控制器,把申请给转发到具体的管制类
2.Controller:具体解决申请的控制器
3.HandlerMapping:映射处理器,负责映射中央处理器转发给 controller 时的映射策略
4.ModelAndView:服务层返回的数据和视图层的封装类
5.ViewResolver:视图解析器,解析具体的视图
6.Interceptors:拦截器,负责拦挡咱们定义的申请而后做解决工作

最初

大家看完有什么不懂的能够在下方留言探讨,也能够关注我私信问我,我看到后都会答复的。也欢送大家关注我的公众号:前程有光,金三银四跳槽面试季,整顿了 1000 多道将近 500 多页 pdf 文档的 Java 面试题材料,文章都会在外面更新,整顿的材料也会放在外面。谢谢你的观看,感觉文章对你有帮忙的话记得关注我点个赞反对一下!

正文完
 0