前言
前两天在和敌人吃饭的时候聊到工夫这个货色是真的过的好坏啊,金三银四好像还在昨天。一眨眼金九银十又快到了,对程序员来说这两个是一年最合适的跳槽涨薪环节了,往年的你曾经做好筹备了吗?无妨看看这篇文章吧,根本的面试流程以及面试题全整顿在下方了!
一、面试整体流程
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面试题材料,文章都会在外面更新,整顿的材料也会放在外面。谢谢你的观看,感觉文章对你有帮忙的话记得关注我点个赞反对一下!