Java中级工程师面试题整理,拿到心仪企业的offer必要下狠心

怎样拿拿到心仪企业的offer呢?要是技术实力不够,还是得不断学习呀!下面是有关java中级工程师面试题的整理,一起来看看吧。

1、 springCloud是什么?

答案:springcloud是一个微服务框架,并提供全套分布式系统解决方案。支持配置管理,熔断机制,leader选举,服务治理,分布式session,微代理,控制总线,智能路由,一次性token。

2、Java中堆和栈有什么不同?

答案:每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。而堆是所有线程共享的一片公用内存区域。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值。

堆:(对象)

引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型常量),需要通过new等方式来创建。

堆内存主要作用是存放运行时创建(new)的对象。

(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)

栈:(基本数据类型变量、对象的引用变量)

基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放。

Java中级工程师面试题整理,拿到心仪企业的offer必要下狠心_第1张图片

好友添加:huany6880
加入资深Java学习交流圈,并有系统整理了一套java初学/进阶者最佳的学习方法以及路线图大纲,Java各核心知识点、架构主流技术资料/源码以及最新大厂面试题定期更新!

3、Spring的Scope有几种,分别是什么?

答案:有5种。

(1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。

(2)Prototype:每次调用新建一个Bean实例。

(3)Request:Web项目中,给每一个 http request 新建一个Bean实例。

(4)Session:Web项目中,给每一个 http session 新建一个Bean实例。

(5)GlobalSession:这个只在portal应用中有用,给每一个 global http session 新建一个Bean实例。

4、spring MVC与struts2的区别?

答案:

① Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截

② SpringMVC的方法之间基本上独立的,独享request response数据

③ 由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的

④ 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式

⑤ SpringMVC的入口是servlet,而Struts2是filter

⑥ SpringMVC集成了Ajax

⑦ SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱

⑧ Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高

⑨ Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展

⑩ SpringMVC开发效率和性能高于Struts2

5, Spring框架中的核心思想包括什么?

答案:主要思想是IOC控制反转,DI依赖注入,AOP面向切面。

6,ArrayList和LinkedList的区别?

答案:

1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

7,ArrayList,Vector主要区别是什么?

答案:

(1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比;

(2):ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍;

8、HashMap和Hashtable的区别是?

答案:

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。

HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

HashMap不能保证随着时间的推移Map中的元素次序是不变的。

9、线程和进程的区别?

答案:进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同;

(1) 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元

(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。

(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束

(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的

(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源

(6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志。

10、线程安全是什么?线程不安全是什么?

答案:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。(Vector,HashTable)

线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。(ArrayList,LinkedList,HashMap等)

11、Spring Bean的生命周期是?

· Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例

· Setter注入,执行Bean的属性依赖注入

· BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法

· BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法

· BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法

· InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法

· Bean定义文件中定义init-method

· BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法

· DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法

· Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法

简答springbean生命周期:

(1)实例化(必须的)构造函数构造对象

(2)装配(可选的)为属性赋值

(3)回调(可选的)(容器-控制类和组件-回调类)

(4)初始化(init-method=" ")

(5)就绪

(6)销毁(destroy-method=" ")

12、servlet生命周期?

答案:Servlet 通过调用 init () 方法进行初始化。

Servlet 调用 service() 方法来处理客户端的请求。

Servlet 通过调用 destroy() 方法终止(结束)。

最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

13、SpringMVC的流程?

答案:

(1)用户发送请求至前端控制器DispatcherServlet;

(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器, 请求获取Handle;

(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器 拦截器(如果有则生成)一并返回给DispatcherServlet;

(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;

(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制 器);

(6)Handler执行完成返回ModelAndView;

(7)HandlerAdapter将Handler执行结果ModelAndView返回给 DispatcherServlet;

(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行 解析;

(9)ViewResolver解析后返回具体View;

(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图 中)

(11)DispatcherServlet响应用户。

14,Eureka和zookeeper的区别?

答案:

① 做分布式下的服务发现还是使用eureka更好,也就是AP特性的分布式协调工具(zookeeper因为网络故障就无法返回可用的主机)

② zookeeper技术更加成熟,资料更多

③ Eureka。是spring cloud之下一个专门负责微服务服务注册和发现的组件,Eureka就是为了服务发现而设计的

④ Zookeeper。是用来保证分布式一致性的一个软件。不是为了服务发现注册而设计的,只不过它的特性也可以被二次开发成服务发现注册中心罢了。

15,String、StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?

String是字符串常量,StringBuffer和StringBuilder是字符串变量。StringBuffer是线程安全的,StringBuilder是非线程安全的。具体来说String是一个不可变的对象,每次修改String对象实际上是创新新对象,并将引用指向新对象。效率很低。StringBuffer 是可变的,即每次修改只是针对其本身,大部分情况下比String效率高,StringBuffer保证同步(synchronized),所以线程安全。StringBuilder没有实现同步,所以非线程安全。但效率应该比StringBuffer高。StringBuffer使用时最好指定容量,这样会比不指定容量快30%-40%,甚至比不指定容量的StringBuilder还快。

16,HashMap与HashSet有何区别?

答案:如图所示

Java中级工程师面试题整理,拿到心仪企业的offer必要下狠心_第2张图片

17,Tomcat,apache,jboss的区别?

答案:Tomcat是servlet容器,用于解析jsp,servlet。是一个轻量级的高效的容器;缺点是不支持EJB,只能用于Java应用。

Apache是http服务器(web服务器),类似于IIS可以用来建立虚拟站点,编译处理静态页面。支持SSL技术,支持多个虚拟主机等功能。

Jboss是应用服务器,运行EJB的javaee应用服务器,遵循javaee规范,能够提供更多平台的支持和更多集成功能,如数据库连接,JCA等。其对servlet的支持是通过集成其他servlet容器来实现的。如tomcat。

18,Get与post的区别?

答案:get是从服务器上获取数据,post是向服务器发送数据。

get是把参数数据队列加到提交表单的action属性所指的URL中,值和表单内各个字段一一对应,在url中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在htmlheader内一起传送到action属性所指的url地址。

对于get方式,服务区端用request.QueryString获取变量值,对于post方式,服务器端用request.Form获取提交的数据。get传送的数据量较小,post较大,一般不受限制。get安全性比post要低,但执行效率较高。

18,数据库性能优化有哪些方式?

答案:

SQL 优化:

尽量避免使用 SELECT *;

只查询一条记录时使用 limit 1;

使用连接查询代替子查询;

尽量使用一些能通过索引查询的关键字。

表结构优化:

尽量使用数字类型字段,提高比对效率;

长度不变且对查询速度要求高的数据可以考虑使用 char,否则使用 varchar;

表中字段过多时可以适当的进行垂直分割,将部分字段移动到另外一 张表;

表中数据量过大可以适当的进行水平分割,将部分数据移动到另外一张 表。

其它优化:

对查询频率高的字段适当的建立索引,提高效率;

根据表的用途使用合适 的数据库引擎;

读写分离。

19,redirect、forward区别?

答案:

redirect:服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。所以地址栏显示是新的url。forward是指服务器请求资源,直接访问目标地址url,把响应的内容读取过来并再发送给浏览器,浏览器并不知道资源从哪里来,所以地址栏不变。

redirect不能共享数据,forward转发页面和转发到页面可以贡献request中的数据。redirect用于注销,forward用于登陆。forward效率高于redirect。

20,熔断是什么,用来处理什么问题的?

熔断机制就是应对微服务雪崩效应的一种链路保护机制,就是当我们某个微服务忽然不可用或者响应时间过长的时候,就会进行服务降级,熔断该节点的服务调用,然后响应错误信息,等到检测这个应用响应正常的时候,再恢复这个链路。SpringCloud中的熔断是通过Hystrix实现的,它会监测服务的调用状况,

当失败到达一定阈值的时候,就会启动熔断,熔断机制的注解就是加一个注解,@hystrixCommand。

21,消息队列是干什么的,举一个实际应用场景?

消息队列MQ就是一个保存消息的容器,另外它也是一个高性能的中间件。

实际场景的话当我们用户注册后要初始化好多操作,比如调用邮箱服务发邮件,调用促销活动发优惠券,这时候我们就可以把监听服务交给MQ,当用户注册成功之后,就通知MQ让其他服务开始操作,确保能保证用户的性能。

还有更多相关内容,关注本站消息即可了解。

你可能感兴趣的:(java面试,java,面试,spring,架构师,java编程)